<?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.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-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-ietf-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="2026" month="January" day="27"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <keyword>cbor</keyword>
    <abstract>
      <?line 99?>

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

<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="recommendations-summary">
      <name>Recommendations Summary</name>
      <t>This section is new in draft -02 and may change a lot as consensus is reached.</t>
      <section anchor="FrameworkProtocols">
        <name>Framework protocols</name>
        <t>Framework protocols are those that offer a wide range of options or alternatives, where interoperability depends on the sender and receiver making compatible choices.
Such protocols sometimes recommend the use of profiles to define interoperability requirements for specific applications.
They may also be referred to as toolbox or building-block protocols, reflecting their purpose of providing reusable mechanisms.
CBOR, CWT, COSE, and EAT are examples of framework protocols.</t>
        <t>It is RECOMMENDED that CBOR-based framework protocols not impose serialization requirements.
This allows individual applications or profiles to select the serialization approach most appropriate to their needs.</t>
        <t>An important exception to this recommendation applies when deterministic serialization is required for correct operation.
Deterministic serialization is typically necessary when data is hashed or signed but not directly transmitted, and instead is reconstructed independently by the sender and the receiver.</t>
        <t>See <xref target="COSESerialization"/> for a COSE-based detailed example.</t>
      </section>
      <section anchor="EndToEndProtocols">
        <name>End-to-end Protocol Specifications</name>
        <t>End-to-end protocols are specified such that interoperability is assured when they are implemented in accordance with the specification.
If the protocol includes options, these are typically selected through real-time negotiation between the communicating parties.
Such protocols often have formal interoperability compliance programs or organize interoperability testing events (for example, bake-offs).
TLS, HTTP, and FIDO are examples of end-to-end protocols.</t>
        <t>It is RECOMMENDED that CBOR-based end-to-end protocols require ordinary serialization, unless they have a specific need for a different serialization.</t>
        <t>One such specific need is deterministic serialization for data that is hashed or signed.
This requirement is often already stated explicitly in protocol specifications, and the recommendation to use ordinary serialization does not override it.
If deterministic serialization is required only for a subset of the protocol (e.g., COSE), the recommendation to use ordinary serialization still applies to the remainder of the protocol.</t>
        <t>Other specific serialization requirements typically arise to simplify implementation or to operate in highly constrained environments.
For example, the use of indefinite-length encodings enables streaming of arrays that are too large to fit entirely in memory.
See <xref target="SpecialSerializations"/> for a discussion of such special serializations.</t>
        <t>This recommendation is to ensure serialization interoperability: data encoded by the sender must always be decodable by the receiver.
Without an explicit serialization requirement, independent implementations may make incompatible choices.
For most use cases, requiring ordinary serialization is the simplest way to avoid this risk.
If a specialized serialization is used, it must still ensure full interoperability.</t>
        <t>If no serialization requirement is stated, general serialization is implied (<xref target="GeneralSerialization"/>).
In that case, the encoder can use any serialization and the receiver is expected to decode it.</t>
        <t>Finally, requiring deterministic serialization for an entire protocol will also ensure interoperability.
This approach is not the primary recommendation, however, because the required map sorting can be prohibitively expensive in some environments.</t>
        <t>Again, see <xref target="COSESerialization"/> for a COSE-based detailed example.</t>
      </section>
      <section anchor="cbor-libraries">
        <name>CBOR Libraries</name>
        <t>It is RECOMMENDED that CBOR libraries support ordinary serialization.
This can be achieved by conforming to the decoding requirements in <xref target="OrdinaryDecoding"/> and by making the encoding behavior defined in <xref target="OrdinaryEncoding"/> the default or primary encoding API.</t>
        <t>Ordinary serialization is recommended because it is suitable for the majority of CBOR-based protocols.
In practice, ordinary serialization is equivalent to preferred serialization for most use cases.</t>
        <t>It is also RECOMMENDED that CBOR libraries support deterministic serialization, as some protocols (for example, COSE) require it.
Relative to ordinary serialization, the only additional requirement for deterministic serialization is that encoded maps be sorted.
This recommendation is particularly strong for environments in which map sorting is easy to implement (for example, Python, Go, and Ruby).</t>
        <t>A CBOR library may choose to implement only deterministic serialization and make it the default.
Deterministic serialization is a superset of ordinary serialization; therefore, if deterministic serialization is fully supported, explicit support for ordinary serialization may be omitted.</t>
        <t>A CBOR library MAY also choose to support some or all aspects of general serialization as described in <xref target="GeneralSerialization"/>.
Doing so enables the library to be used for implementing specialized serializations, as described in <xref target="SpecialSerializations"/>.</t>
      </section>
      <section anchor="libraries-for-cbor-based-framework-protocols">
        <name>Libraries for CBOR-based framework protocols</name>
        <t>It is RECOMMENDED that libraries implementing framework protocols support ordinary serialization.
For example, a CWT or COSE library should support ordinary serialization.</t>
        <t>If a framework protocol requires deterministic serialization (for example, COSE), the library must also support deterministic serialization.</t>
        <t>If appropriate for the library’s deployment environment and design goals, a library may choose to support only deterministic serialization for the entire protocol.</t>
      </section>
    </section>
    <section anchor="GeneralSerialization">
      <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>
      <section anchor="WhenGeneral">
        <name>When To Use General Serialization</name>
        <t>Ordinary serialization (<xref target="OrdinarySerialization"/>) satisfies the vast majority of CBOR use cases; therefore, the need for general serialization is rare and arises only in unusual circumstances.
The following are representative examples:</t>
        <ul spacing="normal">
          <li>
            <t>Enable on-the-fly, streaming encoding of strings, arrays, and maps with indefinite lengths.
This is useful when an array, map, or string is many times larger than the available memory on the encoding device.</t>
          </li>
          <li>
            <t>Directly encode or decode integer values from hardware registers with fixed-size integer encoding.
CBOR is sufficiently simple that encoders and decoders for some protocols can be implemented solely in hardware without any software.
Fixed-size integer encoding allows values to be copied directly in and out of hardware registers.</t>
          </li>
          <li>
            <t>Enable in place update of the lengths of strings, arrays and maps by using fixed-size encoding of their lengths.
For example, if the length of a string is always encoded in 32 bits, increasing the length from 2^16 to 2^16+1, requires only overwriting the length field rather than shifting all 2^16 bytes of content.</t>
          </li>
          <li>
            <t>Transmission of non-trivial NaNs in floating-point values (see <xref target="NaN"/>).</t>
          </li>
        </ul>
        <t>Except for non-trivial NaNs, the other serializations can encode the same data types and value ranges as general serialization.
Its purpose is solely to simplify or optimize encoding in atypical constrained environments.
The choice of serialization is orthogonal to the data model.
See also the section on special serializations in <xref target="SpecialSerializations"/>.</t>
      </section>
      <section anchor="general-serialization-is-the-default">
        <name>General Serialization is the Default</name>
        <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>
      </section>
    </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 MUST be ignored.</t>
              </li>
              <li>
                <t>An empty string MUST be accepted and treated as the value zero.</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>See also <xref target="BigNumbersDataModel"/> and <xref target="BigNumberStrategies"/> for further background on big numbers.</t>
      </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>See <xref target="WhenGeneral"/> for uses cases where ordinary serialization may not be suitable.
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>
          <li>
            <t>For big numbers, leading zeros must be ignored and the empty string must be accepted as zero.</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>In the basic generic data model, maps are unordered (See <xref section="5.6" sectionFormat="of" target="STD94"/>).
Applications MUST NOT rely on any particular map ordering, even if the data was produced using deterministic serialization.
A CBOR library is not required to preserve the order of keys when decoding a map, and the underlying programming language may not preserve map order either— for example, the Go programming language provides no ordering guarantees for maps.
The sole purpose of map sorting in deterministic serialization is to ensure reproducibility of the encoded byte stream, not to provide any semantic ordering of map entries.
If an application requires a map to be ordered, it is responsible for applying its own sorting.</t>
        <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>Deterministic serialization, as defined in this document, can be decoded by any ordinary or general-purpose serialization decoder described here.
It is also compatible with the preferred serialization decoding described in <xref target="STD94"/>.
Deterministic serialization 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 deterministic is never a substitute 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="SpecialSerializations">
      <name>Special Serializations</name>
      <t>Although discouraged, defining special serializations that differ from those specified here is permitted.
For example, a use case might require deterministim from a protocol that uses indefinite lengths.
For another example, a protocol may require only a subset of general serialization features — for instance, fixed-length integer encodings but not indefinite lengths.</t>
      <t>A recommended way to define a special serialization is to describe it as ordinary or deterministic serialization with additional constraints or extensions.
For example, a protocol requiring deterministic streaming of maps and arrays can be defined as follows:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>Deterministic serialization MUST be used, but all maps and arrays MUST be encoded with indefinite lengths, never definite lengths.
Strings are still encoded with definite lengths.
Maps are still to be ordered as required by deterministic serialization.</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="CDDL-Operators">
      <name>CDDL Control Operators</name>
      <t>Four new control operators are defined for use in CDDL <xref target="RFC8610"/>.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Purpose</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">.ord</td>
            <td align="left">Use ordinary serialization for a data item</td>
          </tr>
          <tr>
            <td align="left">.ordseq</td>
            <td align="left">Use ordinary serialization for a CBOR sequence</td>
          </tr>
          <tr>
            <td align="left">.det</td>
            <td align="left">Use deterministic serialization for a data item</td>
          </tr>
          <tr>
            <td align="left">.detseq</td>
            <td align="left">Use deterministic serialization for a CBOR sequence</td>
          </tr>
        </tbody>
      </table>
      <t>These operators have the same semantics as the .cbor and .cborseq operators (See <xref section="3.8.4" sectionFormat="of" target="RFC8610"/>) with the additional requirement for ordinary or deterministic serialization.
These specify that what is in the “controller” (the right side of the operator) be serialized as indicated.</t>
      <t>For example, a byte string containing embedded CBOR that must be deterministically encoded can be described in CDDL as:</t>
      <artwork><![CDATA[
leaf = #6.24(bytes .det any)
]]></artwork>
      <t>The scope of these operators applies recursively through nested arrays and maps, but does not extend into byte strings or other data items that happen to contain encoded CBOR.
Every instance of embedded CBOR that requires constrained serialization must specify that constraint explicitly.
See also <xref target="ByteStringWrapping"/>.</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><cref anchor="to-be-removed">RFC Editor: please replace RFCXXXX with the RFC
number of this RFC and remove this note.</cref></t>
      <t>This document requests IANA to register the contents of
<xref target="tbl-iana-reqs"/> into the registry
"<xref section="CDDL Control Operators" relative="#cddl-control-operators" sectionFormat="bare" target="IANA.cddl"/>" of the
<xref target="IANA.cddl"/> registry group:</t>
      <?v3xml2rfc table_borders="light" ?>

<table anchor="tbl-iana-reqs">
        <name>New control operators to be registered</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">.ord</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.ordseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.det</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.detseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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>
        <reference anchor="IANA.cddl" target="https://www.iana.org/assignments/cddl">
          <front>
            <title>Concise Data Definition Language (CDDL)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
      </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="RFC9413">
          <front>
            <title>Maintaining Robust Protocols</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="June" year="2023"/>
            <abstract>
              <t>The main goal of the networking standards process is to enable the long-term interoperability of protocols. This document describes active protocol maintenance, a means to accomplish that goal. By evolving specifications and implementations, it is possible to reduce ambiguity over time and create a healthy ecosystem.</t>
              <t>The robustness principle, often phrased as "be conservative in what you send, and liberal in what you accept", has long guided the design and implementation of Internet protocols. However, it has been interpreted in a variety of ways. While some interpretations help ensure the health of the Internet, others can negatively affect interoperability over time. When a protocol is actively maintained, protocol designers and implementers can avoid these pitfalls.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9413"/>
          <seriesInfo name="DOI" value="10.17487/RFC9413"/>
        </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="CTAP2" target="https://fidoalliance.org/specs/fido-v2.0-ps-20190130/fido-client-to-authenticator-protocol-v2.0-ps-20190130.html">
          <front>
            <title>Client To Authenticator Protocol v2</title>
            <author>
              <organization>W3C</organization>
            </author>
            <date/>
          </front>
        </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>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>dCBOR: Deterministic CBOR</title>
            <author fullname="Wolf McNally" initials="W." surname="McNally">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Christopher Allen" initials="C." surname="Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Laurence Lundblade" initials="L." surname="Lundblade">
              <organization>Security Theory LLC</organization>
            </author>
            <date day="20" month="December" year="2025"/>
            <abstract>
              <t>   The purpose of determinism is to ensure that semantically equivalent
   data items are encoded into identical byte streams.  CBOR (RFC 8949)
   defines "Deterministically Encoded CBOR" in its Section 4.2, but
   leaves some important choices up to the application developer.  The
   present document specifies dCBOR, a set of narrowing rules for CBOR
   that can be used to help achieve interoperable deterministic encoding
   for a variety of applications desiring a narrow and clearly defined
   set of choices.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-16"/>
        </reference>
      </references>
    </references>
    <?line 475?>

<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 <xref target="I-D.mcnally-deterministic-cbor"/>.</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>If the encoder supports floating-point dates, it MUST use the integer representation unless one of the following applies: (1) the date is outside the range representable by a 64-bit integer of major type 0 or 1, or (2) the date has a non-zero fraction of a second. In either case, the floating-point representation MUST be used.</t>
        </section>
        <section anchor="decoder-requirements">
          <name>Decoder Requirements</name>
          <t>If the decoder supports floating-point dates, it MUST be able to decode both the integer and the floating-point representations.</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.
It includes 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.
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>A non-trivial NaN is used to carry additional, protocol-specific information within floating-point values.</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 sometimes 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="use-and-non-use-for-non-trivial-nans">
        <name>Use and Non-use for Non-Trivial NaNs</name>
        <t>Non-trivial NaNs, excluding signaling NaNs, are not produced by standard floating-point operations.
They are typically created at the application level, where software may take advantage of unused bits in the NaN payload.
Such uses are rare and unusual, but they do exist.</t>
        <t>One example is the R programming language, which is designed for statistical computing and therefore operates heavily on numeric data.
R uses NaN payloads to distinguish various error or missing-data conditions beyond standard computational exceptions such as division by zero.</t>
        <t>Another example is NaNboxing (see <xref target="NaNBoxing"/>), a technique used by some language runtimes — such as certain JavaScript engines — to efficiently represent multiple data types within a single 64-bit word by storing type tags or pointers in the NaN payload.
(CBOR can represent such payloads, but NaNboxed pointers are generally not meaningful or portable across machines, and therefore are usually unsuitable for network transmission or file storage.)</t>
        <t>CBOR’s NaN-payload support can be leveraged if data from these systems must be transmitted over a network or written to persistent storage.</t>
        <t>A designer of a new protocol that makes extensive use of floating-point values might be tempted to use NaN payloads to encode out-of-band information such as error conditions.
For example, NaN payloads could be used to distinguish situations such as sensor offline, sensor absent, sensor error, or sensor out of calibration.
While this is technically possible in CBOR, it comes with significant drawbacks:</t>
        <ul spacing="normal">
          <li>
            <t>Ordinary and deterministic serialization cannot be used for this protocol.</t>
          </li>
          <li>
            <t>Support for NaN payloads is unreliable across programming environments and CBOR libraries.</t>
          </li>
          <li>
            <t>Values cannot be translated directly to JSON, which does not support NaNs of any kind.</t>
          </li>
        </ul>
      </section>
      <section anchor="clarification-of-std94">
        <name>Clarification of <xref target="STD94"/></name>
        <t>This is a clarifying restatement of how NaNs are to be treated according to <xref target="STD94"/>.</t>
        <t>NaNs represented in floating-point values of different lengths are considered equivalent in the basic generic data model if:</t>
        <ul spacing="normal">
          <li>
            <t>Their sign bits are identical, and</t>
          </li>
          <li>
            <t>Their significands are identical after both significands are zero-extended on the right to 64 bits</t>
          </li>
        </ul>
        <t>This equivalence is established for the entire CBOR basic generic data model.
A NaN encoded as half-, single-, or double-precision is equivalent whenever it satisfies the rules above.
This remains true regardless of how a CBOR library accepts, stores, or presents a NaN in its API.
At the application layer, the equivalence still holds.
The only way to avoid this equivalence is by using a tag specifically designed to carry NaNs without these equivalence rules, since tags extend the data model unless otherwise specified.</t>
        <t>The equivalence is similar to how the floating-point value 1.0 is treated as the same value regardless of the precision used to encode it.
Some floating-point values cannot be represented in shorter formats (e.g., 2.0e+50 cannot be encoded in half-precision).
The same is true for some NaNs.</t>
        <t>In preferred serialization, this equivalence MUST be used to shorten encoding length.
If a NaN can be represented equivalently in a shorter form (e.g., half-precision rather than single-precision), then the shorter representation MUS be used.</t>
        <t>This equivalence also applies when floating-point values are used as map keys.
A map key encoded as half-precision MUST be considered a duplicate of one encoded as double-precision if they meet the equivalence rules above.</t>
        <t>However, this equivalence does not apply to map sorting.
Sorting operates on the fully encoded and serialized representation, not on the abstract data model.</t>
        <t>It is <xref section="2" sectionFormat="of" target="STD94"/> that establishes this equivalence by stating that the number of bytes used to encode a floating-point value is not visible in the data model.
<xref section="4.1" sectionFormat="of" target="STD94"/> defines preferred serialization.
It requires shortest-length encoding of NaNs including instructions on how to do it.
<xref section="5.6.1" sectionFormat="of" target="STD94"/> describes how NaNs are treated as equivalent when used as map keys.
These three parts of <xref target="STD94"/> are consistent and are the basis of this restatement.</t>
        <t>Since <xref section="4.2.1" sectionFormat="of" target="STD94"/>, (Core Deterministic Encoding Requirements), explicitly requires preferred serialization, compliant deterministic encodings must use the shortest equivalent representation of NaNs.</t>
        <t>Finally, <xref section="4.2.2" sectionFormat="of" target="STD94"/> discusses alternative approaches to deterministic encoding.
It suggests, for example, that all NaNs may be encoded as a half-precision quiet NaN.
This section is distinct from the Core Deterministic Encoding Requirements and represents an optional alternative for handling NaNs.</t>
      </section>
      <section anchor="NaNCompatibility">
        <name>Divergence from <xref target="STD94"/></name>
        <t>Orindary and deterministic serialization defined in this document diverge from the preferred serialization requirement in <xref target="STD94"/> for shortest-length encoding of NaNs:</t>
        <ul spacing="normal">
          <li>
            <t>Ordinary serialization: Non-trivial NaNs are not allowed.
While ordinary serialization largely 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 is the single aspect of deterministic serialization that is different from <xref section="4.2.1" sectionFormat="of" target="STD94"/>.</t>
          </li>
        </ul>
        <t>The divergence is justified by the following:</t>
        <ul spacing="normal">
          <li>
            <t>Encoding and equivalence of non-trivial NaNs was a little unclear <xref target="STD94"/>.</t>
          </li>
          <li>
            <t>IEEE 754 doesn't set requirements for their handling.</t>
          </li>
          <li>
            <t>Non-trivial NaNs 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 supported by programming environments (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 can be defined in the future to explicitly support them.</t>
          </li>
        </ul>
      </section>
      <section anchor="recommendations-for-use-of-non-trival-nans">
        <name>Recommendations for Use of Non-Trival NaNs</name>
        <t>While non-trivial NaNs are excluded from ordinary and deterministic serialization, they are theoretically supported by <xref target="STD94"/>.
General serialization does support them.</t>
        <t>New protocol designs can — and generally should—avoid non — non-trivial NaNs.
Support for them is unreliable, and it is straightforward to design CBOR-based protocols that do not depend on them.
In many cases, the use of NaN can be replaced entirely with null.
JSON requires use of null as it does not support NaNs at all.</t>
        <t>The primary use case for non-trivial NaNs is existing systems that already use them.
For example, a program that relies on non-trivial NaNs internally may need to serialize its data to run across machines connected by a network.</t>
      </section>
    </section>
    <section anchor="BigNumbersDataModel">
      <name>Big Numbers and the CBOR Data Model</name>
      <t><cref anchor="to-be-removed3">Note that the CBOR Working Group agreed in January of 2026 to accept the big number / integer equivalence described here, but not allow any tags in the future to affect the data model. This is noted here for now, but probably out of scope for this document on serialization and needs to go somehere else, like an update to IANA CBOR tag experts.</cref></t>
      <t>The primary purpose of this document is to define ordinary and deterministic serialization.
Accordingly, <xref target="OrdinarySerialization"/> describes CBOR’s unified integer space in terms of serialization behavior.
This is an effective and clear way to describe what implementors must do.
An implementation that follows the requirements in <xref target="OrdinarySerialization"/> will be complete and correct with respect to serialization.</t>
      <t>From a conceptual perspective, however, additional discussion is warranted regarding the CBOR data model itself.
That discussion is provided in this appendix.
(Please review <xref target="models"/> for background on the difference between serialization and the data model).</t>
      <t>In the basic, generic CBOR data model, each tag represents a distinct data type (<xref section="2" sectionFormat="of" target="STD94"/>).
Tags are also distinct from the major types, such as numbers and strings.
By this, an integer value such as 0 or 1 encoded as major type 0 is clearly distinct in the data model from the same integer value encoded as tag 2.</t>
      <t>However, the text in <xref section="3.4.3" sectionFormat="of" target="STD94"/> overrides this by defining these encodings to be equivalent rather than distinct.
This text therefore modifies the CBOR data model.
No other serialization requirement in <xref target="STD94"/> or in this document alters the data model; this equivalence is the sole exception.
This is unusual because the data model is otherwise orthogonal to serialization.</t>
      <t>Further, <xref section="3.4.3" sectionFormat="of" target="STD94"/>  along with text in <xref section="2" sectionFormat="of" target="STD94"/> are interpreted such that there is never a CBOR data model where there is a distinction between these integer representations.
That is, the equivalence applies regardless of the serialization even though much of the relevant text appears in proximity to discussions of serialization.</t>
      <t>This document does not attempt to update or revise the text of <xref section="3.4.3" sectionFormat="of" target="STD94"/>.
Rather, it records the commonly accepted interpretation of that text and its implications for the CBOR data model.</t>
    </section>
    <section anchor="BigNumberStrategies">
      <name>Big Number Implementation Strategies</name>
      <t><xref target="BigNumbersDataModel"/> describes how CBOR defines a single integer number space, in which big numbers are not distinct from values encoded using major types 0 and 1.
This appendix discusses approaches for implementers to support that model.</t>
      <t>Some programming environments provide strong native support for big numbers (e.g., Python, Ruby, and Go), while others do not (e.g., C, C++, and Rust).
Even in environments that support big numbers, operations on native-sized integers (e.g., 64-bit integers) are typically much more efficient.
It is therefore reasonable for a CBOR library to expose separate APIs for native-sized integers and for big numbers.</t>
      <t>When a CBOR library provides a big number API, values that fall within the range of major types 0 and 1 must be encoded using those major types rather than tags 2 or 3.
Similarly, decoding facilities that return big numbers must accept values encoded using major types 0 and 1, even though the returned representation is a big number.</t>
      <t>Alternatively, some CBOR libraries may choose to return tags 2 and 3 as raw byte strings, as this approach is simpler than implementing full big number support.
When a library adopts this approach, it should clearly document that the application layer is responsible for performing the integer unification.
The application is also responsible for handling CBOR’s offset-by-one encoding of negative values and the extended negative integer range permitted by major type 1.</t>
      <t>In most cases, these additional processing steps are straightforward when the application already uses a big number library.</t>
      <t>Another acceptable approach is for a CBOR library to provide a generic mechanism that allows applications to register handlers for specific tags.
In this case, handlers for tags 2 and 3 MUST perform the required unification with major types 0 and 1.</t>
      <t>Finally, note that big numbers are not a widely used feature of CBOR.
Some CBOR libraries may entirely omit support for tags 2 and 3.</t>
    </section>
    <section anchor="serialization-checking">
      <name>Serialization Checking</name>
      <t>Serialization checking rejects input which, while well-formed CBOR, does not conform to a particular serialization rule set it is enforcing.
For example, a decoder checking for deterministic serialization will error out if map keys are not in the required sorted order.
Likewise, a decoder checking for ordinary serialization will reject any CBOR data item that is not encoded in its shortest form.</t>
      <t>This type of checking goes beyond the basic requirement of verifying that input is well-formed CBOR.
The data rejected by serialization checking is well-formed; it is rejected because it violates additional serialization constraints.</t>
      <section anchor="serialization-checking-use-cases">
        <name>Serialization Checking Use Cases</name>
        <t>Some applications that rely on deterministic serialization may choose serialization checking in order to ensure that the data they consume is truly deterministic and that the assumptions their logic makes about determinism hold.</t>
        <t>Some protocol environments may use serialization checking to minimize representational variants as a strategy to improve interoperability.
Discouraging variants early prevents them from compounding.
See <xref target="RFC9413"/> on maintaining robust protocols.</t>
        <t>Serialization checking may enhance security in certain contexts, but such checking is never a substitute for correct and complete CBOR input validation.
All CBOR decoders — regardless of their capabilities, modes, or optional features — must always perform full input validation. This includes rejecting CBOR features the decoder does not support.
For example, a decoder that does not support indefinite-length items must reject them because they are unsupported, not because it is acting as a checking decoder.</t>
        <t>Decoders that fail to perform this essential input validation are fundamentally inadequate and represent a security risk.
The appropriate remedy is to fix their input validation, not to add the serialization checking described here.</t>
      </section>
    </section>
    <section anchor="ByteStringWrapping">
      <name>CBOR Byte String Wrapping</name>
      <t>This appendix provides non-normative guidance on byte-string wrapping of CBOR.
It applies primarily to tag 24 and the CDDL .cbor and .cborseq control operators, but also to the serialization-specifying control operators described in <xref target="CDDL-Operators"/>.</t>
      <section anchor="purpose">
        <name>Purpose</name>
        <dl>
          <dt>Error isolation:</dt>
          <dd>
            <t>Wrapping CBOR in a byte string prevents encoding errors in the wrapped data from causing the enclosing CBOR to fail during decoding.
(CBOR decoding generally halts at the first error and lacks internal length redundancy found in formats like ASN.1/DER.)</t>
          </dd>
          <dt>CBOR library support for signing and hashing:</dt>
          <dd>
            <t>When wrapped CBOR needs to be signed or hashed, its original encoded bytes must be available.
Most CBOR libraries cannot directly extract the raw bytes of substructures, but byte-string wrapping provides direct access to the exact bytes for signing or hashing.</t>
          </dd>
          <dt>Protocol embedding:</dt>
          <dd>
            <t>Byte-string wrapping is generally useful when messages from one CBOR-based protocol need to be embedded within another CBOR protocol.</t>
          </dd>
          <dt>Special map keys:</dt>
          <dd>
            <t>Some CBOR libraries only support simple, non-aggregate map keys (e.g., integers or strings).
To use complex data types like arrays and maps as map keys, they can be wrapped in a byte string.</t>
          </dd>
        </dl>
      </section>
      <section anchor="wrapping-recommendations">
        <name>Wrapping Recommendations</name>
        <t>The serialization requirements for the wrapping CBOR may differ from those for the wrapped CBOR.
CBOR itself imposes no universal rule that they must match; this is determined by the design of the wrapping protocol.</t>
        <t>The wrapping protocol should not impose serialization requirements on the wrapped message.
The two should be treated as independent entities.
This approach avoids potential conflicts between serialization rules.</t>
        <t>For example, assume protocol XYZ wraps protocol ABC.
If protocol ABC requires Canonical CBOR as specified in <xref section="3.9" sectionFormat="of" target="RFC7049"/> (e.g., <xref target="CTAP2"/> from WebAuthn) while protocol XYZ requires deterministic serialization, <xref target="DeterministicSerialization"/>, a conflict would arise.</t>
        <t>Most CBOR data to be signed or hashed does not require a specific serialization.
CBOR, being a modern, fully specified, binary protocol, does not need canonicalization, wrapping, or armoring like other data representation formats such as JSON.
See the discussion in <xref target="WhenDeterministic"/>.</t>
      </section>
      <section anchor="cbor-library-implementation-suggestion">
        <name>CBOR Library Implementation Suggestion</name>
        <t>A straightforward implementation strategy is to instantiate a second CBOR encoder or decoder for the wrapped message.
However, this may be suboptimal in memory-constrained environments, as it may require both a duplicate copy of the wrapped data and an additional encoder/decoder instance.</t>
        <t>A more efficient approach can be for the CBOR library to treat the wrapped CBOR like a container (similar to arrays or maps).
Many CBOR implementations already handle arrays and maps as containers without requiring a separate instance.
Similarly, a byte-string wrapping encoded CBOR can be treated as a container that always contains exactly one item.</t>
      </section>
    </section>
    <section anchor="COSESerialization">
      <name>Serialization for COSE</name>
      <t><cref anchor="to-be-removed2">This is new in the -02 draft. It aims to be a comprehensive example of some key concepts. There may not be consensus for this appendix.</cref></t>
      <t>COSE <xref target="RFC9052"/> is a framework protocol, not and end-end protocol.
It has many messages types, allows many algorithms and leaves serialization open for most protocol elements.
It does hashing and signing.
It is thus a good framework protocol to make an example out of.</t>
      <t>This focuses on COSE_Sign1 (<xref section="4.2" sectionFormat="of" target="RFC9052"/>) as the simplest COSE structure that can illustrate several concepts described in this document.
COSE_Sign1 serialization can be discussed in three parts:</t>
      <ul spacing="normal">
        <li>
          <t>The payload</t>
        </li>
        <li>
          <t>The Sig_structure (<xref section="4.4" sectionFormat="of" target="RFC9052"/>).</t>
        </li>
        <li>
          <t>The encoded message (the header parameters and the array of four that is the COSE_Sign1)</t>
        </li>
      </ul>
      <section anchor="cose-payload-serialization">
        <name>COSE Payload Serialization</name>
        <t>The payload may or may not be CBOR, but let’s assume it is, perhaps a CWT or EAT.
The payload is transmitted from the signer/sender fully in tact all the way to the verifier/receiver.
Because it is transmitted fully in tact, CBOR is a binary protocol and intermediaries do not do things like wrap long lines or add base 64 encoding or such, it is not special in anyway and COSE imposes no serialization restrictions on it at all.
That is, it can use any serialization it wants.
The serialization is selected by the protocol that defines the payload, not by COSE.</t>
        <t>This highlights the principle that determinism is often NOT needed for signing and hashing described in <xref target="WhenDeterministic"/>.</t>
        <t>It is also worth noting that the payload is byte string wrapped.
This is not for determinism or armoring or canonicalization.
It is so that the payload can be any data format, including not CBOR.
It is also so CBOR libraries can return the CBOR-encoded payload for processing by the verification algorithms
Most CBOR libraries do not provide access to chunks of encoded CBOR in the middle of a message.</t>
        <t>This is an example of byte string wrapping described in <xref target="ByteStringWrapping"/>.</t>
      </section>
      <section anchor="cose-sigstructure">
        <name>COSE Sig_structure</name>
        <t>The Sig_struct is not conveyed from the sender to the receiver, but rather constructed independently by the sender and reciever.
This is the input to the signing process so it must be deterministic.
That is, COSE explicitly requires this to be deterministicall encoded so that both the sender and receiver construct exactly the same encoded CBOR.
<xref section="9" sectionFormat="of" target="RFC9052"/> gives this requirement.
The COSE requirement is the same as deterministic serialization <xref target="DeterministicSerialization"/> (unless floating-point numbers with NaN payloads appear in a header parameter).</t>
        <t>This is an example of the need for deterministic serialization for signed data that is not transmitted in its signed form. See <xref target="WhenDeterministic"/>.</t>
      </section>
      <section anchor="the-encoded-message">
        <name>The Encoded Message</name>
        <t>A COSE_Sign1 structure is an array of four elements containing, in order, two header parameter chunks, the payload, and the signature.
The two header parameter chunks are maps that hold the various header parameters.
COSE places no serialization requirements on these elements.
The COSE protocol functions correctly regardless of the specific CBOR serialization used,as long as the decoder can decode what the encoder sends.</t>
        <t>In this respect, the serialization of this portion of a COSE message is no different from that of any other CBOR-based protocol.
Indefinite-length items MAY be used, and fixed-length (i.e., non–shortest-length) CBOR encodings are permitted.
The only requirement is that the encoded data be decodable by the receiver.</t>
        <t>That said, for most use cases and for practical interoperability reasons, ordinary serialization is a good choice for this part of the COSE_Sign1 structure.</t>
        <t>This serves as an example of the general recommendations for CBOR-based protocols described in this document and summarized in TODO:Recommendations Reference.</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>
      <contact initials="A." surname="Rundgren" fullname="Anders Rundgren">
        <organization/>
        <address>
          <email>anders.rundgren.net@gmail.com</email>
        </address>
      </contact>
      <contact initials="V." surname="Goncharov" fullname="Vadim Goncharov">
        <organization/>
        <address>
          <email>vadimnuclight@gmail.com</email>
        </address>
      </contact>
      <contact initials="K." surname="Takayama" fullname="Ken Takayama">
        <organization/>
        <address>
          <email>ken.takayama.ietf@gmail.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIACQLeWkAA7V96ZLb2JXmfz4FQoqYVrZJKjMlVVmqttuppcryqCSFlNXV
y7h7QBIkYYEADYCZYquqw+8w/WciZv7Nm8yb+EnmfGe5CxZKDsdkVJQySeAu
55579mU2m01uniQPJpM2b4vsSfLs6Zt3yfusztMi//e0zasySctV8jxrs3qX
l3mzm6SLRZ3dDD06WVXLMt3RMKs6XbezPGvXs+WiqmdN+NisSNusaSfLtH2S
NO1qMlnRB08my6pssrI5NE+Stj5kk6ats3T3JHn54vrbSb6v+eOmvTw/f3x+
OUnpyydJcudqvy/yJQ/c8FrfZWkxu8532Z3JbVV/2NTVYS+rnXzIjvTR6kmC
RU1usvJA0yb0Ez6Ev9vjnnbxI72el5vkO3zLn+/SvJC3f4PNzat6w5+n9XL7
JLmzbdt98+T+fTyGj/KbbG7P3ccH9xd1ddtk9zHC/Tsydd5uDwt6mQF1u7l/
EnZ3JvSTHtptVT+ZzJK8JGC9mievDuVqUaSrjIaUE3iVHuqsXGbRV7SMJ3Rk
y0Odt8fkeptV9TF59eoZfZXJ1opN8ZtGH2j5+/my2tGcdDhtnS8OrUwsk7yr
tmmZfJ9ujzJ4Wuoyw6+SZ3Qyh6IFJAldbvJl1vgJazzHQPrNBp/wdDb+76os
+W1erLJFTSfrX9rSZ3/4w29omQ1AXGate+XHqlgn3y9fp0XRX9TTolp+WG7T
vKRF7Xa0Lj/mLb34G/xvRzhML0cLeZbWTZuVydOq3qVlb9wfSloGraX9v/+n
TZ7W2Y4evf7nl37wZbqoftP+e84IY4NelSt6KXlHB7Shs/JPp/zFvNYvsL8B
4PxDusp3yXdVSRuqqxv/+g2+KA/LIt9sh178r1hd+iE9prvUv/WBJmr10+55
TErsu6VN4rq8+/bZ5cXF4ycT+v399fPHD/kOzfRW0a+/eoJnfvn44eOJPP7L
ry7O6evVqsAHL1+8ePH1I3kradN6kxEdsKuTZ1n2cV9UNW5OlvHNIbJyIJC2
93/59VdfXV4+lheFYGGw5H1LIEvrVbKu6uTbokqBbLO3VV62yRWh8naXtflS
bqreHfw+kwuBIfhvJkPJOi2ajP/GzcuavFxX8nxisxEFoQ3MLs8vHusXz9+8
fJJcnM8vLs4f38dTBJg5vp/bmrHxq9dXc0CBQIdRA5gylB48viRU+/F6oh88
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

-->

</rfc>
