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

<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.</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 73?>

<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.</t>
      <section anchor="structure-of-this-document">
        <name>Structure of This Document</name>
        <t>After introductory material, <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="application-profiles"/> introduces the concept of Application Profiles,
which are layered on top of the CBOR CDE Profile and can address
recurring requirements on deterministic representation
of application data where these requirements are specific to a set of
applications.
(Application Profiles themselves, if needed, are defined in separate
documents.)</t>
        <t>The informative <xref target="impcheck"/> provides brief checklists that implementers
can use to check their CDE implementations.</t>
      </section>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <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="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>In many cases, CBOR provides more than one way to encode a data item,
but also provides a recommendation for a <em>Preferred Serialization</em>.
The <em>CoRE Deterministic Encoding Requirements</em> generally pick the
preferred serializations as mandatory; they also pick additional choices
such as definite-length encoding.
Finally, they define a map ordering based on lexicographic ordering of
the (deterministically) encoded map keys.</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>The CBOR Common Deterministic Encoding Profile (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 this Profile.</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, which need to
be made to obtain a 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.
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 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>The CBOR Common Deterministic Encoding Profile 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 application (profile) level if desired.</t>
        </li>
      </ol>
      <t>The main intent here is to preserve the basic generic data model, so
applications (or Application Profiles, see <xref target="application-profiles"/>) can
make their own decisions within that data model.
E.g., an application (profile) 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 (profile) would not need to
provide processing for other NaN values.
Basing the definition of both CDE and Application Profiles 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 documents encoding decisions
for byte strings that carry embedded CBOR.</t>
      <?line 289?>

</section>
    <section anchor="cddl-support">
      <name>CDDL support</name>
      <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>.cborseq</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, Application Profiles can define related control operators
that also embody the processing required by the Application Profile,
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>
            <date day="28" month="March" year="2019"/>
          </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</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="3" month="March" year="2024"/>
            <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.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-02"/>
        </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>
            <date day="10" month="June" year="2024"/>
            <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-10"/>
        </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="July" year="2024"/>
            <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-00"/>
        </reference>
      </references>
    </references>
    <?line 238?>

<section anchor="application-profiles">
      <name>Application Profiles</name>
      <t>This appendix is informative.</t>
      <t>While the CBOR Common Deterministic Encoding Profile (CDE) provides
for commonality between different applications of CBOR, it can be useful
to further constrain the set of data items handled in a group of
applications (<em>exclusions</em>) and to define further mappings
(<em>reductions</em>) that help the applications in such a group get by with
the exclusions.</t>
      <t>For example, the dCBOR Application Profile specifies the use of
CDE together with some application-level rules <xref target="I-D.mcnally-deterministic-cbor"/>.</t>
      <t>In general, the application-level rules specified by an Application Profile are
based on the shared CBOR Common Deterministic Encoding Profile; they do
not "fork" CBOR in the sense of requiring distinct generic
encoder/decoder implementations.</t>
      <t>An Application Profile 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 processed by Application Profile implementations, if
handed Application Profile conforming data model level information
from an application.</t>
      <t>Please note that the separation between standard CBOR processing and
the processing required by the Application Profile is a conceptual
one: Instead of employing generic encoders/decoders, both Application
Profile processing and standard CBOR processing
can be combined into a encoder/decoder specifically designed for the
Application Profile.</t>
      <t>An Application Profile is intended to be used in conjunction with an
application, which typically will use a subset of the CBOR generic
data model, which in turn
influences which subset of the application profile is used.
As a result, an Application Profile itself places no direct
requirement on what minimum subset of CBOR is implemented.
For instance, an application profile might define rules for the
processing of floating point values, but there is no requirement that
implementations of that Application Profile 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 356?>

</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.
Application profiles such as dCBOR are different as they can affect
the data model by restricting some values and ranges.</t>
        </li>
        <li>
          <t>CBOR decoders in general 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, application profiles such as 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="preferred-serialization">
        <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 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>
            <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>
          </ol>
        </section>
        <section anchor="psd">
          <name>Preferred Serialization Decoders</name>
          <ol spacing="normal" type="1"><li>
              <t>Decoders <bcp14>MUST</bcp14> accept shortest-form encoded arguments.</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>
          </ol>
        </section>
      </section>
      <section anchor="cde">
        <name>CDE</name>
        <section anchor="cde-encoders">
          <name>CDE Encoders</name>
          <ol spacing="normal" type="1"><li>
              <t>CDE encoders <bcp14>MUST</bcp14> only emit CBOR fulfilling the preferred
serialization rules (<xref target="pse"/>).</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>
            </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 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>
            </li>
          </ol>
        </section>
      </section>
    </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"/>; more
recent revisions of that document now make use of the present document
and the concept of Application Profile.
We would like to explicitly acknowledge that this work has
contributed greatly to shaping the concept of a CBOR Common
Deterministic Encoding and Application Profiles 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 the text that became <xref target="impcheck"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7VcaZYbyXH+X6dIgz+EpgGwN27NGWma7Kam3+NmkvNkWR5z
EqgEusRCFVRLL9Oing/hI/gmvolP4vgiIrOysHBmfphPmgZqyYyMjPhiTYzH
4+TqxBwlSZM1uTsxL56/fW9elMtlWZgz17hqmRVZ3WQzc17MyjQrFmb44ux8
L7HTaeWu/Atn50lazgq7pCHSys6bceaa+Xg2LavxLHXj3DaubpIZ/VmU1e2J
mc5WSd1Uzi5PzMX5x5dJktK9k2RWFrUr6rY+MU3VusTSIydmcLpa5Rm9ndFt
Y4vUvHc2H3/Mlm6QXJfV50VVtishJvnsbulSepIkV65oaUxj9PbgRVnMstqZ
51lhq1vzdvpXN2torFXlaNaGxzevbVY0rrDFzPFU5zf0reaZh5hgb0AjLm2W
04BY4HdY6qSsFri+yJrLdnpieOXXiwdbmJEktm0uywqEjen/xmQFLffFxDwv
q6UtCr4mvHxhq5pm792hmU7MD0V25ao6a/7nvxvzvHJLeujjv13wA+Cra07M
u7Ju5nZ2aY6O9o+P9/neLGuI+/KCXChTmudsfPjk6OFTvdIWDfbojw6T3vLF
1WVZ0HP/fPx0fHx4MD48eDJ+dPT08IBvOuHGzE7L75qfM/ACG9lU2bRtsNCx
LueVbSsHvr5qi3SaW2KGrueDm7UV0WY+XjoSEPPq1YskDJwv8u9qfaDh+5NZ
uUxAqk5CuxONvqrKqyx1qaGHTeNuGvpgGzN1M6LC3N1ly9Xs0s0+f/kySZIC
rG2Im9iPDx/Pnh7L7iX3sLRvT8z7ly+ePD0Gby7Oz88fPzw+4UU3tlqAy5dN
s6pPHjzInHM3q7ys3AQfwYQHpBMtMbp58OTxo0eHh8Jf1TQMZj40JGG2Ss28
rMzLvCRCisX4XUkSaE5puZdLR7rHr3VCQ2IjTMMQ/J11x8xtXjuRAFdlrs6K
eSnPGz9bemJoAePD/YOneuPs7cWJOdifHBzsP32Ap4gFE9yfdDSDA48O9okv
aZqDD6dvTif4TDqWYJaIgxfjs8lUpFUkPgWT6D96b0kokee3uNyBCz9JT/EL
ZZUttg1UtMspifyJ0Q9JMh6PjZ2SuNtZkyR/+Q/6fDD+sfski2eEGtKyzNPj
EdZisJ17RNM8K1xtBj2cA3GCdSQ/eHVA6ila2tQQU8aI48nhSMUMkFiXJFfz
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
ZI6KfokBa0z47IymMoUcAeIjXqiM5ifuepJ5eTvX1xnmu3ur2pGTdzAxH7hV
pm64ALLeT0sIsxBHnM96xSuGDZWed7Ssod+VK/2REX3s7R4/v9boJfkDFhYB
vWdb+tcUDtlzgN4Hh65LhF6W11qKkmUY6ZvljgGcpbmKNsgvhgn9uPFSr+mT
z5r4xcf6bXfRSQ+ccI/KfbMPAT484kWOD/BlfHgcWBil3Bpt5RdZEKshR+Pj
PeUxaQAM+vChjHr4UIZ9+GhjXDnhJ0n3Plagix0TDW1mvjX7NwdP9vzoNA6N
9+jhw6MwwWOeAZe+PocMHMk9soCSrAoTPfUTyXA08PEheTSPHh8+1flwQ2YM
dzamlZl2rI+2ra3W57XIM5GUE7yRyWdzb6vKqnvolhm5bqme1OLJEKWsHe3q
Ne8PxaVEv2HvoW4e6UReq+H/v822plY+Fb8+Xwdpkorxkgot0ANs6xrv093Q
v3xOkM4/W3LwiIA+bOpIdkQ7S/SRo8PuEavndcp22j3w6Lh7YLonQ4RaQHSa
R347gnauzRscT1MS686q1v3unW4QjdR5BG12iZOwIxGiTeAIM6jkyQjKSaXo
o6DBqCua8sO+OAJujTtKtOXMMym606+iTHRH4ibRC20hFY8QLW0jPU1BoUPU
bkiXe/QqKbz36obccNsTuQ91hp3QAr7vJ5fJyRnRxq8t/byhi3WTqDVmrcGb
5y8yWSwGIy8vgG+IVscSzqd5eeB9jRp9T5TI+/htmYxjcVAQFYqYsFu+ym2o
Hj7iwzz6exr0b22jtm0HJkPGX1gfKFFh8jSmvmlXiEVFFV6JKgcuSR8hrvnT
MPH2maHvV9Ze2tBIuxdEbtPCmXCgYBp3p/oUPUdsbzBn3dMGnXOk/UlvfITn
g5eZ8zvX5ex4kK6XtN9NOuRzPnVt1zr39kK5veeGiUukNkN50VuabcKi+dxb
tlzqKc4uqcnaO9wiI3xnD2lbK80WMlTHkakc++RcJqMk2KwTDnlG9u20rzbu
s1cMQ8Ao4rvWHGp5KBkp3lxuUVqTtfAqSgVf89hC9gQeWyoeW7jG4m1nXOiq
N904XuCi9T9iIvZCrV9ZiT3kH4bo0GL9UPPa016fZE5urPwFm/eVseN3uENZ
X9s5yVdMXQx4u43d9/1NUO9ycz5++Iy3e6yO6hp066v62wTRy8/Qt+wVEfm5
VkUd+gqhRetPDaWAkxmCXD0BJWEjp+xIaqSEyb5NLr+D1bXF0ZNRwF0rzRce
YjdJBZc8kaNdC5JJtmyAjP6brVEYorOCHRBvSTYNpVMU1S1bZcStrG+mZAjF
JcEKrXdqWFr8rgl2WPqnZGF7XOi6x/lJ1jeEnD4aYvkKMWhQLOmgJcsvUZmm
QzZOXrLobjkvMby7Q4z1RV21zfE5VchqpcU7nmat+1mdMnoM83x2t13sQq8r
LkKDxtfIcmz5NQE/RPSzATpU1BCwi8ZwbKirZysf9My05FZxRBv4GScud6RM
JwSO/V8rCLaTNj/xzlYvsSn5XMbR6PjtQ071xqca9cXExwiS2fzh48vxE7wd
vXsk6KOQM+lkwmOrFDyRuDKD6PpAUpoMtlwCl9MkccZKfJiQeKrNJxVImukT
z4HMs5i9xlbdoUWfz44EJu0hvaCaWPgQ/+6ofkr4q2+zKKY9UeyP3CVTwg9Q
dGl0XaUckRd3mne816DVRSx171yil4Mtp4+7Di7df6t0WGTEyFSnGzn9RH0G
n7Tmrd3jyubpDNX43KULBsTk7kRgwqXfDvin6VAGOyVQtVWeoSaA3y/0ChZX
HFG27TW5+grKn8p8nryeveHqEyelL6usbsoVHLfTnKwap+p0HJ/J7/XjPuMz
mfjFJ6ltXmnbfxkgTInAz2fwIYG2q/Gs/4Ja4r2nr/9E1ST5k9M+fO6XweGf
GzyVNVzn9myLVZKXfGnr7ncUaTkL/CCGnP6qL+0qnOrqZu+dAN31k2Vf7dr3
P5sFH/D/AKPwIoceVAAA

-->

</rfc>
