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

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

<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="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"/>).
ALDR rules are layered on top of the CBOR CDE Profile 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 with a specification for a CBOR-based
protocol, or, if needed, can be provided by referencing a shared "ALDR
Profile" 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>
        <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.
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>
        <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 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, 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 (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 by restricting 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 ALDR Profiles, 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 331?>

</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>.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, 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</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>
            <author fullname="Laurence Lundblade" initials="L." surname="Lundblade">
              <organization>Security Theory LLC</organization>
            </author>
            <date day="8" month="August" 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-11"/>
        </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>
        <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="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 272?>

<section anchor="aldr">
      <name>Application-level Deterministic Representation Rules</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 ALDR Profile <xref target="I-D.mcnally-deterministic-cbor"/> specifies the use of CDE
together with some application-level rules, 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 those specified by an ALDR Profile) enable
simply using 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 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 processed by an implementation enforcing an application's
ALDR rule set if the encoder was handed data model level information
from an application that simply conformed to the application's 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 an
encoder/decoder specifically designed for a particular set of ALDR
rules (such as those required by a particular application or set of
applications, possibly specified as an ALDR Profile).</t>
      <t>ALDR rules are 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 ALDR rules is used by the application
(in particular if the application simply references a more general
ALDR profile).
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 411?>

</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.
Sets of ALDR rules such as the dCBOR ALDR Profile 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 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>
              <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="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 Profile.
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/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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
CtxGL2gAAA==

-->

</rfc>
