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

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

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

</section>
    </section>
    <section anchor="choi">
      <name>Encoding Choices in CBOR</name>
      <t>In many cases, CBOR provides more than one way to encode a data item,
i.e., to serialize it into a sequence of bytes.
This flexibility can provide convenience for the generator of the
encoded data item, but handling the resulting variation can also put
an onus on the decoder.
In general, there is no single perfect encoding choice that is optimal for all
applications.
Choosing the right constraints on these encoding choices is one
element of application protocol design.
Having predefined sets of such choices is a useful way to reduce
variation between applications, enabling generic implementations.</t>
      <t>Section <xref target="RFC8949" section="4.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> provides a recommendation for a
<em>Preferred Serialization</em>.
This recommendation is useful for most CBOR applications, and it is a
good choice for most applications.
Its main constraint is to choose the shortest <em>head</em> (Section <xref target="RFC8949" section="3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>) that preserves the value of a data item.</t>
      <t>Preferred Serialization allows indefinite length encoding (Section <xref target="RFC8949" section="3.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>), which does not express the length of a string,
an array, or a map in its head.  Supporting both definite length and
indefinite length encoding is an additional onus on the decoder; many
applications therefore choose not to use indefinite length encoding at
all.
We call Preferred Serialization with this additional constraint
<em>Basic Serialization</em>.
Basic Serialization is a common choice for applications that need to
further reduce the variability that needs to be handled by decoders,
potentially maximizing interoperability with partial (e.g.,
constrained) CBOR decoder implementations.</t>
      <t>These constraints still allow some variation. In particular, there is
more than one serialization for data items that contain maps: The
order of serialization of map entries is ignored in CBOR (as it is in
JSON), so maps with more than one entry have all permutations of these
entries as valid Basic Serializations.
<em>Deterministic Serialization</em> builds on Basic Serialization by
defining a common (namely, lexicographic) order for the entries in a map.
For many applications, ensuring this common order is an additional
onus on the generator that is not actually needed, so they do not
choose Deterministic Serialization.
However, if the objective is minimal effort for the consuming
application, deterministic map ordering can be useful even outside the
main use cases for Deterministic Serialization that are further
discussed in <xref section="2" sectionFormat="of" target="I-D.bormann-cbor-det"/>.</t>
      <t><xref target="tab-constraints"/> summarizes the increasingly restrictive sets of
encoding choices that have been given names in this section.</t>
      <table anchor="tab-constraints">
        <name>Constraints on the Serialization of CBOR</name>
        <thead>
          <tr>
            <th align="left">Set of Encoding Choices</th>
            <th align="left">Most Important Constraint</th>
            <th align="left">Applications</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">preferred</td>
            <td align="left">shortest "head" variant</td>
            <td align="left">most</td>
          </tr>
          <tr>
            <td align="left">basic</td>
            <td align="left">+ definite lengths only</td>
            <td align="left">many</td>
          </tr>
          <tr>
            <td align="left">
              <em>deterministic</em> ("CDE")</td>
            <td align="left">+ common map order</td>
            <td align="left">specific</td>
          </tr>
        </tbody>
      </table>
      <t>Note that the objective to have a deterministic serialization for a
specific application data item can only be fulfilled if the
application itself does not generate multiple different CBOR data
items that represent that same (equivalent) application data item.
We speak of the need for Application-level Deterministic
Representation (ALDR), and we may want to aid achieving this by
the application defining rules for ALDR (see also <xref target="aldr"/>).
Where Deterministic Representation is not actually needed,
application-level representation rules of course can still be useful
to amplify the benefits of Preferred or Basic Serialization.</t>
    </section>
    <section anchor="dep">
      <name>CBOR Common Deterministic Encoding Profile (CDE)</name>
      <t>This specification defines the <em>CBOR Common Deterministic Encoding
Profile</em> (CDE) based on the <em>Core Deterministic Encoding
Requirements</em> defined for CBOR in
Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
      <t>Note that this specific set of requirements is elective — in
principle, other variants of deterministic encoding can be defined
(and have been, now being phased out slowly, as detailed in Section <xref target="RFC8949" section="4.2.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).
In many applications of CBOR today, deterministic encoding is not used
at all, as its restriction of choices can create some additional
performance cost and code complexity.</t>
      <t><xref target="STD94"/>'s core requirements are designed to provide well-understood and
easy-to-implement rules while maximizing coverage, i.e., the subset of
CBOR data items that are fully specified by these rules, and also
placing minimal burden on implementations.</t>
      <t>Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> picks up on the interaction of extensibility
(CBOR tags) and deterministic encoding.
CBOR itself uses some tags to increase the range of its basic
generic data types, e.g., tags 2/3 extend the range of basic major
types 0/1 in a seamless way.
Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> recommends handling this transition the same
way as with the transition between different integer representation
lengths in the basic generic data model, i.e., by mandating the
preferred serialization for all integers (Section <xref target="RFC8949" section="3.4.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).</t>
      <ol spacing="normal" type="1" group="1"><li>
          <t>CDE turns this
recommendation into a mandate: Integers that can be represented by
basic major type 0 and 1 are encoded using the deterministic
encoding defined for them, and integers outside this range are
encoded using the preferred serialization (Section <xref target="RFC8949" section="3.4.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>) of tag 2 and 3 (i.e., no leading zero bytes).</t>
        </li>
      </ol>
      <t>Most tags capture more specific application semantics and therefore
may be harder to define a deterministic encoding for.
While the deterministic encoding of their tag internals is often
covered by the <em>Core Deterministic Encoding Requirements</em>, the mapping
of diverging platform application data types onto the tag contents may
require additional attention to perform it in a deterministic way; see
<xref section="3.2" sectionFormat="of" target="I-D.bormann-cbor-det"/> for
more explanation as well as examples.
As the CDE would continually
need to address additional issues raised by the registration of new
tags, this specification recommends that new tag registrations address
deterministic encoding in the context of CDE.</t>
      <t>A particularly difficult field to obtain deterministic encoding for is
floating point numbers, partially because they themselves are often
obtained from processes that are not entirely deterministic between platforms.
See <xref section="3.2.2" sectionFormat="of" target="I-D.bormann-cbor-det"/> for more details.
Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> presents a number of choices; these need to
be made to obtain the CBOR Common Deterministic Encoding Profile (CDE).
Specifically, CDE specifies (in the order of the bullet list at the end of Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>):</t>
      <ol spacing="normal" type="1" group="1"><li>
          <t>Besides the mandated use of preferred serialization, there is no further
specific action for the two different zero values, e.g., an encoder
that is asked by an application to represent a negative floating
point zero will generate 0xf98000.</t>
        </li>
        <li>
          <t>There is no attempt to mix integers and floating point numbers,
i.e., all floating point values are encoded as the preferred
floating-point representation that accurately represents the value,
independent of whether the floating point value is, mathematically,
an integral value (choice 2 of the second bullet).</t>
        </li>
        <li>
          <t>Apart from finite and infinite numbers, <xref target="IEEE754"/> floating point
values include NaN (not a number) values <xref target="I-D.bormann-cbor-numbers"/>.
In CDE, there is no special handling of NaN values, except that the
preferred serialization rules also apply to NaNs (with zero or
non-zero payloads), using the canonical encoding of NaNs as defined
in Section 6.2.1 of <xref target="IEEE754"/>.
Specifically, this means that shorter forms of encodings for a NaN
are used when that can be achieved by only removing trailing zeros
in the NaN payload (example serializations are available in
<xref section="A.1.2" sectionFormat="of" target="I-D.bormann-cbor-numbers"/>).
Further clarifying a "should"-level statement in Section 6.2.1 of
<xref target="IEEE754"/>, the CBOR encoding always uses a leading bit of 1 in the
significand to encode a quiet NaN; the use of signaling NaNs by
application protocols is <bcp14>NOT RECOMMENDED</bcp14> but when presented by an
application these are encoded by using a leading bit of 0.  </t>
          <t>
Typically, most applications that employ NaNs in their storage and
communication interfaces will only use a single NaN value, quiet NaN with payload 0,
which therefore deterministically encodes as 0xf97e00.</t>
        </li>
        <li>
          <t>There is no special handling of subnormal values.</t>
        </li>
        <li>
          <t>CDE does not presume
equivalence of basic floating point values with floating point
values using other representations (e.g., tag 4/5).
Such equivalences and related deterministic representation rules
can be added at the ALDR level if desired, e.g., by stipulating
additional equivalences and deterministically choosing exactly one
representation for each such equivalence, and by restricting in
general the set of data item values actually used by an
application.</t>
        </li>
      </ol>
      <t>The main intent here is to preserve the basic generic data model, so
applications (in their ALDR rules or by referencing a separate ALDR
ruleset document, see
<xref target="aldr"/>) can
make their own decisions within that data model.
E.g., an application's ALDR rules can decide that it only ever allows a
single NaN value that would be encoded as 0xf97e00, so a CDE
implementation focusing on this application would not need to
provide processing for other NaN values.
Basing the definition of both CDE and ALDR rules on the
generic data model of CBOR also means that there is no effect on the
Concise Data Definition Language (CDDL)
<xref target="RFC8610"/>, except where the data description is documenting specific
encoding decisions for byte strings that carry embedded CBOR.</t>
      <?line 477?>

</section>
    <section anchor="cddl-support">
      <name>CDDL support</name>
      <t>CDDL defines the structure of CBOR data items at the data model level;
it enables being specific about the data items allowed in a particular
place.
It does not specify encoding, but CBOR protocols can specify the use
of CDE (or simply Basic Serialization).
For instance, it allows the specification of a floating point data item
as "float16"; this means the application data model only foresees data
that can be encoded as <xref target="IEEE754"/> binary16.
Note that specifying "float32" for a floating point data item enables
all floating point values that can be represented as binary32; this
includes values that can also be represented as binary16 and that will
be so represented in Basic Serialization.</t>
      <t><xref target="RFC8610"/> defines control operators to indicate that the contents of a
byte string carries a CBOR-encoded data item (<tt>.cbor</tt>) or a sequence of
CBOR-encoded data items (<tt>.cborseq</tt>).</t>
      <t>CDDL specifications may want to specify that the data items should be
encoded in Common CBOR Deterministic Encoding.
The present specification adds two CDDL control operators that can be used
for this.</t>
      <t>The control operators <tt>.cde</tt> and <tt>.cdeseq</tt> are exactly like <tt>.cbor</tt> and
<tt>.cborseq</tt> except that they also require the encoded data item(s) to be
encoded according to CDE.</t>
      <t>For example, a byte string of embedded CBOR that is to be encoded
according to CDE can be formalized as:</t>
      <artwork><![CDATA[
leaf = #6.24(bytes .cde any)
]]></artwork>
      <t>More importantly, if the encoded data item also needs to have a
specific structure, this can be expressed by the right-hand side
(instead of using the most general CDDL type <tt>any</tt> here).</t>
      <t>(Note that the <tt>.cdeseq</tt> control operator does not enable specifying
different deterministic encoding requirements for the elements of the
sequence.  If a use case for such a feature becomes known, it could be
added.)</t>
      <t>Obviously, specifications that document ALDR rules can define related control operators
that also embody the processing required by those ALDR rules,
and are encouraged to do so.</t>
    </section>
    <section anchor="seccons">
      <name>Security Considerations</name>
      <t>The security considerations in Section <xref target="RFC8949" section="10" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> apply.
The use of deterministic encoding can mitigate issues arising out of
the use of non-preferred serializations specially crafted by an attacker.
However, this effect only accrues if the decoder actually checks that
deterministic encoding was applied correctly.
More generally, additional security properties of deterministic
encoding can rely on this check being performed properly.</t>
    </section>
    <section anchor="sec-iana">
      <name>IANA Considerations</name>
      <t><cref anchor="to-be-removed">RFC Editor: please replace RFCXXXX with the RFC
number of this RFC and remove this note.</cref></t>
      <t>This document requests IANA to register the contents of
<xref target="tbl-iana-reqs"/> into the registry
"<xref section="CDDL Control Operators" relative="#cddl-control-operators" sectionFormat="bare" target="IANA.cddl"/>" of the
<xref target="IANA.cddl"/> registry group:</t>
      <table anchor="tbl-iana-reqs">
        <name>New control operators to be registered</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">.cde</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.cdeseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94">
          <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
            <front>
              <title>Concise Binary Object Representation (CBOR)</title>
              <author fullname="C. Bormann" initials="C." surname="Bormann"/>
              <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
              <date month="December" year="2020"/>
              <abstract>
                <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
                <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="94"/>
            <seriesInfo name="RFC" value="8949"/>
            <seriesInfo name="DOI" value="10.17487/RFC8949"/>
          </reference>
        </referencegroup>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="IANA.cddl" target="https://www.iana.org/assignments/cddl">
          <front>
            <title>Concise Data Definition Language (CDDL)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
          <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
            <front>
              <title>Key words for use in RFCs to Indicate Requirement Levels</title>
              <author fullname="S. Bradner" initials="S." surname="Bradner"/>
              <date month="March" year="1997"/>
              <abstract>
                <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
          </reference>
          <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
            <front>
              <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
              <author fullname="B. Leiba" initials="B." surname="Leiba"/>
              <date month="May" year="2017"/>
              <abstract>
                <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
          </reference>
        </referencegroup>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.bormann-cbor-det">
          <front>
            <title>CBOR: On Deterministic Encoding and Representation</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="21" month="January" year="2025"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2.  The present document provides additional
   information about use cases, deployment considerations, and
   implementation choices for Deterministic Encoding and Representation.

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

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

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

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


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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-numbers-01"/>
        </reference>
        <reference anchor="UAX-15" target="https://unicode.org/reports/tr15/">
          <front>
            <title>Unicode Normalization Forms</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
          <refcontent>Unicode Standard Annex</refcontent>
        </reference>
        <reference anchor="RFC8392">
          <front>
            <title>CBOR Web Token (CWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="May" year="2018"/>
            <abstract>
              <t>CBOR Web Token (CWT) is a compact means of representing claims to be transferred between two parties. The claims in a CWT are encoded in the Concise Binary Object Representation (CBOR), and CBOR Object Signing and Encryption (COSE) is used for added application-layer security protection. A claim is a piece of information asserted about a subject and is represented as a name/value pair consisting of a claim name and a claim value. CWT is derived from JSON Web Token (JWT) but uses CBOR rather than JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8392"/>
          <seriesInfo name="DOI" value="10.17487/RFC8392"/>
        </reference>
        <reference anchor="RFC9581">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Time, Duration, and Period</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="B. Gamari" initials="B." surname="Gamari"/>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <date month="August" year="2024"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR, RFC 8949) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.</t>
              <t>In CBOR, one point of extensibility is the definition of CBOR tags. RFC 8949 defines two tags for time: CBOR tag 0 (RFC 3339 time as a string) and tag 1 (POSIX time as int or float). Since then, additional requirements have become known. The present document defines a CBOR tag for time that allows a more elaborate representation of time, as well as related CBOR tags for duration and time period. This document is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9581"/>
          <seriesInfo name="DOI" value="10.17487/RFC9581"/>
        </reference>
        <reference anchor="RFC9679">
          <front>
            <title>CBOR Object Signing and Encryption (COSE) Key Thumbprint</title>
            <author fullname="K. Isobe" initials="K." surname="Isobe"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="O. Steele" initials="O." surname="Steele"/>
            <date month="December" year="2024"/>
            <abstract>
              <t>This specification defines a method for computing a hash value over a CBOR Object Signing and Encryption (COSE) Key. It specifies which fields within the COSE Key structure are included in the cryptographic hash computation, the process for creating a canonical representation of these fields, and how to hash the resulting byte sequence. The resulting hash value, referred to as a "thumbprint", can be used to identify or select the corresponding key.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9679"/>
          <seriesInfo name="DOI" value="10.17487/RFC9679"/>
        </reference>
        <referencegroup anchor="STD96" target="https://www.rfc-editor.org/info/std96">
          <reference anchor="RFC9052" target="https://www.rfc-editor.org/info/rfc9052">
            <front>
              <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
              <author fullname="J. Schaad" initials="J." surname="Schaad"/>
              <date month="August" year="2022"/>
              <abstract>
                <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
                <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="96"/>
            <seriesInfo name="RFC" value="9052"/>
            <seriesInfo name="DOI" value="10.17487/RFC9052"/>
          </reference>
          <reference anchor="RFC9338" target="https://www.rfc-editor.org/info/rfc9338">
            <front>
              <title>CBOR Object Signing and Encryption (COSE): Countersignatures</title>
              <author fullname="J. Schaad" initials="J." surname="Schaad"/>
              <date month="December" year="2022"/>
              <abstract>
                <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. CBOR Object Signing and Encryption (COSE) defines a set of security services for CBOR. This document defines a countersignature algorithm along with the needed header parameters and CBOR tags for COSE. This document updates RFC 9052.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="96"/>
            <seriesInfo name="RFC" value="9338"/>
            <seriesInfo name="DOI" value="10.17487/RFC9338"/>
          </reference>
        </referencegroup>
        <reference anchor="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="2024"/>
            <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-05"/>
        </reference>
      </references>
    </references>
    <?line 353?>

<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.
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.
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>For instance, CWT 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>
      <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>
      <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>
      <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>
      <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>
      <t>ALDR rules (including rules specified in a ALDR ruleset document) enable
simply using implementations of the common CDE; they do not
"fork" CBOR in the sense of requiring distinct generic encoder/decoder
implementations for each application.</t>
      <t>An implementation of specific ALDR rules combined with a CDE
implementation produces well-formed,
deterministically encoded CBOR according to <xref target="STD94"/>, and existing
generic CBOR decoders will therefore be able to decode it, including
those that check for Deterministic Encoding ("CDE decoders", see also
<xref target="impcheck"/>).
Similarly, generic CBOR encoders will be able to produce valid CBOR
that can be ingested by an implementation that enforces an application's
ALDR rules if the encoder was handed data model level information
from an application that simply conformed to those ALDR rules.</t>
      <t>Please note that the separation between standard CBOR processing and
the processing required by the ALDR rules is a conceptual one:
Instead of employing generic encoders/decoders, both ALDR rule
processing and standard CBOR processing can be combined into a specialized
encoder/decoder specifically designed for a particular set of ALDR
rules.</t>
      <t>ALDR rules are intended to be used in conjunction with an
application, which typically will naturally use a subset of the CBOR generic
data model, which in turn
influences which subset of the ALDR rules is used by the specific application
(in particular if the application simply references a more general
ALDR ruleset document).
As a result, ALDR rules themselves place no direct
requirement on what minimum subset of CBOR is implemented.
For instance, a set of ALDR rules might include rules for the
processing of floating point values, but there is no requirement that
implementations of that set of ALDR rules support floating point
numbers (or any other kind of number, such as arbitrary precision
integers or 64-bit negative integers) when they are used with
applications that do not use them.</t>
      <?line 557?>

</section>
    <section anchor="impcheck">
      <name>Implementers' Checklists</name>
      <t>This appendix is informative.
It provides brief checklists that implementers can use to check their
implementations.
It uses <xref target="RFC2119"/> language, specifically the keyword <bcp14>MUST</bcp14>, to highlight
the specific items that implementers may want to check.
It does not contain any normative mandates.
This appendix is informative.</t>
      <t>Notes:</t>
      <ul spacing="normal">
        <li>
          <t>This is largely a restatement of parts of Section <xref target="RFC8949" section="4" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.
The purpose of the restatement is to aid the work of implementers,
not to redefine anything.  </t>
          <t>
Preferred Serialization Encoders and Decoders as well as CDE
Encoders and Decoders have certain properties that are expressed
using <xref target="RFC2119"/> keywords in this appendix.</t>
        </li>
        <li>
          <t>Duplicate map keys are never valid in CBOR at all (see
list item "Major type 5" in Section <xref target="RFC8949" section="3.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>)
no matter what sort of serialization is used.
Of the various strategies listed in Section <xref target="RFC8949" section="5.6" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>,
detecting duplicates and handling them as an error instead of
passing invalid data to the application is the most robust one;
achieving this level of robustness is a mark of quality of
implementation.</t>
        </li>
        <li>
          <t>Preferred serialization and CDE only affect serialization.
They do not place any requirements, exclusions, mappings or such on
the data model level.
ALDR rules such as the ALDR ruleset defined by dCBOR are different as they can affect
the data model by restricting some values and ranges.</t>
        </li>
        <li>
          <t>CBOR decoders in general (as opposed to "CDE decoders" specifically
advertised as supporting CDE)
are not required to check for preferred
serialization or CDE and reject inputs that do not fulfill
their requirements.
However, in an environment that employs deterministic encoding,
employing non-checking CBOR decoders negates many of its benefits.
Decoder implementations that advertise "support" for preferred
serialization or CDE need to check the encoding and reject
input that is not encoded to the encoding specification in use.
Again, ALDR rules such as those in dCBOR may pose additional
requirements, such as requiring rejection of non-conforming inputs.  </t>
          <t>
If a generic decoder needs to be used that does not "support" CDE, a
simple (but somewhat clumsy) way to check for proper CDE encoding is
to re-encode the decoded data and check for bit-to-bit equality with
the original input.</t>
        </li>
      </ul>
      <section anchor="ps">
        <name>Preferred Serialization</name>
        <t>In the following, the abbreviation "ai" will be used for the 5-bit
additional information field in the first byte of an encoded CBOR data
item, which follows the 3-bit field for the major type.</t>
        <section anchor="pse">
          <name>Preferred Serialization Encoders</name>
          <ol spacing="normal" type="1"><li>
              <t>Shortest-form encoding of the argument <bcp14>MUST</bcp14> be used for all major
types.
Major type 7 is used for floating-point and simple values; floating
point values have its specific rules for how the shortest form is
derived for the argument.
The shortest form encoding for any argument that is not a floating
point value is:  </t>
              <ul spacing="normal">
                <li>
                  <t>0 to 23 and -1 to -24 <bcp14>MUST</bcp14> be encoded in the same byte as the
major type.</t>
                </li>
                <li>
                  <t>24 to 255 and -25 to -256 <bcp14>MUST</bcp14> be encoded only with an additional
byte (ai = 0x18).</t>
                </li>
                <li>
                  <t>256 to 65535 and -257 to -65536 <bcp14>MUST</bcp14> be encoded only with an
additional two bytes (ai = 0x19).</t>
                </li>
                <li>
                  <t>65536 to 4294967295 and -65537 to -4294967296 <bcp14>MUST</bcp14> be encoded
only with an additional four bytes (ai = 0x1a).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>If floating-point numbers are emitted, the following apply:  </t>
              <ul spacing="normal">
                <li>
                  <t>The length of the argument indicates half (binary16, ai = 0x19),
single (binary32, ai = 0x1a) and double (binary64, ai = 0x1b)
precision encoding.
If multiple of these encodings preserve the precision of the
value to be encoded, only the shortest form of these <bcp14>MUST</bcp14> be
emitted.
That is, encoders <bcp14>MUST</bcp14> support half-precision and
single-precision floating point.</t>
                </li>
                <li>
                  <t><xref target="IEEE754"/> Infinites and NaNs, and thus NaN payloads, <bcp14>MUST</bcp14> be
supported, to the extent possible on the platform.      </t>
                  <t>
As with all floating point numbers, Infinites and NaNs <bcp14>MUST</bcp14> be
encoded in the shortest of double, single or half precision that
preserves the value:      </t>
                  <ul spacing="normal">
                    <li>
                      <t>Positive and negative infinity and zero <bcp14>MUST</bcp14> be represented in
half-precision floating point.</t>
                    </li>
                    <li>
                      <t>For NaNs, the value to be preserved includes the sign bit,
the quiet bit, and the NaN payload (whether zero or non-zero).
The shortest form is obtained by removing the rightmost N bits of the
payload, where N is the difference in the number of bits in the
significand (mantissa representation) between the original format
and the shortest format.
This trimming is performed only (preserves the value only) if all the
rightmost bits removed are zero.
(This will always represent a double or single quiet NaN with a zero
NaN payload in a half-precision quiet NaN.)</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t>If tags 2 and 3 are supported, the following apply:  </t>
              <ul spacing="normal">
                <li>
                  <t>Positive integers from 0 to 2^64 - 1 <bcp14>MUST</bcp14> be encoded as a type 0 integer.</t>
                </li>
                <li>
                  <t>Negative integers from -(2^64) to -1 <bcp14>MUST</bcp14> be encoded as a type 1 integer.</t>
                </li>
                <li>
                  <t>Leading zeros <bcp14>MUST NOT</bcp14> be present in the byte string content of tag 2 and 3.</t>
                </li>
              </ul>
              <t>
(This also applies to the use of tags 2 and 3 within other tags,
such as 4 or 5.)</t>
            </li>
          </ol>
        </section>
        <section anchor="psd">
          <name>Preferred Serialization Decoders</name>
          <t>There are no special requirements that CBOR decoders need to meet to
be a Preferred Serialization Decoder.
Partial decoder implementations need to pay attention to at least the
following requirements:</t>
          <ol spacing="normal" type="1"><li>
              <t>Decoders <bcp14>MUST</bcp14> accept shortest-form encoded arguments (see Section <xref target="RFC8949" section="3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).</t>
            </li>
            <li>
              <t>If arrays or maps are supported, definite-length arrays or maps <bcp14>MUST</bcp14> be accepted.</t>
            </li>
            <li>
              <t>If text or byte strings are supported, definite-length text or byte
strings <bcp14>MUST</bcp14> be accepted.</t>
            </li>
            <li>
              <t>If floating-point numbers are supported, the following apply:  </t>
              <ul spacing="normal">
                <li>
                  <t>Half-precision values <bcp14>MUST</bcp14> be accepted.</t>
                </li>
                <li>
                  <t>Double- and single-precision values <bcp14>SHOULD</bcp14> be accepted; leaving these out
is only foreseen for decoders that need to work in exceptionally
constrained environments.</t>
                </li>
                <li>
                  <t>If double-precision values are accepted, single-precision values
<bcp14>MUST</bcp14> be accepted.</t>
                </li>
                <li>
                  <t>Infinites and NaNs, and thus NaN payloads, <bcp14>MUST</bcp14> be accepted and
presented to the application (not necessarily in the platform
number format, if that doesn't support those values).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>If big numbers (tags 2 and 3) are supported, type 0 and type 1 integers <bcp14>MUST</bcp14>
be accepted where a tag 2 or 3 would be accepted.  Leading zero bytes
in the tag content of a tag 2 or 3 <bcp14>MUST</bcp14> be ignored.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="bs">
        <name>Basic Serialization</name>
        <t>Basic Serialization further restricts Preferred Serialization by not
using indefinite length encoding.
A CBOR encoder can choose to employ Basic Serialization in order to
reduce the variability that needs to be handled by decoders,
potentially maximizing interoperability with partial (e.g.,
constrained) CBOR decoder implementations.</t>
        <section anchor="bse">
          <name>Basic Serialization Encoders</name>
          <t>The Basic Serialization Encoder requirements are identical to the
Preferred Serialization Encoder requirements, with the following additions:</t>
          <ol spacing="normal" type="1"><li>
              <t>If maps or arrays are emitted, they <bcp14>MUST</bcp14> use definite-length
encoding (never indefinite-length).</t>
            </li>
            <li>
              <t>If text or byte strings are emitted, they <bcp14>MUST</bcp14> use definite-length
encoding (never indefinite-length).</t>
            </li>
          </ol>
        </section>
        <section anchor="bsd">
          <name>Basic Serialization Decoders</name>
          <t>The Basic Serialization Decoder requirements are identical to the
Preferred Serialization Decoder requirements.</t>
        </section>
      </section>
      <section anchor="cde">
        <name>CDE</name>
        <section anchor="cde-encoders">
          <name>CDE Encoders</name>
          <ol spacing="normal" type="1"><li>
              <t>CDE encoders <bcp14>MUST</bcp14> only emit CBOR fulfilling the basic
serialization rules (<xref target="bse"/>).</t>
            </li>
            <li>
              <t>CDE encoders <bcp14>MUST</bcp14> sort maps by the CBOR representation of the map
key.
The sorting is byte-wise lexicographic order of the encoded map
key data items.</t>
            </li>
            <li>
              <t>CDE encoders <bcp14>MUST</bcp14> generate CBOR that fulfills basic validity
(Section <xref target="RFC8949" section="5.3.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).  Note that this includes not
emitting duplicate keys in a major type 5 map as well as emitting
only valid UTF-8 in major type 3 text strings.  </t>
              <t>
Note also that CDE does NOT include a requirement for Unicode
normalization <xref target="UAX-15"/>; <xref section="C" sectionFormat="of" target="I-D.bormann-dispatch-modern-network-unicode"/> contains some
rationale that went into not requiring routine use of Unicode normalization
processes.</t>
            </li>
          </ol>
        </section>
        <section anchor="cde-decoders">
          <name>CDE Decoders</name>
          <t>The term "CDE Decoder" is a shorthand for a CBOR decoder that
advertises <em>supporting</em> CDE (see the start of this appendix).</t>
          <ol spacing="normal" type="1"><li>
              <t>CDE decoders <bcp14>MUST</bcp14> follow the rules for preferred (and thus basic)
serialization decoders (<xref target="psd"/>).</t>
            </li>
            <li>
              <t>CDE decoders <bcp14>MUST</bcp14> check for ordering map keys and for basic
validity of the CBOR encoding (see Section <xref target="RFC8949" section="5.3.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>, which includes a check against duplicate map keys
and invalid UTF-8).  </t>
              <t>
To be called a CDE decoder, it <bcp14>MUST NOT</bcp14> present to the application
a decoded data item that fails one of these checks (except maybe via
special diagnostic channels with no potential for confusion with a
correctly CDE-decoded data item).</t>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="list-of-tables">
      <name>List of Tables</name>
      <ol spacing="compact" type="1"><li>
          <t><xref target="tab-constraints">Constraints on the Serialization of CBOR</xref></t>
        </li>
        <li>
          <t><xref target="tbl-iana-reqs">New control operators to be registered</xref></t>
        </li>
      </ol>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>An earlier version of this document was based on the work of Wolf
McNally and 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 ALDR rules/rulesets on top of that.</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="impcheck"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
