<?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-lundblade-cbor-serialization-02" 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-lundblade-cbor-serialization-02"/>
    <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="October" day="11"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <keyword>cbor</keyword>
    <abstract>
      <?line 67?>

<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>
  </front>
  <middle>
    <?line 76?>

<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 preferred serialization, 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, <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 in any 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 payload bits 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 allows 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 <xref section="4.2.1" sectionFormat="of" target="STD94"/> does not mention big numbers.
It should have.
They are required indirectly by <xref section="4.2.1" sectionFormat="of" target="STD94"/> through the mention of 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 use 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 is required when the data being protected is NOT transmitted in the form needed for authenticity or integrity checks.
That is, the actual bytes that are checked have to be constructed independently by both the sender and the receiver.
The two independent constructions must produce exactly the same actual bytes, so there can be no variability or ambiguity in the encoding.
This is used in a protocol design for reasons such as reducing data size, addressing privacy concerns, or other 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>
      </references>
    </references>
    <?line 289?>

<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 CDER 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 CDER 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 otherwise 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 C standard does not define primitives to set or extract NaN payloads.</t>
              </li>
              <li>
                <t>Even modern C versions only provide the <tt>isnan()</tt> function to test if a value is a NaN.</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 TODO-REF, 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 them or don't support them 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:
H4sIAAAAAAAAA7Vd644bR3b+z6doSEBWWpDUzEiyPWPswiONtNZClgTNaI0k
SLLFZpFsq9lNd3XPiJYF+CHyJ0DyL2+SN/GT5HznnKquvnBWxiaCIc+Q3VWn
zv1ams1mk+uz5OFkUmd1bs+Sp09ev00ubZWZPPvJ1FlZJKZYJhe2ttU2KzK3
nZjForLXY49OlmVamC0ts6zMqp7lTbFc5GZpZ+mirGYufnaWm9q6epKa+ixx
9XIyWdIHZ5O0LJwtXOPOkrpq7MTVlTXbs+TFs6vnk2xX8ceuPjk6Oj06mRj6
8ixJ7pzvdnmW8sKOAX5rTT67yrb2zuSmrN6vq7LZCciT93ZPHy3PEgA1mUxM
U2/K6mwyS7KCdn05T156uCdJIud5aZrKFqntfFVW6zNCQNpUWb1Prja2rPbJ
y5dP6Su7NVl+luTr/BunD9T8/Twtt7QnnbKuskVTy8ayydtyY4rkO7PZy+Km
UFzFXyVP6YhNXmfFGsi/zlLr2g0rPDfPbL36Zo1PeDu//p9Lm3yb5Uu7qAhF
7Usb+uyHH74hMF12beeFrcMr35f5KvkufWXyfAjUk7xM36cbkxUE1HZLcLVr
3tCL3+CvLXEEvdwB5KmpXG2L5ElZbU0xWPddQWAQLPX//HedPKnslh69+qcX
7eKpWZTf1D9lc3qPkFlgmZreOaNH3j5/enJ8fHo2oZ8vry5OH+HDZKbUph//
cIZnvjp9dDqRx7/64viIvl4uc3zw4tmzZ18+lreS2lRrS/y5qeudO3vwILPW
ftjlZWXn+BH7PyCebwjC+sFXX37xxcnJqbwo0oTFksuasG2qZbIqq+R5XhrQ
bvamzIo6OSfO2GxtnaX8mmdF/DwT/sIS/DuLR7IyubP8O6TJuqxYlfJ84ncj
zqYDzE6Ojk/1i4vXL86S46P58fHR6QM8RYiZ4/u5h3mCdSIsMl4enp4Qrb6/
mugHp0eP8cHry2f+ky+PHgHTk8lsNkvMgmTVpPVkcrXJXOLxkiztKiusS+qb
UnRGRw+QxN0hacwKQ8LT+eYOC/KdZVA9hKXuE/M7kxd1QhgpSXTrqlw2KfbZ
2ASvJHfWtrCVyfvL1iXzIT+4avJ8mlwbemCRW3qyTspV94Wk3IlekYMsaa/k
40dWaZ8+zSdXJbHIxlZTrOewamUtaL1NTEJcv8vpAKMLA1RT0zPE7QzM1vxQ
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

-->

</rfc>
