<?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-05" 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-05"/>
    <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="26"/>
    <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.
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 77?>

<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, <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.
<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>
      </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 299?>

</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>
          </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="21" month="July" 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-03"/>
        </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 248?>

<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 366?>

</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="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>
            </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="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 most of the text that became <xref target="impcheck"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
k2z+I57I8/wvw18AUqpdAAA=

-->

</rfc>
