<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.4.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-cde-13" category="bcp" consensus="true" submissionType="IETF" updates="8949" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.1 -->
  <front>
    <title abbrev="CBOR CDE">CBOR Common Deterministic Encoding (CDE)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-13"/>
    <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="October" day="14"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <abstract>
      <?line 90?>

<t>CBOR (STD 94, RFC 8949) defines the concept of "Deterministically
Encoded CBOR" in its Section 4.2, determining one specific way to
encode each particular CBOR value.
This definition is instantiated by "core requirements", providing
some flexibility for application specific decisions; this makes it
harder than necessary to offer Deterministic Encoding as a
selectable feature of generic CBOR encoders.</t>
      <t>The present specification documents the Best Current Practice for CBOR
<em>Common Deterministic Encoding</em> (CDE), which can be shared by a
large set of applications with potentially diverging detailed
application requirements.</t>
      <t>The document also discusses the desire for partial
implementations, which can be another reason for constraining CBOR
encoders, and singles out the encoding constraint
"<tt>definite-length-only</tt>" as a likely constraint to be used in
application protocol and media type definitions.</t>
      <t>This specification updates RFC 8949 in that it provides
clarifications and definitions of additional terms as well as more
examples and explanatory text; it does not make technical changes
to RFC 8949.</t>
      <t><cref anchor="status">This revision -13 merges all active pull requests in
preparation for the 2025-cbor-17 interim on 2025-10-15.</cref></t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-cbor-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 127?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>CBOR (STD 94, RFC 8949) defines the concept of "Deterministically
Encoded CBOR" in its Section 4.2, determining one specific way to
encode each particular CBOR value.
This definition is instantiated by "core requirements", providing
some flexibility for application specific decisions; this makes it
harder than necessary to offer Deterministic Encoding as a
selectable feature of generic CBOR encoders.</t>
      <t>The present specification documents the Best Current Practice for CBOR
<em>Common Deterministic Encoding</em> (CDE), which can be shared by a
large set of applications with potentially diverging detailed
application requirements.</t>
      <t>The document also discusses the desire for partial
implementations, which can be another reason for constraining CBOR
encoders, and singles out the encoding constraint
"<tt>definite-length-only</tt>" as a likely constraint to be used in
application protocol and media type definitions.</t>
      <t>This specification updates RFC 8949 in that it provides
clarifications and definitions of additional terms as well as more
examples and explanatory text; it does not make technical changes
to RFC 8949.</t>
      <section anchor="structure-of-this-document">
        <name>Structure of This Document</name>
        <t>After introductory material (this introduction and <xref target="choi"/>), <xref target="dep"/>
defines the CBOR Common Deterministic Encoding (CDE).
<xref target="cddl-support"/> defines Concise Data Definition Language (CDDL) support for indicating the use of CDE.
This is followed by the conventional sections for
<xref format="title" target="seccons"/> (<xref format="counter" target="seccons"/>),
<xref format="title" target="sec-iana"/> (<xref format="counter" target="sec-iana"/>),
and <xref format="title" target="sec-combined-references"/> (<xref format="counter" target="sec-combined-references"/>).</t>
        <t>For use as background material, <xref target="models"/> introduces terminology for
the layering of models used to describe CBOR.</t>
        <t>Instead of giving rise to the definition of application-specific,
non-interoperable variants of CDE, this document identifies
Application-level Deterministic Representation (ALDR) rules as a
concept that is separate from CDE itself (<xref target="aldr"/>) and therefore out of
scope for this document.
ALDR rules are situated at the application-level, i.e., on top of
CDE, and address requirements on deterministic representation of
application data that are specific to an application or a set of
applications.
ALDR rules are routinely provided as part of a specification for a CBOR-based
protocol, or, if needed, can be provided by referencing a shared "ALDR
ruleset" that is defined in a separate document.</t>
        <t>The informative <xref target="impcheck"/> provides brief checklists that implementers
can use to check their CDE implementations.
<xref target="ps"/> provides a checklist for implementing <tt>preferred-serialization</tt>.
<xref target="bs"/> discusses the <tt>definite-length-only</tt> encoding constraint, which
may be used by encoders to hit a sweet spot for maximizing
interoperability with partial (e.g., constrained) CBOR decoder
implementations.
<xref target="cde"/> discusses <tt>lexicographic-map-sorting</tt>, which is added to these
two encoding constraints to arrive at CDE.</t>
        <t><xref target="examples"/> provides a few examples for CBOR data items in CDE
encoding, as well as a few failing examples; <xref target="exa-pref"/> examines
preferred serialization of the number <tt>1</tt> in more detail.
For reference by implementers, <xref target="encode-f16"/> shows an implementation
that attempts to encode a floating point number as "half precision" binary16.</t>
      </section>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The conventions and definitions of <xref target="STD94"/> apply.
<xref target="models"/> provides additional discussion of the terms information
model, data model, and serialization.</t>
        <t>The terms specifically called out for this document fall into four categories:</t>
        <ol spacing="normal" type="1"><li>
            <t>terms defined in Section <xref target="RFC8949" section="1.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> (among others,
Well-Formed, Valid, and Expected);</t>
          </li>
          <li>
            <t>terms defined (or consistently used) in the text of <xref target="RFC8949"/>, but
possibly supplemented with a concise definition here ("<xref target="RFC8949"/>
terms"), such as Preferred Serialization;</t>
          </li>
          <li>
            <t>terms we use in their English/computer science sense ("generic
terms"), for which we may still want to supply a sharpened
definition here, such as Deterministic Encoding;</t>
          </li>
          <li>
            <t>terms specifically defined in this document ("CDE terms"),
such as CDE or Encoding constraint.</t>
          </li>
        </ol>
        <dl newline="true">
          <dt>"CBOR Application" ("application" for short, <xref target="RFC8949"/> term):</dt>
          <dd>
            <t>application that uses CBOR as an
interchange format and uses (often generic) CBOR encoders/decoders to
serialize/ingest the CBOR form of their application data to be
exchanged.</t>
          </dd>
          <dt>"CBOR Protocol" (<xref target="RFC8949"/> term):</dt>
          <dd>
            <t>the protocol that
governs the interchange of data in CBOR format for a specific
application or set of applications.</t>
          </dd>
          <dt>"Representation" (<xref target="RFC8949"/> term):</dt>
          <dd>
            <t>the process, and its result, of building
the representation format out of (information-model level) application
data.</t>
          </dd>
          <dt>"Serialization" (<xref target="RFC8949"/> term):</dt>
          <dd>
            <t>the subset of the representation process, and its
result, that represents ("serializes") a data item at the CBOR generic data model
form into encoded data items.
"Encoding" is often used as a synonym when the focus is on that.
Often involves choosing one of several equivalent encodings (serializations), i.e., providing "variation".</t>
          </dd>
          <dt>"Encoding constraint" (CDE):</dt>
          <dd>
            <t>A rule that governs the choice of one of several otherwise equivalent CBOR encodings for a CBOR data item.
Several encoding constraints can be combined into an encoding
constraint set, which is itself an encoding constraint that requires
that all encoding constraints in the set are met.<br/>
When giving encoding constraints names, this document uses lower-case
words separated by hyphens, rendered in a typewriter font, as in
<tt>lexicographic-map-sorting</tt>.</t>
          </dd>
          <dt>"Preferred serialization" (<xref target="RFC8949"/> term):</dt>
          <dd>
            <t>Defined in Section <xref target="RFC8949" section="4.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> for the basic data model,
Preferred Serialization is one specific set of encoding constraints.
Tag specifications can also define the Preferred Serialization of
the specific tag that are defining (e.g., in Section <xref target="RFC8949" section="3.4.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).
Collectively the encoding constraint is named <tt>preferred-serialization</tt>.</t>
          </dd>
          <dt>"Deterministic encoding" (generic):</dt>
          <dd>
            <t>An encoding process (or, more specifically, encoding constraint) that deterministically always chooses the same encoding for each data item with several encoding choices.
(The term refers both to such a process and a result of a specific such process.)
Note that there can be many rule sets that each can yield
 deterministic encodings; for instance, <xref target="STD94"/> defines elements of a
 legacy deterministic encoding in Section <xref target="RFC8949" section="4.2.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> that is distinct from the one for which requirements are defined in Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
          </dd>
          <dt>"Generic encoder"/"Generic decoder" (<xref target="RFC8949"/> term):</dt>
          <dd>
            <t>Defined in Section <xref target="RFC8949" section="5.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>, a generic CBOR decoder
 can decode all well-formed (Section <xref target="RFC8949" section="1.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>) encoded CBOR data
 items and present the data items to an application.
 Similarly, generic CBOR encoders provide an application interface that allows
 the application to specify any well-formed value to be encoded as a
 CBOR data item, including simple values and tags that are unknown to the
 encoder.</t>
          </dd>
          <dt>"Partial Implementation" (CDE):</dt>
          <dd>
            <t>A decoder or encoder that is not generic, but usually limited to the
needs of specific (a specific set of) applications.</t>
          </dd>
          <dt>"Common Deterministic Encoding" (CDE):</dt>
          <dd>
            <t>The common deterministic encoding process defined in the present
BCP, based on Preferred Serialization and Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.
Out of many potential and actual deterministic encodings, CDE is
<bcp14>RECOMMENDED</bcp14> for implementation and specification where deterministic
encoding is required or desired.</t>
          </dd>
          <dt>"CDE-checking decoder" (CDE):</dt>
          <dd>
            <t>A decoder that checks that the encoding constraints of CDE have been met.
(Note that a decoder can also provide other types of checks, such
validity-checking and duplicate-checking (<xref target="RFC8949"/>); just speaking
of "checking decoders" without further qualification can therefore
be imprecise.)
Note that an encoder can meet a set of encoding constraints without
the CBOR decoder then checking them (or even being aware of the
constraints or that they have been used).
Certain benefits of specific encoding constraints may only be
available in conjunction with decoders checking those constraints.</t>
          </dd>
          <dt>Bignum (<xref target="RFC8949"/> term):</dt>
          <dd>
            <t>An integer that is represented using CBOR tag 2 or tag 3.
(Not called Bigint as that term may be in use for a platform representation.)</t>
          </dd>
          <dt>NaN payload (<xref target="IEEE754"/>):</dt>
          <dd>
            <t>All but the first bit (Q-bit) of the trailing significand component
of the <xref target="IEEE754"/> value for a NaN.
Separate from sign bit and Q-bit.</t>
          </dd>
          <dt>Trivial NaN (CDE):</dt>
          <dd>
            <t>A NaN with a zero sign bit, and a payload composed of zero bits only.
Note that in <xref target="IEEE754"/>, all-zero payload implies that the Q-bit is
set to one.
Represented in CDE as the three bytes 0xf97e00.</t>
          </dd>
        </dl>
        <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 that is well-formed CBOR.
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.
Determining whether encoding constraints are needed and, if yes,
choosing the right encoding constraints can be 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>The default choice of course is not to employ any encoding constraints at all.
The name <tt>well-formed</tt> is a good name for the empty set of encoding
constraints, as well-formed CBOR is the baseline that is required for
any interoperability.
Many CBOR applications have no need for encoding constraints and
therefore have no requirement beyond <tt>well-formed</tt> encoding.</t>
      <t>Still, an encoder has to make a decision at some point, even if it
could use any well-formed CBOR encoding.
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 a useful guideline for generic encoders, and it
is a good choice for specialized encoders 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
(<tt>shortest-head</tt> encoding constraint).
In addition, tag definitions can specify a preferred serialization for
a tag (Section <xref target="RFC8949" section="3.4" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>); the <tt>shortest-head</tt> encoding
constraint together with the preferred serializations of tags
constitute the <tt>preferred-serialization</tt> encoding constraint.
Typically, this encoding constraint is relevant only for the encoder,
as there is nothing to be gained by enforcing it by itself in a
decoder, which will instead accept all well-formed CBOR.</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 (<tt>definite-length-encoding</tt> encoding constraint),
which enables the use of <em>partial implementations</em> that do not support
decoding indefinite length encoding.
In contrast to <tt>preferred-serialization</tt>, relying on this constraint
enforces the choice at the decoder, we therefore speak about an
<em>interoperability constraint</em>.</t>
      <t>Combining <tt>preferred-serialization</tt> with <tt>definite-length-encoding</tt>
still allows some variation.
Specifically, there is more than one serialization for data items that
contain maps that have more than one entry:
The order of serialization of map entries in a map is not significant
in CBOR (the same as in JSON), so maps with more than one entry have all
permutations of these entries as valid serializations.</t>
      <t>The encoding constraint <tt>lexicographic-map-sorting</tt>
defines a common order for the entries in a map, requiring
lexicographic ordering for the representations of the map keys.
For many applications, ensuring this common order is an additional
onus on the generator that is not actually needed, so they do not
choose to apply this encoding constraint.
However, there are several use cases for Deterministic Serialization
(further discussed in <xref section="2" sectionFormat="of" target="I-D.bormann-cbor-det"/>), and
if the objective is minimal effort for the consuming
application, deterministic map ordering can be useful even outside
those use cases.
For most of these use cases, the benefits of the encoding constraints
for deterministic serialization not only require the encoder to follow
them, but also need the constraints to be enforced ("checked") by the
decoder.
We speak of "checking decoders", which also turn the encoding
constraints into interoperability constraints.</t>
      <t><xref target="tab-constraints"/> summarizes the sets of encoding choices that have
been given names in this section.</t>
      <?v3xml2rfc table_borders="full" ?>

<table anchor="tab-constraints">
        <name>Constraints on the Serialization of CBOR</name>
        <thead>
          <tr>
            <th align="left">Encoding Constraint</th>
            <th align="left">Interoperability Constraint?</th>
            <th align="left">Applications</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>well-formed</tt> (no constraints)</td>
            <td align="left"> </td>
            <td align="left"> </td>
          </tr>
          <tr>
            <td align="left">
              <tt>preferred-serialization</tt></td>
            <td align="left">typically no (encoding guideline only)</td>
            <td align="left">most</td>
          </tr>
          <tr>
            <td align="left">
              <tt>definite-length-encoding</tt></td>
            <td align="left">often yes (enabling partial implementations in the decoder)</td>
            <td align="left">many</td>
          </tr>
          <tr>
            <td align="left">
              <tt>lexicographic-map-sorting</tt></td>
            <td align="left">an interoperability constraint specifically for <em>Common Deterministic Encoding</em> (CDE)</td>
            <td align="left">specific</td>
          </tr>
          <tr>
            <td align="left">
              <tt>cde</tt></td>
            <td align="left">the combination of <tt>preferred-serialization</tt>, <tt>definite-length-encoding</tt> and <tt>lexicographic-map-sorting</tt> as interoperability constraints to obtain CDE</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 facilitate processing at the recipient.</t>
    </section>
    <section anchor="dep">
      <name>CBOR Common Deterministic Encoding (CDE)</name>
      <t>This specification documents the <em>CBOR Common Deterministic Encoding</em>
(CDE) Best Current Practice that is
based on the <em>Core Deterministic Encoding
Requirements</em> defined for CBOR in
Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
      <t>Note that, for <xref target="RFC8949"/>, 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, deterministic encoding is not used
at all, as its restriction of choices can create some additional
performance cost and code complexity.</t>
      <t><xref target="STD94"/>'s "Core Deterministic Encoding Requirements" are designed to
provide well-understood and
easy-to-implement rules while maximizing coverage, i.e., the subset of
CBOR data items that are fully specified by these rules, and also
placing minimal burden on implementations.</t>
      <t>Formally, Common Deterministic Encoding (CDE) is an encoding
constraint (named <tt>cde</tt> for short), built from multiple constituent encoding
constraints (which may, in turn, be built from multiple constituent
encoding constraints).
As discussed in <xref target="choi"/>, CDE combines the constraints of
<tt>preferred-serialization</tt> with <tt>definite-length-only</tt> and the
<tt>lexicographic-map-sorting</tt> constraint.</t>
      <aside>
        <t>While many CBOR encoder implementations do set out to provide Preferred
Serialization, there is less of a practical requirement to fully
conform, as generic CBOR decoders do not normally check for Preferred
Serialization.
In contrast, an application that relies on deterministic representation,
during ingestion of an encoded CBOR data item will often need to
employ a "CDE-checking decoder", i.e., a CBOR decoder configured to
also check that all CDE encoding constraints are satisfied (see also
<xref target="impcheck"/>).
Here, small deviations from CDE, including deviations from
<tt>preferred-serialization</tt>, turn into interoperability problems; hence
the additional attention of the present document on these constraints.</t>
      </aside>
      <t>The remaining section discusses the three constituent encoding
constraints from which <tt>cde</tt> is defined.</t>
      <section anchor="psconstr">
        <name>The <tt>preferred-serialization</tt> Constraint</name>
        <t>The <tt>preferred-serialization</tt> encoding constraint is a combination of the
<tt>shortest-head</tt> constraint and tag-specific encoding constraints
defined to be part of <tt>preferred-serialization</tt>.</t>
        <t>The <tt>shortest-head</tt> constraint is somewhat trivial (see <xref target="exa-pref"/> for
examples), except for two fine points having to do with the numeric
systems underlying CBOR.</t>
        <section anchor="shortest-head-and-integer-serialization">
          <name><tt>shortest-head</tt> and Integer Serialization</name>
          <t>Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> picks up on the interaction of extensibility
(CBOR tags) and deterministic encoding.
CBOR itself uses some tags to increase the range of its basic
generic data types.
Specifically, tags 2/3 extend the range of basic major types 0/1 in a
seamless way.
Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> recommends handling this transition the same
way as with the transition between different integer representation
lengths in the basic generic data model, i.e., by mandating the
Preferred Serialization for all integers (Section <xref target="RFC8949" section="3.4.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>; see also <xref target="exa-int"/> and <xref target="exa-pref"/>).</t>
          <t>By adopting the encoding constraints from Preferred Serialization, CDE
turns this recommendation into a mandate: Integers that can be
represented by basic major type 0 and 1 <bcp14>MUST</bcp14> be encoded using the (<tt>shortest-head</tt>)
deterministic encoding defined for them, and integers outside this
range <bcp14>MUST</bcp14> be 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>
          <aside>
            <t>Not only for numbers, most tags capture more specific application
semantics than tag 2/3 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.<br/>
As CDE would continually
need to address additional issues raised by the registration of new
tags, this specification recommends that new tag registrations address
deterministic encoding in the context of CDE.
Note that not in all cases the tag's deterministic encoding constraints
will be confined to its definition of Preferred Serialization.</t>
          </aside>
        </section>
        <section anchor="shortest-head-and-ieee754-floating-point">
          <name><tt>shortest-head</tt> and <xref target="IEEE754"/> Floating Point</name>
          <t>A particularly difficult field to obtain deterministic encoding for is
floating point numbers, partially because they themselves are often
obtained from processes that are not entirely deterministic between platforms.
See <xref section="3.2.2" sectionFormat="of" target="I-D.bormann-cbor-det"/> for more details.
Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> presents a number of choices that need to
be made to obtain deterministic representation, some of which are
application-level choices.
To obtain the CBOR Common Deterministic Encoding (CDE), this
specification entirely recurs to the <tt>shortest-head</tt> component of
Preferred Serialization and does <em>not</em> itself define any additional
constraints.</t>
          <t>Similar to the <tt>shortest-head</tt> constraint for major types 0 to 6,
floating point values are represented with the shortest head (Section <xref target="RFC8949" section="3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>) that preserves the value of the data item.
This means that the application has no control over the representation
size, e.g., the number 1.0 will always be serialized as a binary16 floating
point number (0xf93c00) as that is the shortest representation that
preserves the value.
It also means that generic decoders often will expand floating point
numbers to a single size that is convenient on the platform (such as
binary64).</t>
          <t>The rest of this section responds to a perceived need to clarify some of the
Preferred Serialization constraints for floating point values.
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 (-0.0) 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 in Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).</t>
            </li>
            <li>
              <t>Apart from finite and infinite numbers, <xref target="IEEE754"/> floating point
values include NaN (not a number) values <xref target="I-D.bormann-cbor-numbers"/>.
In CDE, there is no special handling of NaN values, except a
clarification that the
Preferred Serialization rules also apply to NaNs (with zero or
non-zero payloads), using the encoding of NaNs as defined
in Section 6.2.1 of <xref target="IEEE754"/>.
Note that <xref target="IEEE754"/> leaves several details about handling NaNs
implementation-defined; CBOR makes several decisions here:
Specifically, 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"/>; see also the aside below).
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 significand bit of 0.  </t>
              <t>
Typically, most applications that employ NaNs in their storage and
communication interfaces will only use a single NaN value: quiet,
non-negative NaN with a payload of all zero bits.
This value 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.<br/>
(A new tag definition might define Preferred Serializations that
are basic major-type 7 floating point values; this is
unproblematic as long as the tag definition does not attempt to
redefine the Preferred Serialization for basic floating point values.)</t>
            </li>
          </ol>
          <t>The main intent here is to preserve the basic generic data model, so
applications (in their ALDR rules or by referencing a separate ALDR
ruleset document, see
<xref target="aldr"/>) can
make their own decisions within that data model.
E.g., an application's ALDR rules can decide that it only ever allows a
single NaN value that would be encoded as 0xf97e00, so a CDE
implementation focusing on this application would not even need to
provide processing for other NaN values.
Basing the definition of both CDE and ALDR rules on the
generic data model of CBOR also means that there is no effect on the
Concise Data Definition Language (CDDL)
<xref target="RFC8610"/>, except where the data description is documenting specific
encoding decisions for byte strings that carry embedded CBOR (see
<xref target="cddl-support"/>).</t>
          <aside>
            <t>Section 9.7 of <xref target="IEEE754"/> specifies an implementation-defined
programming interface for accessing non-zero NaN payloads, the
getpayload/setpayload functions.
(A version of these, with separate sets of functions for each
representation size, is also included in the revision of the C
language that is most recent at the time of writing <xref target="C23"/>.)
When using these functions, it is important to be aware that their effects are
specific to the representation size of the floating point values they
are applied to (e.g., half, single, or double precision).
The representation size for interchange will be chosen by Preferred
Serialization for each value, which may not always be the size that
was intended for the use of getpayload/setpayload.
A good way to handle this diversity is, upon decoding, to widen the
representation size of all NaNs to a common size, often double
precision (<xref target="IEEE754"/> binary64), before applying getpayload/setpayload.
The inverse to the narrowing performed by preferred serialization,
this widening operation successively adds the necessary one bits to
the exponent and trailing zero bits to the payload to build the next
longer form until the desired size for the NaN has been reached.</t>
          </aside>
        </section>
      </section>
      <section anchor="the-definite-length-only-encoding-constraint">
        <name>The <tt>definite-length-only</tt> Encoding Constraint</name>
        <t>The <tt>definite-length-only</tt> encoding constraint means that indefinite
length encoding <bcp14>MUST NOT</bcp14> be used.
In many encoders, the use of indefinite length encoding is controlled
by its configuration and can simply be switched off.</t>
        <aside>
          <t>Indefinite length strings require non-trivial implementation effort when a with zero allocation/zero copy approach is in use.
Therefore, there can be a strong argument to not include them in a partial implementation.
Application protocols may cater to this argument by specifying the encoding constraint <tt>definite-length-only</tt>.</t>
        </aside>
      </section>
      <section anchor="the-lexicographic-map-sorting-encoding-constraint">
        <name>The <tt>lexicographic-map-sorting</tt> Encoding Constraint</name>
        <t>In line with Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>, the third constituent
of CDE is the constraint to sort map entries bytewise
lexicographically by their map keys.</t>
        <aside>
          <t>In some implementations, where platform representations of maps
preserve ordering, <tt>lexicographic-map-sorting</tt> can be achieved using a
generic CBOR encoder by pre-ordering all maps to be encoded, as long
as that generic encoder also preserves the ordering in maps.
In implementations without these properties, a specialized CBOR
encoder may need to be employed.</t>
        </aside>
        <t>Specifically, for <tt>lexicographic-map-sorting</tt> the (CDE-encoded) map
key of a map entry <bcp14>MUST</bcp14> be lexicographically strictly greater than
that of the map entry immediately preceding it in the encoding of the
map, if any.
(Note that this constraint is trivially satisfied by data items that
do not contain maps or only contain maps that have zero or one map
entry.)
The bytewise lexicographic comparison steps in parallel through the
bytes of the two encoded map keys, comparing the (unsigned integer
values of the) bytes.
If the bytes differ, the difference determines the outcome of the comparison.
If the bytes are the same, the next pair of bytes are examined.
If there is no such next pair, the comparison and thus CDE
serialization fails entirely (the map keys of the two map entries are
the same, which is not valid in a CBOR map, or one is an extension of
the other, which is not possible in the self-delimiting CBOR
encoding).
See the last bullet of Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> for examples
and additional explanation.</t>
        <aside>
          <t>RFC 8949 has a validity requirement that maps cannot contain multiple
entries with the same key (“no duplicate keys”, Sections <xref target="RFC8949" section="5.3.1" sectionFormat="bare"/> and <xref target="RFC8949" section="5.6" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).
This is only a validity requirement as enforcing this requires the
encoder to be aware of all map keys at the same time, which may be
particularly difficult to implement for streaming encoders.
The <tt>lexicographic-map-sorting</tt> encoding constraint does require such
awareness already as a prerequisite to sorting the entries by map key.
In combination with the other CDE encoding constraints
<tt>preferred-serialization</tt> and <tt>definite-length-only</tt>, the check
therefore becomes trivial: multiple entries with the same
map key would have the same (deterministic) map key serialization and
would therefore be consecutive when sorted.
Given this opportunity, the <tt>lexicographic-map-sorting</tt> encoding constraint
therefore is
deliberately phrased to require consecutive entries to have strictly
increasing map keys; with the other CDE encoding constraints, this prevents
encoding multiple entries that have
the same key.
Note that Section <xref target="RFC8949" section="5.6.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> lists one specific case
"(specifically, -0.0 is equal to 0.0)" where two different keys are
considered equivalent for the purpose of duplicate map keys; this
needs to be checked with extra code for a full validity checker.</t>
        </aside>
      </section>
    </section>
    <section anchor="cddl-support">
      <name>CDDL support</name>
      <t>CDDL defines the structure of CBOR data items at the data model level;
it enables being specific about the data items allowed in a particular
place.
It does not specify encoding; CBOR protocols can specify the use
of CDE (or simply <tt>definite-length-only</tt> encoding) independent of the
CDDL data model.</t>
      <t>CDDL operates by restricting the set of data-model level data items.
E.g., CDDL 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 Preferred 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.
<cref anchor="nodlo">Note that there is no <tt>.dlo</tt> or <tt>.dloseq</tt> for
<tt>definite-length-only</tt>, as, so far, a requirement for these hasn't
been detected.</cref></t>
      <t>For example, a byte string of embedded CBOR that is to be encoded
according to CDE can be formalized as:</t>
      <artwork><![CDATA[
leaf = #6.24(bytes .cde any)
]]></artwork>
      <t>More importantly, if the encoded data item also needs to have a
specific structure, this can be expressed by the right-hand side
(instead of using the most general CDDL type <tt>any</tt> here).</t>
      <t>(Note that the <tt>.cdeseq</tt> control operator does not enable specifying
different deterministic encoding requirements for the elements of the
sequence.  If a use case for such a feature becomes known, it could be
added, or the CBOR sequence could be constructed with <tt>.join</tt> (<xref section="3.1" sectionFormat="of" target="RFC9741"/>).)</t>
      <t>Obviously, specifications that document ALDR rules can define related control operators
that also embody the processing required by those ALDR rules,
and are encouraged to do so.</t>
    </section>
    <section anchor="seccons">
      <name>Security Considerations</name>
      <t>The security considerations in Section <xref target="RFC8949" section="10" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> apply.
The use of deterministic encoding can mitigate issues arising out of
the use of non-preferred serializations specially crafted by an attacker.
However, this effect only accrues if the decoder actually checks that
deterministic encoding was applied correctly.
More generally, additional security properties of deterministic
encoding can rely on this check being performed properly.</t>
    </section>
    <section anchor="sec-iana">
      <name>IANA Considerations</name>
      <t><cref anchor="to-be-removed">RFC Editor: please replace RFCXXXX with the RFC
number of this RFC and remove this note.</cref></t>
      <t>This document requests IANA to register the contents of
<xref target="tbl-iana-reqs"/> into the registry
"<xref section="CDDL Control Operators" relative="#cddl-control-operators" sectionFormat="bare" target="IANA.cddl"/>" of the
<xref target="IANA.cddl"/> registry group:</t>
      <?v3xml2rfc table_borders="light" ?>

<table anchor="tbl-iana-reqs">
        <name>New control operators to be registered</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">.cde</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.cdeseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94">
          <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
            <front>
              <title>Concise Binary Object Representation (CBOR)</title>
              <author fullname="C. Bormann" initials="C." surname="Bormann"/>
              <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
              <date month="December" year="2020"/>
              <abstract>
                <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
                <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="94"/>
            <seriesInfo name="RFC" value="8949"/>
            <seriesInfo name="DOI" value="10.17487/RFC8949"/>
          </reference>
        </referencegroup>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="IANA.cddl" target="https://www.iana.org/assignments/cddl">
          <front>
            <title>Concise Data Definition Language (CDDL)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
          <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
            <front>
              <title>Key words for use in RFCs to Indicate Requirement Levels</title>
              <author fullname="S. Bradner" initials="S." surname="Bradner"/>
              <date month="March" year="1997"/>
              <abstract>
                <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
          </reference>
          <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
            <front>
              <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
              <author fullname="B. Leiba" initials="B." surname="Leiba"/>
              <date month="May" year="2017"/>
              <abstract>
                <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
          </reference>
        </referencegroup>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-cbor-edn-literals">
          <front>
            <title>CBOR Extended Diagnostic Notation (EDN)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="7" month="July" 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 -18
   // corrects a few omissions from -17; it is not intended to make
   // technical changes from -17.  It is intended for use as an input
   // document for the CBOR WG meeting at IETF 123.

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

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

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


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

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

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

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

<table anchor="tab-example-int">
          <name>CDE: 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 bignum</td>
            </tr>
            <tr>
              <td align="left">-18446744073709551617</td>
              <td align="left">c349010000000000000000</td>
              <td align="left">Largest negative bignum</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="exa-flt">
        <name>CDE: Floating Point Value Examples</name>
        <?v3xml2rfc table_borders="light" ?>

<table anchor="tab-example-flt">
          <name>CDE: 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 with zero payload (see further down for more NaN examples)</td>
            </tr>
            <tr>
              <td align="left">5.960464477539063e-8</td>
              <td align="left">f90001</td>
              <td align="left">Smallest positive f16 (subnormal)</td>
            </tr>
            <tr>
              <td align="left">0.00006097555160522461</td>
              <td align="left">f903ff</td>
              <td align="left">Largest positive subnormal f16</td>
            </tr>
            <tr>
              <td align="left">0.00006103515625</td>
              <td align="left">f90400</td>
              <td align="left">Smallest non-subnormal positive f16</td>
            </tr>
            <tr>
              <td align="left">65504.0</td>
              <td align="left">f97bff</td>
              <td align="left">Largest positive f16</td>
            </tr>
            <tr>
              <td align="left">1.401298464324817e-45</td>
              <td align="left">fa00000001</td>
              <td align="left">Smallest positive f32 (subnormal)</td>
            </tr>
            <tr>
              <td align="left">1.1754942106924411e-38</td>
              <td align="left">fa007fffff</td>
              <td align="left">Largest positive subnormal f32</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222875e-38</td>
              <td align="left">fa00800000</td>
              <td align="left">Smallest non-subnormal positive f32</td>
            </tr>
            <tr>
              <td align="left">3.4028234663852886e+38</td>
              <td align="left">fa7f7fffff</td>
              <td align="left">Largest positive f32</td>
            </tr>
            <tr>
              <td align="left">5.0e-324</td>
              <td align="left">fb0000000000000001</td>
              <td align="left">Smallest positive f64 (subnormal)</td>
            </tr>
            <tr>
              <td align="left">2.225073858507201e-308</td>
              <td align="left">fb000fffffffffffff</td>
              <td align="left">Largest positive subnormal f64</td>
            </tr>
            <tr>
              <td align="left">2.2250738585072014e-308</td>
              <td align="left">fb0010000000000000</td>
              <td align="left">Smallest non-subnormal positive f64</td>
            </tr>
            <tr>
              <td align="left">1.7976931348623157e+308</td>
              <td align="left">fb7fefffffffffffff</td>
              <td align="left">Largest positive f64</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 f16</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539062e-8</td>
              <td align="left">fbbe6fffffffffffff</td>
              <td align="left">Adjacent to largest negative subnormal f16</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 f16</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 f16</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 f16</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 f32</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 f32</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 f32</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 f32</td>
            </tr>
            <tr>
              <td align="left">3.402823466385289e+38</td>
              <td align="left">fb47efffffe0000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">float'7e01'</td>
              <td align="left">f97e01</td>
              <td align="left">f16 qNaN with non-zero payload</td>
            </tr>
            <tr>
              <td align="left">float'7f800001'</td>
              <td align="left">fa7f800001</td>
              <td align="left">f32 sNan with payload of rightmost bit set -- no shorter encoding</td>
            </tr>
            <tr>
              <td align="left">float'7fbfe000'</td>
              <td align="left">f97dff</td>
              <td align="left">f32 sNaN with 9 bit payload -- shortens to f16</td>
            </tr>
            <tr>
              <td align="left">float'7fbff000'</td>
              <td align="left">fa7fbff000</td>
              <td align="left">f32 sNaN with 10 bit payload -- no shorter encoding</td>
            </tr>
            <tr>
              <td align="left">float'7fc00000'</td>
              <td align="left">f97e00</td>
              <td align="left">f32 qNaN with zero payload -- shortens to f16</td>
            </tr>
            <tr>
              <td align="left">float'7ff0000000000001'</td>
              <td align="left">fb7ff0000000000001</td>
              <td align="left">f64 sNaN with payload of rightmost bit set -- no shorter encoding</td>
            </tr>
            <tr>
              <td align="left">float'7ff00000000003ff'</td>
              <td align="left">fb7ff00000000003ff</td>
              <td align="left">f64 sNaN with 10 rightmost payload bits set -- no shorter encoding</td>
            </tr>
            <tr>
              <td align="left">float'7ff0000020000000'</td>
              <td align="left">fa7f800001</td>
              <td align="left">f64 sNaN with 23rd leftmost payload bit set -- shortens to f32</td>
            </tr>
            <tr>
              <td align="left">float'7ff43d7c40000000'</td>
              <td align="left">fa7fa1ebe2</td>
              <td align="left">f64 sNaN with randomly chosen bit pattern -- shortens to f32</td>
            </tr>
            <tr>
              <td align="left">float'7ff7fffff0000000'</td>
              <td align="left">fb7ff7fffff0000000</td>
              <td align="left">f64 sNaN with 23 leftmost payload bits set -- no shorter encoding</td>
            </tr>
            <tr>
              <td align="left">float'7ff8000000000000'</td>
              <td align="left">f97e00</td>
              <td align="left">f64 qNaN -- shortens to f16</td>
            </tr>
            <tr>
              <td align="left">float'7fffe000'</td>
              <td align="left">f97fff</td>
              <td align="left">f32 qNaN with 9 bit payload -- shortens to f16</td>
            </tr>
            <tr>
              <td align="left">float'7ffff000'</td>
              <td align="left">fa7ffff000</td>
              <td align="left">f32 qNaN with 10 bit payload -- no shorter encoding</td>
            </tr>
            <tr>
              <td align="left">float'7ffffc0000000000'</td>
              <td align="left">f97fff</td>
              <td align="left">f64 qNaN with 9 leftmost payload bits set -- shortens to f16</td>
            </tr>
            <tr>
              <td align="left">float'7fffffffe0000000'</td>
              <td align="left">fa7fffffff</td>
              <td align="left">f64 qNaN with 22 leftmost payload bits set -- shortens to f32</td>
            </tr>
            <tr>
              <td align="left">float'7fffffffffffffff'</td>
              <td align="left">fb7fffffffffffffff</td>
              <td align="left">f64 qNaN with all bits set -- no shorter encoding</td>
            </tr>
            <tr>
              <td align="left">float'fe00'</td>
              <td align="left">f9fe00</td>
              <td align="left">negative NaN with zero payload</td>
            </tr>
            <tr>
              <td align="left">float'fff0000000000001'</td>
              <td align="left">fbfff0000000000001</td>
              <td align="left">f64 negative sNaN with payload of rightmost bit set -- no shorter encoding</td>
            </tr>
            <tr>
              <td align="left">float'fff8000000000000'</td>
              <td align="left">f9fe00</td>
              <td align="left">f64 negative qNaN with zero payload -- shortens to f16</td>
            </tr>
            <tr>
              <td align="left">float'ffffffffe0000000'</td>
              <td align="left">faffffffff</td>
              <td align="left">f64 negative qNaN with 22 leftmost payload bits set -- shortens to f32</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="exa-bad">
        <name>Failing Examples: Not CDE</name>
        <?v3xml2rfc table_borders="light" ?>

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

<table anchor="tbl-ser-1">
        <name>Serializations of integer number 1</name>
        <thead>
          <tr>
            <th align="left">Serialization of integer number 1</th>
            <th align="left">Preferred?</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">0x01</td>
            <td align="left">yes (shortest mt0)</td>
          </tr>
          <tr>
            <td align="left">0x1801, 0x190001, 0x1a00000001, 0x1b0000000000000001</td>
            <td align="left">no (mt0, but not shortest argument)</td>
          </tr>
          <tr>
            <td align="left">0xc24101</td>
            <td align="left">no (could use mt0)</td>
          </tr>
          <tr>
            <td align="left">0xc2420001, 0xc243000001, etc.</td>
            <td align="left">no (could use mt0, uses leading zeros)</td>
          </tr>
          <tr>
            <td align="left">0xc25f41004101ff, and similar</td>
            <td align="left">no (could use mt0, uses leading zeros)</td>
          </tr>
        </tbody>
      </table>
      <t>For the integer number 100000000000000000000 (1 with 20 decimal
zeros), the only serialization that meets the
<tt>preferred-serialization</tt> and <tt>definite-length-only</tt> constraints is:</t>
      <artwork><![CDATA[
C2                       # tag(2)
   49                    # bytes(9)
      056BC75E2D63100000 #
]]></artwork>
      <t>(Note that, in addition to this serialization, there are multiple
serializations that would also count as <em>preferred</em> serializations, as
the preferred serialization constraint by itself does not exclude
indefinite length encoding of the byte string that is the content of
tag 2.)</t>
    </section>
    <section anchor="encode-f16">
      <name>Example Code for Encoding into 16-bit Floating Point</name>
      <t>Appendix <xref target="RFC8949" section="D" sectionFormat="bare">Half-Precision</xref> of RFC 8949 <xref target="STD94"/> provides example C and
Python code for decoding 16-bit ("Half Precision", binary16) floating point
numbers.
Providing this code was considered important at the time to aid in
the creation of generic decoders.</t>
      <t>Given that CDE implementations that support floating point Numbers not
only need to decode, but also to encode their 16-bit format, this
appendix provides example C code to convert a floating point number
that is in 64-bit form ("Double Precision", binary64) into binary16.</t>
      <t>If such a conversion is not possible (i.e., there is no 16-bit
representation for the 64-bit value given), the function
<tt>try_float16_encode</tt> returns <tt>-1</tt>.
Otherwise it returns a two-byte integer (range <tt>0x0000</tt> to <tt>0xFFFF</tt>)
that, prefixed with <tt>0xF9</tt>, is suitable to encode the value.</t>
      <figure anchor="half-encode">
        <name>Example C Code for a Half-Precision Encoder</name>
        <sourcecode type="c"><![CDATA[
/* returns 0..0xFFFF if float16 encoding possible, -1 otherwise.
   b64 is a binary64 floating point as an unsigned long. */
int try_float16_encode(unsigned long b64) {
  unsigned long s16 = b64 >> 48 & 0x8000UL;
  unsigned long mant = b64 & 0xfffffffffffffUL;
  unsigned long exp = b64 >> 52 & 0x7ffUL;
  if (exp == 0 && mant == 0)    /* f64 denorms are out of range */
    return s16;                 /* so handle 0.0 and -0.0 only */
  if (exp >= 999 && exp < 1009) { /* f16 denorm, exp16 = 0 */
    if (mant & ((1UL << (1051 - exp)) - 1))
      return -1;                /* bits lost in f16 denorm */
    return s16 + ((mant + 0x10000000000000UL) >> (1051 - exp));
  }
  if (mant & 0x3ffffffffffUL)   /* bits lost in f16 */
    return -1;
  if (exp >= 1009 && exp <= 1038) /* normalized f16 */
    return s16 + ((exp - 1008) << 10) + (mant >> 42);
  if (exp == 2047)              /* Inf, NaN */
    return s16 + 0x7c00 + (mant >> 42);
  return -1;
}
]]></sourcecode>
      </figure>
    </section>
    <section numbered="false" anchor="list-of-figures">
      <name>List of Figures</name>
      <dl spacing="compact" indent="11">
        <dt><xref target="half-encode"/>:</dt>
        <dd>
          <t><xref format="title" target="half-encode"/></t>
        </dd>
      </dl>
    </section>
    <section numbered="false" anchor="list-of-tables">
      <name>List of Tables</name>
      <dl spacing="compact" indent="11">
        <dt><xref target="tab-constraints"/>:</dt>
        <dd>
          <t><xref format="title" target="tab-constraints"/></t>
        </dd>
        <dt><xref target="tbl-iana-reqs"/>:</dt>
        <dd>
          <t><xref format="title" target="tbl-iana-reqs"/></t>
        </dd>
        <dt><xref target="layers"/>:</dt>
        <dd>
          <t><xref format="title" target="layers"/></t>
        </dd>
        <dt><xref target="tab-example-int"/>:</dt>
        <dd>
          <t><xref format="title" target="tab-example-int"/></t>
        </dd>
        <dt><xref target="tab-example-flt"/>:</dt>
        <dd>
          <t><xref format="title" target="tab-example-flt"/></t>
        </dd>
        <dt><xref target="tab-example-bad"/>:</dt>
        <dd>
          <t><xref format="title" target="tab-example-bad"/></t>
        </dd>
        <dt><xref target="tbl-ser-1"/>:</dt>
        <dd>
          <t><xref format="title" target="tbl-ser-1"/></t>
        </dd>
      </dl>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>An early version of this document was based on the work of <contact fullname="Wolf McNally"/> and <contact fullname="Christopher Allen"/> as documented in <xref target="I-D.mcnally-deterministic-cbor"/>, which
serves as an example for an ALDR ruleset document.
We would like to explicitly acknowledge that this work has
contributed greatly to shaping the concept of a CBOR Common
Deterministic Encoding and the use of ALDR rules/rulesets on top of that.
<contact fullname="Mikolai Gütschow"/> proposed adding <xref target="choi"/>.
<contact fullname="Anders Rundgren"/> provided most of the initial text that turned into
<xref target="examples"/>, <contact fullname="Laurence Lundblade"/> provided examples for "NaN" (not a
number) floating point values.</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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
X5hkyNhGmPizEw/NSORERO9NueXydmKf6AMvq3yZrM13L28iLc8PneSU5uGQ
49s4essrH+TPMuPF6xoXDAubQRd5ysPZPDSkjMdVbdzNqodb2nCJfWoPORk3
x/zUMgXDHCjdmD93i9qfWOUyQJovVJQIv+UZSHSoV/0/C2pvfJK9O2bdV/AH
sxKs6tlsCTNppPQrplUZY9yBT8F00/0CjSiWrflsugCuekPcVAf7i+P5QWOq
hGScdNqeqkjWi/ya+9jmZbpWlECm7fqTEwlf9SeaNb/t2lvnzj4fkjXjbSMj
zcTI+CnU8+/bsr5vP/+2+7YM7tsyuG8//0/ct6XPEZvLta3qcu+F6ScWXxNP
fxOdE02nv2KmJr4E/xy+NNlQY0YEpn8+fmAjAqil4ISTS7tplPdmJ0Fqfmvr
q8Xd/yTKtOxE7KWH2G7K30JuDb7hOTeh3jHFrz/wpt1quQrtVvdapdR89W2S
rXyH4Bk8dOzHF6vVLFn851mt7vZme2fjwV6ydzb5SL8lUxL0p5CKSS6esCFK
3Zjmgq4d4Hj/zweD+PAv9BzpW9PxwfiQ1dYiubUoLG5htq6zlBs5yp45/xQ6
P88otr3PePMei6MzWvv/6KdvxMTI57tqBYs6Zdkp0vray08vRk1wickKn/eW
2efnpC85K7uBwDKIVCbVjGBncO29ja++oNs6wH9I2foCp3u4PKCTO5jiC4Xn
zsi4NsISchnC7sRDbpL9oDamYlW78g2IIDy3sF5BXwCjVftllefvnINSa+Hs
6Okp4S514XqJAlGUEZPBxeQCveq6VySxsH4YwHXcuxh/GE8uXMFnyXNaR3UR
ZI6n9nK3ZSZpbRqkevsBaxbhJKHS0mquCxE4Zrcj4sGiEyTiNtc0lFbdD+nC
aHWnml57iX/gZywu4vMbfbcOswHpSdzx75caG37f9Xv9IJRwAvy9D3XPcIsc
V5cLdl2N+/fMMDkZTwachQqiwH85Sy5/6rJhErx7NK7UdAItcrNZ2km/noFu
7+RX7kNmkNQdOLo/sQeaYWrrZVqhq0+r+ejzZxiIh98nfGrux6hMOsbYyXI5
sAx1lNT7FXvYNQMTmtkKwWHICBcSE6BX2YVfoDXfatBA87cmdWfi2Zso7x5b
G4FI1iDxLBzDGN4gvl1IqZLs89/Ugyy49Uhk+tvf/hY9me4A2wMkHvSmnM58
cNr9BLOj3qmmPMfjw6NvnhwfPps+PdqXjccPeBKvHZmUL9F0cAmMyhrdbv3+
Oq6cfRmegoRg8Jly5CYdrxSXeegg8zActXSF+XdxOi/DAO35qjJdLevqG5oZ
cU82hMWW+Fl+VpSgukq9rI6Iczo4J884FAk8Cyl66oKtOKxT440aMhlxKaae
QxIiCfnu7s6NST2Ne5zh9H1ttm6HzNU1y6za6hPOzvn+lrgAAKFLcX0ldRW9
PYwdu7H3iPBoFn1/Rw047sdKc7n6SDw4yksC3LSGgkM5EAqKgBo//Eerd2Vr
PjVuoq0EvlE4BbGYf8jep+s6gLczT7C7Wp3a8CUMma+e5WDJ8F5b4IC9ZnUw
mGYhcWlbJy50wFhezV097KQ7KT0yrKGrYsFeiNbv7Uk+WscBIG+V8cXOAzFL
S00C9Suia4EMlzjfcxGlLnZLdhW1G/Hy0eiCROpDZ5K1Ui3rEBxdVMXt26UE
v70VeF3ERYrcgDK+GELueYX5OHA9q9xPSRAYwlS0J03uIPmM0TSbNkh/f0v/
LqQw9IBvM/cFZYqKX08RaY+yPlllRVQ9ocgiuoguxfPo0UM3/Xg0kqGRNKHL
r++2AWyA+KXcls9B+TNSzDjszI6ieapSfMxFI6zy9eUofvgo4oCBFqx6wYMY
vR/foRRc8HVJi/uKp/766/jgJP4nYo7QA3588bj1LBLa9WE8FujzXc+nHzb1
2IdTfunYHiXg9PiBr+Jx/E//pIPTBxYMCJ7QUxcpzOOScAi/GFRuPknaNR4T
mGMTj1tshYagqyb5WhywwIVH8AdfTh7BFvH1VzGcHLQMfPoS7PaUoMXLIADJ
MlDxbMPgGtv8eJ8X/k9xrzf58UX85ZfElMeHk3iIh/t9pJT3ja/paoeT1mJp
Hta1VzmH+3mTtnca/47m4kl/B3EukAh+fNEHrIMlANgfo2Ct4w/7/sn1d6wg
nJqWHUIMQHIgw8f9kz7GseQAxDy1RrEN4KUhhqB3vgTA+/ia1wdEnPYbOEL6
9nG/BbTna5LdoIt2TULIhuiR9rDehj6yXAF5jasO2P0Wic2x1JqpJnHIFS0J
idVE4sIvMqno8W12ie6INPJ2LcQ4hSHj7oxD4ucokLC+hAiwrr7am0Dyu7vz
VvDx41l0Ft/dffll8GUwxRuOjP5VM7RavNosrR8gC0CCzZJ1MizSn/1nw6/x
JHfW8h6xz5HO6UU2hXMGPzSfRsRS59P8Q/NpWIo6n+YfbD8skYd70a8Ytudz
NDpepYtLaYh9d2agJVWRWHeKc3YF+Y0XWo6JK8UPsWSWlByfGftVQ+/u7v6U
r5bRd/OXSJD4SCIUqBJ9/eSqyNCECkrv+YokQv6tHtMqWVohf9XeIy30kXTV
vO+sRDyK/pSqxIt24szV6ib0iQOAn2HFy79KpCtbkZEcQ8u5hCAlKYXlVeJy
Y7QqtpeLKt2Rox2lz63WiWYY1Wt+pCuXfsH5xsoHoxPO3XfZu3yVZPEf/sf/
U5Xzq/zmo0ijUqkRegGXO0UHDOmdc3e+5myOH7brBa18/bGWXhdSjdM1/cw4
y4FTOAQEkowIsYgGcvkKH9Hr5+5FspXiMC9o4NkqwTX1Rk59u9EeUao9SUxP
VK5tiruaYz6K/l85FgHQxRkBAA==

-->

</rfc>
