<?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.29 (Ruby 2.7.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-serialization-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title abbrev="CBOR Serialization">CBOR Serialization and Determinism</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-serialization-00"/>
    <author initials="L." surname="Lundblade" fullname="Laurence Lundblade">
      <organization>Security Theory LLC</organization>
      <address>
        <email>lgl@securitytheory.com</email>
      </address>
    </author>
    <date year="2025" month="November" day="19"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <keyword>cbor</keyword>
    <abstract>
      <?line 82?>

<t>This document defines two CBOR serializations: "ordinary serialization" and "deterministic serialization."
It also introduces the term "general serialization" to name the full, variable set of serialization options defined in <xref target="STD94"/>.
Together, these three form a complete set of serializations that cover the majority of CBOR serialization use cases.</t>
      <t>These serializations are largely compatible with those widely implemented by the CBOR community.</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-serialization/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        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-serialization"/>.</t>
    </note>
  </front>
  <middle>
    <?line 91?>

<section anchor="Introduction">
      <name>Introduction</name>
      <t>Background material on serialization and determinism concepts is provided in <xref target="models"/>.
Readers may wish to review this background information first.</t>
      <t>This document defines new serializations rather than attempting to clarify those in <xref target="STD94"/> (that need clarification).
This approach enables the serialization requirements to be expressed directly in normative <xref target="RFC2119"/> language, and to be consolidated in this single comprehensive specification.
This approach provides clarity and simplicity for implementers and the CBOR community over the long term.</t>
      <t>The serializations defined herein are formally new, but largely interchangeable with the way the serializations desecribed in <xref target="STD94"/> are implemented.</t>
      <t>For example, preferred serialization described in <xref target="STD94"/> is commonly implemented without support for indefinite-lengths.
Ordinary serialization is defined here is largely the same preferred serialization without indefinite-lengths, so it is largely interchangeable with what is commonly implemented.</t>
    </section>
    <section anchor="general-serialization">
      <name>General Serialization</name>
      <t>This section assigns the name "general serialization" to the full set of serialization options standardized in <xref section="3" sectionFormat="of" target="STD94"/>.
This full set was not explicitly named in <xref target="STD94"/>.</t>
      <t>General serialization consists of all of these:</t>
      <ul spacing="normal">
        <li>
          <t>Any length CBOR argument (e.g., the integer 0 may be encoded as 0x00, 0x1800 or or 0x190000 and so on).</t>
        </li>
        <li>
          <t>Any length floating point regardless of value (e.g. 0.00 can be 0xf900, 0xfa000000000 and so on).</t>
        </li>
        <li>
          <t>Both definite or indefinite-length strings, arrays and maps are allowed.</t>
        </li>
        <li>
          <t>Big numbers can represent values that are also representable by major types 0 and 1 (e.g., 0 can be encoded as a big number, as 0xc34100).</t>
        </li>
      </ul>
      <t>A decoder that supports general serialization is able to decode all of these.</t>
      <t>If a CBOR-based protocol specification does not explicitly specify serialization, general serialization is implied.
This means that a compliant decoder for such a protocol is required to accept all forms allowed by general serialization including both definite and indefinite lengths.
For example, CBOR Web Token, <xref target="RFC8392"/> does not specify serialization; therefore, a full and proper CWT decoder must be able to handle variable-length CBOR argments plus indefinite-length strings, arrays and maps.</t>
      <t>In practice, however, it is widely recognized that some CWT decoders cannot process the full range of general serialization, particularly indefinite lengths.
As a result, CWT encoders typically limit themselves to the subset of serializations that decoders can reliably handle, most notably by never encoding indefinite lengths.
It is similar for other CBOR-based protocols like <xref target="RFC9052"/>.
See also <xref target="OrdinarySerialization"/>.</t>
      <t>Note also that there is no shortest-length requirement for floating-point encoding in general serialization.
Thus, IEEE 754 NaNs (See <xref target="NaN"/>) may be encoded with a desired size, regardless of their payload — a principle sometimes stated as “touch not the NaNs.”</t>
      <t>Finally, note also that general serialization is inherently non-deterministic because some CBOR data items can be serialized in multiple ways.</t>
    </section>
    <section anchor="OrdinarySerialization">
      <name>Ordinary Serialization</name>
      <t>This section defines a serialization named "ordinary serialization."</t>
      <section anchor="OrdinaryEncoding">
        <name>Encoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>The shortest-form of the CBOR argument must be used for all major types.
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 MUST be encoded in the same byte as the major type.</t>
              </li>
              <li>
                <t>24 to 255 and -25 to -256 MUST be encoded only with an additional byte (ai = 0x18).</t>
              </li>
              <li>
                <t>256 to 65535 and -257 to -65536 MUST be encoded only with an additional two bytes (ai = 0x19).</t>
              </li>
              <li>
                <t>65536 to 4294967295 and -65537 to -4294967296 MUST be encoded only with an additional four bytes (ai = 0x1a).</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If maps or arrays are encoded, they MUST use definite-length encoding (never indefinite-length).</t>
          </li>
          <li>
            <t>If text or byte strings are encoded, they MUST use definite-length encoding (never indefinite-length).</t>
          </li>
          <li>
            <t>If floating-point numbers are encoded, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>Half-precision MUST be supported</t>
              </li>
              <li>
                <t>Values MUST be encoded in the shortest of double, single or half-precision that preserves precision.
For example, 0.0 can always be reduced to half-precision so it MUST be encoded as 0xf90000
For another example, 0.1 would loose precision if not encoded as double-precision so it MUST be encoded as 0xfb3fb999999999999a.
Subnormal numbers MUST be supported in this shortest-length encoding.</t>
              </li>
              <li>
                <t>The only NaN that may be encoded is a half-precision quiet NaN (the sign bit and all but the highest payload bit is clear), specifically 0xf97e00.</t>
              </li>
              <li>
                <t>Aside from the the requirement allowing only the half-precision quiet NaN, these are the same floating-point requirements as <xref section="4.1" sectionFormat="of" target="STD94"/> and also as <xref section="4.2.1" sectionFormat="of" target="STD94"/>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If big numbers (tags 2 and 3) are encoded, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>Leadings zeros MUST NOT be encoded.</t>
              </li>
              <li>
                <t>If a value can be encoded using major type 0 or 1, then it MUST be encoded with major type 0 or 1, never as a big number.</t>
              </li>
            </ul>
          </li>
        </ol>
      </section>
      <section anchor="OrdinaryDecoding">
        <name>Decoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Decoders MUST accept shortest-form encoded arguments.</t>
          </li>
          <li>
            <t>If arrays or maps are supported, definite-length arrays or maps MUST be accepted.</t>
          </li>
          <li>
            <t>If text or byte strings are supported, definite-length text or byte strings MUST be accepted.</t>
          </li>
          <li>
            <t>If floating-point numbers are supported, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>Half-precision values MUST be accepted.</t>
              </li>
              <li>
                <t>Double- and single-precision values SHOULD 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 MUST be accepted.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If big numbers (tags 2 and 3) are accepted, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>Big numbers described in <xref section="3.4.3" sectionFormat="of" target="STD94"/> MUST be accepted.</t>
              </li>
              <li>
                <t>Leading zeros SHOULD be ignored.</t>
              </li>
              <li>
                <t>An empty string SHOULD be accepted and treated as the value zero.</t>
              </li>
            </ul>
          </li>
        </ol>
      </section>
      <section anchor="when-to-use-ordinary-serialization">
        <name>When to use ordinary serialization</name>
        <t>The purpose of ordinary serialization is to provide interoperability without requiring support for indefinite-length decoding.
If an encoder never produces indefinite-length items, the decoder can safely treat them as errors.
Supporting indefinite-length decoding, especially for strings, introduces additional complexity and often necessitates dynamic memory allocation, so omitting it significantly reduces the implementation burden.</t>
        <t>Ordinary serialization also provides a size efficiency gain by encoding the CBOR argument in the shortest form.
Implementations typically find encoding and decoding in this form to be straightforward.</t>
        <t>The easy implementation and broad usefulness makes ordinary serialization the best choice for most CBOR protocols.
To some degree it is a de facto standard for common CBOR protocols.</t>
        <t>However, it is not suitable if determinism is needed because the order of items in a map is allowed to vary.
See <xref target="WhenDeterministic"/>.</t>
        <t>It may also not be suitable in some cases where special functionality is needed like the following:</t>
        <ul spacing="normal">
          <li>
            <t>Streaming of of strings, arrays and maps in constrained environments where the length is not known</t>
          </li>
          <li>
            <t>Non-trival NaNs need to be supported</t>
          </li>
          <li>
            <t>Hardware environments where integers are encoded/decoded directly from/to hardware registers and shortest-length CBOR arguments would be burdensome</t>
          </li>
        </ul>
        <t>In those cases, a special/custom serialization can be defined.</t>
        <t>But, for the vast majority of use cases, ordinary serialization provides interoperaibility, small encoded size and low implementation costs.</t>
      </section>
      <section anchor="RelationToPreferred">
        <name>Relation To Preferred Serialization</name>
        <t>Ordinary serialization is defined to be the long-term replacement for preferred serialization.</t>
        <t>The differences are:</t>
        <ul spacing="normal">
          <li>
            <t>Definite lengths are a requirement, not a preference.</t>
          </li>
          <li>
            <t>The only NaN allowed is the half-precision quiet NaN.</t>
          </li>
        </ul>
        <t>These differences are not of significance in real-world implementations, so ordinary serialization is already largely supported.</t>
        <t>In <xref section="3" sectionFormat="of" target="STD94"/> it states that in preferred serialization the use of definite-length encoding is a "preference", not a requirement.
Technically that means preferred seriaization decoders must support indefinite legnths, but in reality many do not.
Indefinite lengths, particularly for strings, are often not supported because they are more complex to implement than other parts of CBOR.
Because of this, the implementation of most CBOR protocols use only definite lengths.</t>
        <t>Further, much of the CBOR community didn't notice the use of the word "preference" and realize its implications for decoder implementations.
It was somewhat assumed that preferred serialization didn't allow indefinite lengths.
That preferred serialization decoders are technically required to support indefinite lengths wasn't noticed until many years after the publication of <xref target="STD94"/>.</t>
        <t>Briefly stated, the reason that the divergence on NaNs is not of consequence in the real world, is that their non-trivial forms are used extremely rarely and support for them in programming environments and CBOR libraries is unreliable.
See <xref target="NaNCompatibility"/> for a detailed discussion.</t>
        <t>Thus ordinary serialization is largely interchangable with preferred serialization in the real world.</t>
      </section>
    </section>
    <section anchor="DeterministicSerialization">
      <name>Deterministic Serialization</name>
      <t>This section defines a serialization named "deterministic serialization"</t>
      <t>Deterministic serialization is the same as described in <xref section="4.2.1" sectionFormat="of" target="STD94"/> except for the encoding of floating-point NaNs.
See <xref target="OrdinarySerialization"/> and <xref target="NaN"/> for details on and rationale for NaN encoding.</t>
      <t>Note that in deterministic serialization, any big number that can be represented as an integer must be encoded as an integer.
This rule is inherited from ordinary serialization (<xref target="OrdinarySerialization"/>), just as <xref section="4.2.1" sectionFormat="of" target="STD94"/> inherits this requirement from preferred serialization.</t>
      <section anchor="DeterministicEncoding">
        <name>Encoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>All of ordinary serialization defined in <xref target="OrdinaryEncoding"/> MUST be used.</t>
          </li>
          <li>
            <t>If a map is encoded, the items in it MUST be sorted in the bytewise lexicographic order of their deterministic encodings of the map keys.
(Note that this is the same as the sorting in <xref section="4.2.1" sectionFormat="of" target="STD94"/> and not the same as <xref section="3.9" sectionFormat="of" target="RFC7049"/>.</t>
          </li>
        </ol>
      </section>
      <section anchor="DeterministicDecoding">
        <name>Decoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Decoders MUST meet the decoder requirements for <xref target="OrdinaryDecoding"/>.
That is, deterministic encoding imposes no requirements over and above the requirements for decoding ordinary serialization.</t>
          </li>
        </ol>
      </section>
      <section anchor="WhenDeterministic">
        <name>When to use Deterministic Serialization</name>
        <t>Most applications do not require deterministic encoding — even those that employ signing or hashing to authenticate or protect the integrity of data.
For example, the payload of a COSE_Sign message (See <xref target="RFC9052"/>) does not need to be encoded deterministically because it is transmitted along with the message.
The recipient receives the exact same bytes that were signed.</t>
        <t>Deterministic encoding becomes necessary only when the protected data is not transmitted as the exact bytes that are used for authenticity or integrity verification.
In such cases, both the sender and the receiver must independently construct the exact same sequence of bytes.
To guarantee this, the encoding must eliminate all variability and ambiguity.
The Sig_structure, defined in <xref section="4.4" sectionFormat="of" target="RFC9052"/>, is an example of this requirement.
Such designs are often chosen to reduce data size, preserve privacy, or meet other design constraints.</t>
        <t>The only difference between ordinary and deterministic serialization is map key sorting.
Sorting can be expensive in very constrained environments.
This is the only reason these two are not combined into one.</t>
        <t>Deterministically encoded data is always decodable, even by receivers that do not specifically support deterministic encoding.
Deterministic encoding can be helpful for debugging and such.
In environments where map sorting is not costly, it is acceptable and beneficial to always use it.
In such an environment, a CBOR encoder may produce deterministic encoding by default and may even omit support for ordinary encoding entirely.
But note that determinstic is never a substitue for general serialization where uses cases may require indefinite lengths, separate big numbers from integers in the data model, need non-trivial NaNs or other.</t>
      </section>
    </section>
    <section anchor="cddl-support">
      <name>CDDL Support</name>
      <t>TODO -- complete work and remove this comment</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations in <xref section="10" sectionFormat="of" target="STD94"/> apply.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO -- complete work and remove this comment before publication</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="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="STD94">
          <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>
        <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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8392">
          <front>
            <title>CBOR Web Token (CWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="May" year="2018"/>
            <abstract>
              <t>CBOR Web Token (CWT) is a compact means of representing claims to be transferred between two parties. The claims in a CWT are encoded in the Concise Binary Object Representation (CBOR), and CBOR Object Signing and Encryption (COSE) is used for added application-layer security protection. A claim is a piece of information asserted about a subject and is represented as a name/value pair consisting of a claim name and a claim value. CWT is derived from JSON Web Token (JWT) but uses CBOR rather than JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8392"/>
          <seriesInfo name="DOI" value="10.17487/RFC8392"/>
        </reference>
        <reference anchor="RFC9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
              <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="96"/>
          <seriesInfo name="RFC" value="9052"/>
          <seriesInfo name="DOI" value="10.17487/RFC9052"/>
        </reference>
        <reference anchor="RFC7049">
          <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="October" year="2013"/>
            <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>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="NaNBoxing" target="https://craftinginterpreters.com/optimization.html#nan-boxing">
          <front>
            <title>Crafting Interpreters</title>
            <author fullname="Robert Nystrom">
              <organization/>
            </author>
            <date year="2021" month="July"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 304?>

<section anchor="models">
      <name>Information Model, Data Model and Serialization</name>
      <t>To understand CBOR serialization and determinism, it's helpful to distinguish between the general concepts of an information model, a data model, and serialization.
These are broad concepts that can be applied to other serialization schemes like JSON and ASN.1</t>
      <table>
        <thead>
          <tr>
            <th align="left"> </th>
            <th align="left">Information Model</th>
            <th align="left">Data Model</th>
            <th align="left">Serialization</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Abstraction Level</td>
            <td align="left">Top level; conceptual</td>
            <td align="left">Realization of information in data structures and data types</td>
            <td align="left">Actual bytes encoded for transmission</td>
          </tr>
          <tr>
            <td align="left">Example</td>
            <td align="left">The temperature of something</td>
            <td align="left">A floating-point number representing the temperature</td>
            <td align="left">Encoded CBOR of a floating-point number</td>
          </tr>
          <tr>
            <td align="left">Standards</td>
            <td align="left"> </td>
            <td align="left">CDDL</td>
            <td align="left">CBOR</td>
          </tr>
          <tr>
            <td align="left">Implementation Representation</td>
            <td align="left"> </td>
            <td align="left">API Input to CBOR encoder library, output from CBOR decoder library</td>
            <td align="left">Encoded CBOR in memory or for transmission</td>
          </tr>
        </tbody>
      </table>
      <t>CBOR doesn't provide facilities for information models.
They are mentioned here for completeness and to provide some context.</t>
      <t>CBOR defines a palette of basic types that are the usual integers, floating-point numbers, strings, arrays, maps and other.
Extended types may be constructed from these basic types.
These basic and extended types are used to construct the data model of a CBOR protocol.
While not required, <xref target="RFC8610"/> may be used to describe the data model of a protocol.
The types in the data model are serialized per <xref target="STD94"/> to create encoded CBOR.</t>
      <t>CBOR allows certain data types to be serialized in multiple ways to facilitate easier implementation in constrained environments.
For example, indefinite-length encoding enables strings, arrays, and maps to be streamed without knowing their length upfront.</t>
      <t>Crucially, CBOR allows — and even expects — that some implementations will not support all serialization variants.
In contrast, JSON permits variations (e.g., representing 1 as 1, 1.0, or 0.1e1), but expects all parsers to handle them.
That is, the variation in JSON is for human readability, not to facilitate easier implementation in constrained environments.</t>
    </section>
    <section anchor="general-protocol-considerations-for-determinism">
      <name>General Protocol Considerations for Determinism</name>
      <t>This is the section that covers what is know as ALDR in some discussions.</t>
      <t><cref anchor="rfced">RFC Editor:</cref> Please remove above sentence before publication</t>
      <t>In addition to <xref target="DeterministicSerialization"/> and <xref target="Tags"/>, there are considerations in the design of any deterministic protocol.</t>
      <t>For a protocol to be deterministic, both the encoding (serialization) and data model (application) layer must be deterministic.
While deterministic serialization, <xref target="DeterministicSerialization"/>, ensures determinism at the encoding layer, requirements at the application layer may also be necessary.</t>
      <t>Here’s an example application layer specification:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>At the sender’s convenience, the birth date MAY be sent either as an integer epoch date or string date. The receiver MUST decode both formats.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>While this specification is interoperable, it lacks determinism.
There is variability in the data model layer akin to variability in the CBOR encoding layer when deterministic serialization is not required.</t>
      <t>To make this example application layer specification deterministic, specify one date format and prohibit the other.</t>
      <t>A more interesting source of application layer variability comes from CBOR’s variety of number types. For instance, the number 2 can be represented as an integer, float, big number, decimal fraction and other.
Most protocols designs will just specify one number type to use, and that will give determinism, but here’s an example specification that doesn’t:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>At the sender’s convenience, the fluid level measurement MAY be encoded as an integer or a floating-point number. This allows for minimal encoding size while supporting a large range. The receiver MUST be able to accept both integers and floating-point numbers for the measurement.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>Again, this ensures interoperability but not determinism — identical fluid level measurements can be represented in more than one way.
Determinism can be achieved by allowing only floating-point, though that doesn’t minimize encoding size.</t>
      <t>A better solution requires the fluid level always be encoded using the smallest representation for every particular value.
For example, a fluid level of 2 is always encoding as an integer, never as a floating-point number.
2.000001 is always be encoded as a floating-point number so as to not lose precision.
See the numeric reduction defined by dCBOR.</t>
      <t>Although this is not strictly a CBOR issue, deterministic CBOR protocol designers should be mindful of variability in Unicode text, as some characters can be encoded in multiple ways.</t>
      <t>While this is not an exhaustive list of application-layer considerations for deterministic CBOR protocols, it highlights the nature of variability in the data model layer and some sources of variability in the CBOR data model (i.e., in the application layer).</t>
    </section>
    <section anchor="Tags">
      <name>Deterministic Encoding for Popular Tags</name>
      <t>The definitions of the following tags in <xref target="RFC8610"/> allow variation in the data mode, thus it is useful to define a deterministic encoding for them should a particular deterministic protocol need one.
The tags defined in <xref target="RFC8610"/> but not mentioned here have no variability in their data model.</t>
      <section anchor="date-strings-tag-0">
        <name>Date Strings, Tag 0</name>
        <t>TODO -- complete this work and remove this comment before publication</t>
      </section>
      <section anchor="epoch-date-tag-1">
        <name>Epoch Date, Tag 1</name>
        <section anchor="encoder-requirements">
          <name>Encoder Requirements</name>
          <t>The integer form MUST be used unless one of the following applies: (1) the date is too far in the past or future to fit in a 64-bit integer of type 0 or 1, or (2) the date requires sub-second precision.
In these cases, the floating-point form MUST be used instead.</t>
        </section>
        <section anchor="decoder-requirements">
          <name>Decoder Requirements</name>
          <t>The decoder MUST decode both the integer and floating-point form.</t>
        </section>
      </section>
      <section anchor="big-numbers-tags-2-and-3">
        <name>Big Numbers, Tags 2 and 3</name>
        <t>See <xref target="OrdinarySerialization"/>.</t>
      </section>
      <section anchor="big-floats-and-decimal-fractions-tags-4-and-5">
        <name>Big Floats and Decimal Fractions, Tags 4 and 5</name>
        <section anchor="encoder-requirements-1">
          <name>Encoder Requirements</name>
          <t>The mantissa MUST be encoded in the preferred serialization form specified in Section 3.4.3 of RFC 8949.</t>
          <t>The mantissa MUST NOT contain trailing zeros.
For example, the decimal fraction with value 10 must be encoded with a mantissa of 1 and an exponent of 1.
For big floats, the mantissa must not include any trailing zero bits if encoded as a type 0 or 1 integer, and no trailing zero bytes if encoded as a big number</t>
        </section>
        <section anchor="decoder-requirements-1">
          <name>Decoder Requirements</name>
          <t>Both the integer and big number forms of the mantissa MUST be decoded.</t>
        </section>
      </section>
    </section>
    <section anchor="NaN">
      <name>IEEE 754 NaN</name>
      <t>This section provides background information on <xref target="IEEE754"/> NaN (Not a Number) and its use in CBOR.</t>
      <section anchor="basics">
        <name>Basics</name>
        <t><xref target="IEEE754"/> defines the most widely used representation for floating-point numbers, including special values for infinity and NaN.
NaN was originally designed to represent the result of invalid computations, such as division by zero.
Although IEEE 754 intended NaN primarily for local computation, NaN values are sometimes transmitted in network protocols, and CBOR supports their representation.</t>
        <t>An IEEE 754 NaN includes a payload of up to 52 bits (depending on precision), whose use is not formally defined.
The original intent was for vendor-specific diagnostic information explaining why a computation failed.
NaN values also include an unused sign bit.</t>
        <t>IEEE 754 distinguishes between quiet NaNs (qNaNs) and signaling NaNs (sNaNs):</t>
        <ul spacing="normal">
          <li>
            <t>A signaling NaN typically raises a floating-point exception when encountered.</t>
          </li>
          <li>
            <t>A quiet NaN does not raise an exception.</t>
          </li>
          <li>
            <t>The distinction is implementation-specific, but typically:
            </t>
            <ul spacing="normal">
              <li>
                <t>The highest bit of the payload is set --&gt; quiet NaN.</t>
              </li>
              <li>
                <t>Any other payload bit is set --&gt; signaling NaN.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>At least one payload bit must be set for a signaling NaN to distinguish it from infinity.</t>
          </li>
        </ul>
        <t>In this document:</t>
        <ul spacing="normal">
          <li>
            <t>A non-trivial NaN refers to any NaN that is not a quiet NaN.</t>
          </li>
          <li>
            <t>Non-trivial NaNs are often used to embed additional protocol information in the NaN payload.</t>
          </li>
        </ul>
      </section>
      <section anchor="implementation-support-for-non-trivial-nans">
        <name>Implementation Support for Non-Trivial NaNs</name>
        <t>This section discusses the extent of programming language and CPU support for NaN payloads.</t>
        <t>Although <xref target="IEEE754"/> has existed for decades, support for manipulating non-trivial NaNs has historically been limited and inconsistent.
Some key points:</t>
        <ul spacing="normal">
          <li>
            <t>Programming languages:  </t>
            <ul spacing="normal">
              <li>
                <t>The programming languages C, C++, Java, Pyhton and Rust do no provide APIs to set or extract NaN payloads.</t>
              </li>
              <li>
                <t>IEEE 754 is over thirty years old, enough time for support to be added if there was need.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>CPU hardware:  </t>
            <ul spacing="normal">
              <li>
                <t>CPUs use the distinction between signaling and quiet NaNs to determine whether to raise exceptions.</t>
              </li>
              <li>
                <t>A non-trivial NaN matching the CPU’s signaling NaN pattern may either trigger an exception or be converted into a quiet NaN.</t>
              </li>
              <li>
                <t>Instructions converting between single and double precision often discard or alter NaN payloads.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>As a result, applications that rely on non-trivial NaNs generally cannot depend on CPU instructions, floating-point libraries, or programming environments.
Instead, they usually need their own software implementation of IEEE 754 to encode and decode the full bit patterns to reliably process non-trivial NaNs.</t>
      </section>
      <section anchor="protocol-use-and-non-use-for-non-trivial-nans">
        <name>Protocol Use and Non-use for Non-Trivial NaNs</name>
        <t>One motivation for transmitting NaNs in CBOR is the technique known as NaN boxing (See <xref target="NaNBoxing"/>), used in some language runtimes (e.g., JavaScript engines) to represent multiple data types efficiently within a single 64-bit word.
Another motivation arises when applications that internally rely on NaNs are split across a protocol boundary.
For example, the R programming language uses non-trivial NaNs internally.</t>
        <t>By contrast, JSON can encode IEEE 754 floating-point numbers but explicitly disallows NaN in all forms.
As a result, CBOR protocols that allow NaN cannot be directly mapped to JSON.</t>
        <t>Protocols often require an out-of-band indicator to signal the absence of a value.
JSON uses <tt>null</tt> for this purpose, and CBOR protocols can also use <tt>null</tt> instead of NaN.</t>
      </section>
      <section anchor="NaNCompatibility">
        <name>Incompatibility with <xref target="STD94"/></name>
        <t>Although <xref target="STD94"/> is not entirely explicit about non-trivial NaNs, it is generally interpreted as supporting non-trivial NaNs in the CBOR generic data model.
It is also interpreted as requiring that non-trivial NaNs be reduce to their shortest form for preferred serialization — the opposite of "touch not the NaNs"</t>
        <t>This document diverges from that interpretation:</t>
        <ul spacing="normal">
          <li>
            <t>Ordinary serialization: Non-trivial NaNs are not allowed.
While ordinary serialization typically aligns with preferred serialization, it does not in the case of non-trivial NaNs.</t>
          </li>
          <li>
            <t>Deterministic serialization: Because deterministic serialization inherits from ordinary serialization, it also does not allow non-trivial NaNs.
This diverges from <xref section="4.2.1" sectionFormat="of" target="STD94"/> in this one specific way.</t>
          </li>
        </ul>
        <t>The divergence is justified by the following:</t>
        <ul spacing="normal">
          <li>
            <t>Non-trivial NaNs were not clearly specified in <xref target="STD94"/>.</t>
          </li>
          <li>
            <t>They are not well-supported across CPUs and programming environments.</t>
          </li>
          <li>
            <t>Implementing preferred serialization for non-trivial NaNs is complex and error-prone; many CBOR implementations don't support it or don't support it correctly.</t>
          </li>
          <li>
            <t>Practical use cases for non-trivial NaNs are extremely rare.</t>
          </li>
          <li>
            <t>Reducing non-trivial NaNs to a half-precision quiet NaN is simple and widely supported (e.g., <tt>isnan()</tt> can be used to detect all NaNs).</t>
          </li>
          <li>
            <t>Non-trivial NaNs remain supported by general serialization; the divergence is only for ordinary and deterministic serialization.</t>
          </li>
          <li>
            <t>A new CBOR tag could be defined in the future to explicitly support them if needed.</t>
          </li>
        </ul>
      </section>
      <section anchor="recommendations-for-use-of-non-trival-nans-in-cbor">
        <name>Recommendations for Use of Non-Trival NaNs in CBOR</name>
        <t>In summary, non-trival NaNs can be used in CBOR, but should primarily be used in systems that already use them and with full awareness that support in programming environments and CBOR libraries will be limited and inconsistent.</t>
        <t>For new protocols, non-trival NaNs, even all NaNs, can be avoided by using other CBOR protocol elements like null.
CBOR is powerful and flexible so as to allow data structures that can express an error detail or out-of-band value without using non-trival NaNs.
The advantage of avoiding NaN in CBOR protocols is that they can more easily be JSON protocols and one does not need to worry about programming environment and CPU hardware support.</t>
      </section>
    </section>
    <section anchor="examples-and-test-vectors">
      <name>Examples and Test Vectors</name>
      <t>TODO -- complete work and remove this comment before publication</t>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="R." surname="Mahy" fullname="Rohan Mahy">
        <organization>Rohan Mahy Consulting Services</organization>
        <address>
          <email>rohan.ietf@gmail.com</email>
        </address>
      </contact>
      <contact initials="J." surname="Hildebrand" fullname="Joe Hildebrand">
        <organization/>
        <address>
          <email>hildjj@cursive.net</email>
        </address>
      </contact>
      <contact initials="W." surname="McNally" fullname="Wolf McNally">
        <organization>Blockchain Commons</organization>
        <address>
          <email>wolf@wolfmcnally.com</email>
        </address>
      </contact>
      <contact initials="C." surname="Borman" fullname="Carsten Borman">
        <organization>Universität Bremen TZI</organization>
        <address>
          <email>cabo@tzi.org</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7Vd747bxnb/rqcgbKDXe68k767tJLvBvcja69xs4NiGd32D
tmhvRtRIYkyRCofcteIEyEP0S4H2W9+kb5In6fmdc2Y4pCjFQVsjiHclcubM
+f93PJlMRrfnyaPRqM7q3J4nz56+epNc2yozefajqbOySEwxTy5tbat1VmRu
PTKzWWVvhx4dzcu0MGtaZl6ZRT3JbL2YpLOymrj4sUluauvqUWrq88TV89Fo
Th+cj9KycLZwjTtP6qqxI1dX1qzPk6vnN1+Osk3FH7v69Pj47Ph0ZOjL8yS5
d7HZ5FnKCzuG9Y01+eQmW9t7o7uyeresymYj0I7e2S19ND9PANTo1hYNbZvQ
n/gh/F5vN3SKb+n1rFgmf8W3/PnaZLm8/QUONy2rJX9uqnR1ntxb1fXGnT98
iMfwUXZrp/65h/jg4awq75x9iBUe3pOts3rVzOhlRtTd8uFB3N0b0R/T1Kuy
Oh9NkqwgZL2YJi+aYj7LzdzSkkKBF6apbJHazlcExjmRLG2qrN4mNytbVtvk
xYtn9JWVo+XL/AunD9T8/TQt17QnEaeusllTy8ayyZtyZYrkG7PayuKmUDDj
r5JnRJkmr4FJYpfbLLWu3bDCc4ykL5b4hLfz639d2uSrLJ/bWUWUbV9a0Wff
f/8FgemA4sLW4ZVvy3yRfJO+NHm+C9TTvEzfpSuTFQTUek1wtWve0Ytf4H9r
4mF6uQPIM1O52hbJ07Jam2Jn3bcFgUGw1P/9X3XytLJrevTmn67axVMzK7+o
f8yYYUajAsvU9A64782Xz05PTs7OR/Tz9c3l2WNmyYkyKf3453M889nZ47OR
PP7ZJyfH9PV8nuODq+fPn3/6RN5KalMtLYmV58TMWvt+k5cVGNFaZkSS0oYg
rB9+9uknn5yensmLIv9YLLmuCdummieLskq+zEsD2k1el1lRJxfEGau1rbNU
GF9ZET9PhL+wBP/OUp0sTO4s/w5Gti4rFqU8n/jdSCDpAJPT45Mz/eLy1dV5
cnI8PTk5PnuIpwgxU3w/9TCPsE6ERcbLo7NTotW3NyP94Oz4CT54df3cf/Lp
8WPBdPLSvHxavqeDKTBeAUL6wKpXBam8TQXF5+SJ+Kx0Wv07SRZNnnt5mNmq
Tl5uSXUR9yQtFr5u8u04OT0+PdHdenRKddss2hUc+LDc1NlaGW26qtf5/cIU
kxlDDl0wmUwSM6P9TFqPRjerzCWevsncLrLCuqS+K0Vbd1QJaY57pAyzwpAS
6CoZ1qP35kHpE7W7T0zvja7qhChbkgqis86bFPusbIJXkntLW9jK5P1l65Ll
iR8E1sbJraEHZrmlJ+ukXHRfSHB4qHU5yJz2Sj58YK3488/T0U1JKFzZaoz1
HFatrAXPrhOTEO42OR1gcGGAamp6hqSWgVmb70vWifTkLqaShlZPjbNuChRj
r95yZIySHCTNt7wzfYxD3ZGs0Pqlw49zfJkBKhCHTjPb8t68H720bgqCYKo0
XWck3nY0ug9GZAQzJB/ux7/+PBo9NSmbOCIYCQNDldBzbseEt9Rc025kGTa1
S4hbNlV5S7ApctclgemAXTKjc2JCWnVLwLsViEd2P7N3BDW9N2s3DqJIWy0y
0pTTfZxY0Ns91FUGNARBCM66tusNix/tlhJGs8VWERjTPnnA9CssgS1PqQdw
NJWNzYaOZdJVYgtwl7BmFyeV/aHJWFUTHmi3mU1IU1bWOVp0Tt+kNehVJEFZ
0/6qqwmC3BTLxiztmJEr78OBKfMMEs/oZDyRwlvmlrmisivyb7CS29g0AN2H
WSni5GjElNjBgXOyFL9CK7d8VInXs8tJSeDuvARCifrCvn0KeOkiMliCGrzM
9CQjCIKNE7L6gbtZQZEJLZbWRCxOP5jtLpaxOLkT5Dj0pJd3iYSBIPuSjmXf
G3w2JhzYha0qeqtLNVpuaDVCX8oGvSdigK4k6F2z2ZSkmRl1BR84q+0kt8Wy
XpFUvxrUg1g2Rg5+93jgo0KX7YPUb7273TiB2qzj1Qaxegce33MyqIn7yV9V
zXa9cGEnQrvIvnPZshAJYOV7QDl7vXxYGzt1D7IfPRmuda9HeKnVzwAjLHdn
SPzLGkLGfAzmInD6Sn301yHoWLTIDjlsQIyJv1jpky3/Y3JRbBPBrYgAIVXU
zgM7XU7ZPDCGlyQPx6zQIOxFWkLtEVjH74+Px/T/k8+Oj8mHwX/0y9kx/RHZ
KxNWLZ2dFuoXJRv2iyq7JJSQqmEQb03eWNk+OZ7SMilpN9r0+P3iTPZamGP/
p7fH05JW9zyTDDEsUaCinYmRTFWZrSiAtdmIHSL0lHfgEFoqWyZFs55BSQCC
ykLBATMMoJpBecmV7dfMg2Se2CxyMERI4l1OPE7DkSI8mmQWNhwLYtNHj0+O
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
+r9p/W877/ifekmezzP+d3b+B0walrCfaQAA

-->

</rfc>
