<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 2.7.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-serialization-06" 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-06"/>
    <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="April" day="23"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <keyword>cbor</keyword>
    <abstract>
      <?line 113?>

<t>This document defines two CBOR serializations: "preferred-plus serialization" and "deterministic serialization."
It also introduces the term "general serialization" to name the full, variable set of serialization options defined in RFC 8949.
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 122?>

<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>CBOR intentionally allows multiple valid serializations of the same data item.
For example, the array [1, 2] can be serialized in more than one way:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Type</th>
            <th align="left">Description</th>
            <th align="left">Bytes</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Definite-length</td>
            <td align="left">The array length (2) is encoded at the beginning</td>
            <td align="left">0x82 0x01 0x02</td>
          </tr>
          <tr>
            <td align="left">Indefinite-length</td>
            <td align="left">The array is terminated by the break byte (0xff)</td>
            <td align="left">0x9f  0x01 0x02 0xff</td>
          </tr>
        </tbody>
      </table>
      <t>Similar variation exists for integers, maps, strings, and floating-point numbers.</t>
      <t>This variability is deliberate.
CBOR is designed to allow encodings to be selected according to the constraints and requirements of a particular environment.
The flexibility is a core design feature.
(CBOR is not unique in this regard; BER and DER encoding for ASN.1 are a similar design choice.)</t>
      <t>For example, indefinite-length serialization is suited for streaming large arrays in constrained environments, where the total length is not known in advance.
Conversely, definite-length serialization works well to decode small arrays in constrained environments.</t>
      <t>As a result, CBOR libraries and protocol implementations commonly support only the serialization forms required for their intended use cases.
This behavior is expected and aligns with CBOR’s design goals.</t>
      <t>However, this flexibility introduces two challenges: interoperability and determinism.</t>
      <section anchor="interoperability">
        <name>Interoperability</name>
        <t>The interoperability challenge arises because partial implementations are both permitted and expected.
For example, an encoder might transmit an indefinite-length array to a decoder that does not support indefinite-length encodings.
Both implementations are compliant with <xref target="STD94"/>.</t>
        <t>Decoders, in particular, frequently choose not to support all serialization forms.
This may be due to operation in constrained environments or because implementing a full general decoder is significantly more work
(particularly in languages like C and Rust, which lack built-in support for dynamic arrays, maps, and strings).</t>
        <t>In practice, most CBOR usage occurs outside highly constrained environments.
This makes it both feasible and beneficial to define a common serialization suitable for general use.</t>
        <t>Protocol specifications can reference such a serialization rather than restating detailed encoding rules, and library implementations can prioritize support for it.</t>
        <t>This document defines that serialization: preferred-plus serialization.</t>
      </section>
      <section anchor="determinism">
        <name>Determinism</name>
        <t>The determinism challenge arises because there are multiple ways to serialize the same data item.
The example serialization of the array [1,2] above shows this.
This is a problem in some protocols that hash or sign encoded CBOR.</t>
        <t>Many approaches to deterministic serialization are possible, each optimized for different environmental constraints or application requirements.
However, as noted earlier, the majority of CBOR usage occurs outside constrained environments.
It is therefore practical to define a single deterministic serialization suitable for general use.</t>
        <t>Protocol specifications and library implementations can reference this serialization instead of defining their own deterministic encoding rules.</t>
        <t>This document defines that serialization: deterministic serialization.</t>
      </section>
      <section anchor="relation-to-rfc-8949">
        <name>Relation to RFC 8949</name>
        <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.</t>
        <t>Preferred-plus serialization as defined here is largely the same as preferred serialization without indefinite-lengths, so it is largely interchangeable with what is commonly implemented.</t>
      </section>
    </section>
    <section anchor="Recommendations">
      <name>Recommendations Summary</name>
      <section anchor="protocol-specifications">
        <name>Protocol Specifications</name>
        <section anchor="FrameworkProtocols">
          <name>Framework Protocols</name>
          <t>Framework protocols are those that offer a set of options and alternatives, with interoperability depending on the sender and receiver making compatible choices.
These protocols sometimes make use of profiles to define interoperability requirements for specific uses.
Framework protocols are sometimes described as toolbox or building-block protocols, reflecting their role as collections of reusable mechanisms rather than end-to-end protocols.
CWT, COSE, EAT, and CBOR itself are examples of framework protocols.</t>
          <t>It is RECOMMENDED that CBOR-based framework protocols not state serialization requirements, enabling individual uses and profiles to choose serialization to suit their environments and constraints.</t>
          <t>CBOR-based framework protocols MAY impose serialization requirements.
For example, if a protocol is never expected to be deployed in constrained environments where map sorting is too expensive, it may mandate deterministic serialization for all implementations in order to eliminate all serialization variability.</t>
          <t>There is one situation in which a framework protocol MUST require deterministic serialization, though typically limited to a specific subset of the protocol.
This requirement arises when the protocol design requires the involved parties to independently construct and serialize data to be hashed or signed, rather than transmitting the exact serialized bytes that were hashed or signed.
See <xref target="WhenDeterministic"/>.</t>
          <t>See <xref target="COSESerialization"/> for a COSE-based example.</t>
        </section>
        <section anchor="EndToEndProtocols">
          <name>End-to-End Protocols</name>
          <t>End-to-end protocols are specified such that interoperability is assured when they are implemented in accordance with their specification.
When such a protocol includes optional features, they are typically selected through real-time negotiation.
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>End-to-end protocols MUST define a serialization strategy that ensures the sender and receiver use interoperable serialization.</t>
          <t>The strategy most highly RECOMMENDED is to normatively require preferred-plus serialization.
If a protocol does not need to be deployed where map sorting is too expensive, requiring deterministic serialization is also RECOMMENDED.</t>
          <t>An end-to-end protocol MAY instead define its own specialized serialization (see <xref target="SpecialSerializations"/>).
In such cases, it MUST explicitly specify the permitted serialization behaviors necessary to ensure interoperability.
For example, if a sender is permitted to use indefinite-length serialization, the protocol MUST require that receivers be capable of decoding indefinite-length items.</t>
          <t>As with framework protocols, deterministic serialization may be required for parts of the protocol using hashing or signing.
See <xref target="WhenDeterministic"/>.</t>
          <t>If no specific serialization is required, general serialization (see <xref target="GeneralSerialization"/>) applies by default.
In this case, the sender MAY use any valid serialization, and the receiver MUST be able to decode it.
Defaulting to general serialization is NOT RECOMMENDED, because some serializations like indefinite-lengths are not widely supported.</t>
        </section>
      </section>
      <section anchor="libraries">
        <name>Libraries</name>
        <section anchor="cbor-libraries">
          <name>CBOR Libraries</name>
          <t>It is RECOMMENDED that CBOR libraries support preferred-plus serialization.
This can be achieved by conforming to the decoding requirements in <xref target="PreferredPlusDecoding"/> and by making the encoding behavior defined in <xref target="PreferredPlusEncoding"/> the default or primary encoding API.</t>
          <t>Preferred-plus serialization is recommended because it is suitable for the majority of CBOR-based protocols.
In practice, preferred-plus serialization is equivalent to preferred serialization <xref section="4.1" sectionFormat="of" target="STD94"/> 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 preferred-plus 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 preferred-plus serialization; therefore, if deterministic serialization is fully supported, explicit support for preferred-plus serialization may be omitted.</t>
          <t>A CBOR library MAY also choose to support some or all aspects of general serialization (see <xref target="GeneralSerialization"/>) thereby enabling support for protocols that use specialized serializations (see <xref target="SpecialSerializations"/>).</t>
        </section>
        <section anchor="libraries-for-framework-protocols">
          <name>Libraries for Framework Protocols</name>
          <t>When a framework protocol specification does not mandate a specific serialization, it is RECOMMENDED that it implement preferred-plus serialization.
For example, it is recommended that a library implementing CWT or COSE implement preferred-plus serialization.</t>
          <t>However, a library MAY choose to support only deterministic serialization if this aligns with its deployment environment and design goals.</t>
          <t>When a framework protocol mandates serialization requirements, libraries must of cource conform.
For instance, certain parts of COSE mandate deterministic serialization.
See <xref target="COSESerialization"/> for a COSE-based example.</t>
        </section>
        <section anchor="libraries-for-end-to-end-protocols">
          <name>Libraries for End-to-End Protocols</name>
          <t>End-to-end protocols should have explicit serialization requirements to ensure interoperability.
Libraries for end-to-end protocols should fullfill them.</t>
          <t>If an end-to-end protocol specification does not state serialization requirements, the library is free to choose, but it is RECOMMENDED that they implement preferred-plus serialization.</t>
        </section>
      </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>Floating-point values may be encoded using any length (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>Preferred-plus serialization (<xref target="PreferredPlusSerialization"/>) 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.
This is also true in practice of other protocols implementations like those for <xref target="RFC9052"/>.</t>
      </section>
    </section>
    <section anchor="PreferredPlusSerialization">
      <name>Preferred-Plus Serialization</name>
      <t>This section defines a serialization named "preferred-plus serialization."</t>
      <section anchor="PreferredPlusEncoding">
        <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="PreferredPlusDecoding">
        <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 byte 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-preferred-plus-serialization">
        <name>When to use preferred-plus serialization</name>
        <t>The purpose of preferred-plus 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>Preferred-plus 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 preferred-plus 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 preferred-plus serialization may not be suitable.
Otherwise, for the vast majority of use cases, preferred-plus serialization provides interoperaibility, small encoded size and low implementation costs.</t>
      </section>
      <section anchor="RelationToPreferred">
        <name>Relation To Preferred Serialization</name>
        <t>Preferred-plus 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 preferred-plus serialization is already largely supported.</t>
        <t><xref section="3" sectionFormat="of" target="STD94"/> 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 by many implementers until several 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 preferred-plus 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="PreferredPlusSerialization"/> and <xref target="NaN"/> for details on, and the 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 preferred-plus serialization (<xref target="PreferredPlusSerialization"/>), 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 preferred-plus serialization defined in <xref target="PreferredPlusEncoding"/> 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"/> / <xref section="4.2.3" sectionFormat="of" target="STD94"/>.</t>
          </li>
        </ol>
      </section>
      <section anchor="DeterministicDecoding">
        <name>Decoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Decoders MUST meet the decoder requirements described in <xref target="PreferredPlusDecoding"/>.
That is, deterministic encoding imposes no requirements over and above the requirements for decoding preferred-plus serialization.</t>
          </li>
        </ol>
      </section>
      <section anchor="WhenDeterministic">
        <name>When to use Deterministic Serialization</name>
        <section anchor="not-commonly-needed-for-hashing-and-signing">
          <name>Not Commonly Needed for Hashing and Signing</name>
          <t>Most applications do not require deterministic encoding — even those that employ signing or hashing to authenticate or protect the integrity of data.
For example, the payload of a COSE_Sign message (See <xref target="RFC9052"/>) does not need to be encoded deterministically because it is transmitted 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>See the more detailed, COSE-based example in <xref target="COSESerialization"/>.</t>
        </section>
        <section anchor="decoding-deterministic-serialization-and-relation-to-preferred-plus-serialization">
          <name>Decoding Deterministic Serialization and Relation to Preferred-Plus Serialization</name>
          <t>The only difference between preferred-plus and deterministic serialization is that in deterministic serialization, maps are required to be sorted by their keys.
Preferred-plus serialization exists as a separate mode solely because map sorting can be too expensive in some constrained environments.</t>
          <t>Map decoding must never depend on the sort order of a map, even when maps are required to be sorted.
As a result, deterministic serialization (<xref target="DeterministicSerialization"/>) can always be decoded by a decoder that supports preferred-plus serialization (<xref target="PreferredPlusSerialization"/>).
Because of this property, deterministic serialization can always be used in place of preferred-plus serialization.
In environments where map sorting is not costly, it is both acceptable and beneficial to always use deterministic serialization.
In such environments, a CBOR encoder may produce deterministic encoding by default and may even omit support for preferred-plus encoding entirely.</t>
          <t>However, note that deterministic serialization is never a substitute for general serialization where uses cases may require indefinite lengths, separate big numbers from integers in the data model, or need non-trivial NaNs.</t>
        </section>
        <section anchor="no-map-ordering-semantics">
          <name>No Map Ordering Semantics</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 deterministic serialization was used.
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>
        </section>
      </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 preferred-plus 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="TagDataModelRule">
      <name>New Tag Data Model Rule</name>
      <t><cref anchor="to-be-removed4">This section is new in draft-03. The author thinks it may be out of place in this document, but there's no other good place for it yet.</cref></t>
      <t><xref section="2" sectionFormat="of" target="STD94"/> states that each new CBOR tag definition introduces a new and distinct data type.
In contrast, the definitions of Tags 2 and 3 (bignums) in <xref section="3.4.3" sectionFormat="of" target="STD94"/> do not introduce a separate data type; instead, they attach directly to the integer type and extend its numeric range.
As a result, the generic data model’s integer type is modified rather than augmented with a new, independent type (see <xref target="BigNumbersDataModel"/>).</t>
      <t>This document establishes a new rule that prohibits future tag definitions from having such effects:</t>
      <t>All future CBOR tag definitions MUST NOT incorporate, modify, or otherwise affect any data types other than the type defined by the tag itself.
A set of tags MAY affect each other, provided that all defining authorities for those tags explicitly agree.</t>
      <t>Tags 2 and 3 are exempt from this rule, as they were defined prior to the establishment of this requirement.</t>
    </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">.prefp</td>
            <td align="left">Use preferred-plus serialization for a data item</td>
          </tr>
          <tr>
            <td align="left">.prefpseq</td>
            <td align="left">Use preferred-plus serialization for a CBOR sequence</td>
          </tr>
          <tr>
            <td align="left">.dtrm</td>
            <td align="left">Use deterministic serialization for a data item</td>
          </tr>
          <tr>
            <td align="left">.dtrmseq</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 preferred-plus 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 .dtrm 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">.prefp</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.prefpseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.dtrm</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.dtrmseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
      <t>IANA is requested to add a reference to <xref target="TagDataModelRule"/> to the CBOR tag registry <xref target="IANA.cbor-tags"/>.</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>
        <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>
        <reference anchor="IANA.cbor-tags" target="https://www.iana.org/assignments/cbor-tags">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags</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="Examples-Repo" target="https://github.com/cbor-wg/draft-ietf-cbor-serialization/tree/main/examples">
          <front>
            <title>draft-ietf-cbor-serialization</title>
            <author>
              <organization>IETF CBOR WG</organization>
            </author>
            <date/>
          </front>
        </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="11" month="February" year="2026"/>
            <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-17"/>
        </reference>
        <reference anchor="UML" target="https://www.omg.org/spec/UML/2.5.1/PDF">
          <front>
            <title>OMG Unified Modeling Language (OMG UML) Version 2.5.1</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="December"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 581?>

<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">
              <xref target="UML"/></td>
            <td align="left">CDDL</td>
            <td align="left">CBOR</td>
          </tr>
          <tr>
            <td align="left">Implementation Representation</td>
            <td align="left">n/a</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">Please remove above sentence before publication</cref></t>
      <t>In addition to <xref target="DeterministicSerialization"/>, 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="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, Python 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>Preferred-plus 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-rfc-8949">
        <name>Clarification of RFC 8949</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>Non-trivial NaNs are not permitted in either preferred-plus or deterministic serializations.
This is in contrast to preferred serialization and <xref section="4.2.1" sectionFormat="of" target="STD94"/>.</t>
        <t>Note that the prohibition of non-trivial NaNs is the sole difference between deterministic serialization (<xref target="DeterministicSerialization"/>) and <xref section="4.2.1" sectionFormat="of" target="STD94"/>.</t>
        <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>Because preferred serialization of non-trivial NaNs is difficult and error-prone to implement, many CBOR implementations don't encode and/or decode non-trivial NaNs, or don't encode or decode 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 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 preferred-plus 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 preferred-plus and deterministic serialization, they are theoretically supported by <xref target="STD94"/>.
General serialization does support them.</t>
        <t>New protocol designs SHOULD avoid 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>The primary purpose of this document is to define preferred-plus and deterministic serialization.
Accordingly, <xref target="PreferredPlusSerialization"/> 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="PreferredPlusSerialization"/> 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>
      <t>This document does create a new rule for future tag definitions.
See <xref target="TagDataModelRule"/>.</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="CheckingDecoder">
      <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 preferred-plus 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"/>.
It also applies when prose states the byte-string wrapping requirement, such as for the COSE protected headers.
See also <xref target="COSEPayload"/>.</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>This appendix highlights how the topics in this document apply to CBOR Object Signing and Encryption  (COSE <xref target="RFC9052"/>).</t>
      <t>It focuses on the COSE_Sign1 message (<xref section="4.2" sectionFormat="of" target="RFC9052"/>), which is sufficient for illustrating the relevant considerations.
COSE_Sign1 is a simple structure for signing a payload.
Its serialization can be described in three parts:</t>
      <ul spacing="normal">
        <li>
          <t>The payload</t>
        </li>
        <li>
          <t>The Sig_structure</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="COSEPayload">
        <name>COSE Payload Serialization</name>
        <t>The signed payload may or may not be CBOR, but assume that it is, perhaps a CWT or EAT.
The payload is transmitted from the signer/sender fully intact all the way to the verifier/receiver.
Because it is transmitted fully intact, 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 any way 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 a byte string wrapped.
This is not for determinism, 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 decoders do not provide access to any arbitrary chunk of encoded CBOR in the middle of a message.
This is an example of byte string wrapping described in <xref target="ByteStringWrapping"/>.</t>
      </section>
      <section anchor="COSESigStructure">
        <name>COSE Sig_structure</name>
        <t>The Sig_structure <xref section="4.4" sectionFormat="of" target="RFC9052"/> is used to aggregate all the items that are input to the signature algorithm — the payload, protected headers and other.</t>
        <t>The Sig_structure is not transmitted from the sender to the receiver; instead, it is constructed independently by both parties.
COSE therefore explicitly requires deterministic encoding so that both the sender and receiver produce identical encoded CBOR representations.
This requirement is specified in <xref section="9" sectionFormat="of" target="RFC9052"/>.</t>
        <t>This COSE requirement is effectively equivalent to the deterministic serialization defined in <xref target="DeterministicSerialization"/>, since no floating-point NaNs are involved.
It is also effectively equivalent to preferred-plus serialization as defined in <xref target="PreferredPlusSerialization"/>, because the Sig_structure contains no maps.</t>
        <t>The determinism requirement does not apply to the protected headers incorporated into the Sig_structure.
Deterministic encoding of the headers is unnecessary because they are transmitted in the exact encoded form in which they are included in the Sig_structure.</t>
        <t>Furthermore, determinism requirements do not extend into CBOR inside of byte strings.
Once CBOR data is wrapped in a byte string, its internal encoding is treated as opaque and is not subject to surrounding serialization constraints.</t>
        <t>This illustrates the general need for deterministic serialization when signed data is reconstructed rather than transmitted in the exact form that was signed.
See <xref target="WhenDeterministic"/>.</t>
      </section>
      <section anchor="COSEMessage">
        <name>The Encoded Message</name>
        <t>A COSE_Sign1 message is an array of four elements containing 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 CBOR serialization used, as long as the decoder can decode what the encoder sends.</t>
        <t>In this respect, the serialization of the COSE_Sign1 message is no different from that of any other CBOR-based protocol message.
Indefinite-length items may be used, and non-shortest CBOR arguments are permitted.
The only requirement is that the serialization used by the encoder be decodable by the receiver.</t>
        <t>Strictly speaking, COSE is a framework protocol intended for incorporation into an end-to-end protocol, which should explicitly define its serialization requirements.
See <xref target="FrameworkProtocols"/> and <xref target="EndToEndProtocols"/>.</t>
        <t>In practice, some COSE libraries have implicitly implemented only the preferred (or preferred-plus) serialization, and end-to-end protocols have often defaulted to whatever behavior the underlying COSE library provides.
While this generally works — particularly because the preferred serialization aligns with the recommendations here — it is more robust for an end-to-end protocol to state its serialization requirements explicitly.</t>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>This appendix provides examples of the serializations described in this document.
Each example is a single data item.
Collectively, the examples cover the major CBOR data types and some special cases.
<xref target="tab-example"/> describes the five fields provided for each example.</t>
      <table anchor="tab-example">
        <name>Example Data Item Fields</name>
        <thead>
          <tr>
            <th align="left">field</th>
            <th align="left">description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">description</td>
            <td align="left">Text describing the item</td>
          </tr>
          <tr>
            <td align="left">edn-representations</td>
            <td align="left">Unencoded value(s) for the data item</td>
          </tr>
          <tr>
            <td align="left">general-serializations</td>
            <td align="left">Encoded representation(s) for general serialization</td>
          </tr>
          <tr>
            <td align="left">preferred-plus-serializations</td>
            <td align="left">Encoded representation(s) for preferred-plus serialization</td>
          </tr>
          <tr>
            <td align="left">deterministic-serializations</td>
            <td align="left">Encoded representation for deterministic serialization</td>
          </tr>
        </tbody>
      </table>
      <section anchor="use-for-testing">
        <name>Use for Testing</name>
        <t>These examples are designed to support testing of CBOR libraries.
They cover only what is defined in this document and therefore do not provide complete or general CBOR test coverage.
All examples are well-formed and valid.</t>
        <t>While the CBOR-encoded serializations for each item can be used directly as test input, the EDN representation usually must be incorporated into the test manually.
For example, the EDN string "-5.0e-324" will likely need to be passed as a value of type double to the API of a C-language CBOR library that encodes double-precision numbers.</t>
        <t>Not all CBOR libraries support every data type represented in these examples.
This is acceptable: tests for unsupported types may be skipped, or used to verify that an appropriate “unsupported” error is returned.</t>
        <section anchor="encode-test">
          <name>Encode Test</name>
          <t>To test encoding, invoke the encoder for each example data item.
The encoder input is the item's EDN representations.
If an example provides multiple EDN representations, each of them should be tested.</t>
          <t>The encoder should be either configured for, or to default to, one of the three serialization types described in this document.
A test succeeds if the encoder produces any of the encoded representations given in the example for that serialization type.</t>
          <t>If an encoder supports multiple serialization types, each type can be tested in turn.</t>
        </section>
        <section anchor="decode-test">
          <name>Decode Test</name>
          <t>To test decoding, invoke the decoder for each example data.</t>
          <t>The decoder should be either to be configured for, or to default to, one of the three serialization types described in this document.
For the selected serialization type, process every encoded representation defined for the target type.
A test passes if the decoded output matches the value specified by the corresponding EDN representation.</t>
          <t>If a decoder supports multiple serialization types, each type can be tested in turn.</t>
        </section>
        <section anchor="checking-decoder-test">
          <name>Checking Decoder Test</name>
          <t>Checking decoders are described in <xref target="CheckingDecoder"/>.</t>
          <t>This test verifies that a checking decoder rejects encodings allowed by general serialization but non-conforming for the target serialization type.
It applies only to CBOR libraries that implement serialization conformance checking.</t>
          <t>Testing a checking decoder for a target serialization type is typically performed as follows: for each example, supply the decoder with every representation permitted under general serialization except those allowed for the target serialization type.
Decoding each such input must result in a conformance-checking error.</t>
          <t>General-serialization decoders are not tested in this way, since they must accept all valid serialization forms.</t>
        </section>
        <section anchor="NonChecking">
          <name>Non-Checking Decoder Test</name>
          <t>A non-checking decoder may accept encodings beyond what is required for the target serialization type.
For example, a preferred-plus decoder will often accept non-shortest-length arguments, even though it is not required to do so, and such encodings are not permitted under preferred-plus.
These examples can be used to test such extended decoding.</t>
          <t>Testing proceeds similarly to that for a checking decoder: inputs outside the target serialization type are supplied to the decoder.
The difference is that, for a non-checking decoder, many of these inputs may successfully decode rather than producing a conformance error.
When decoding does fail, the expected error is typically “unsupported.”</t>
          <t>Which encoding forms are accepted and which are rejected as unsupported is entirely dependent on the additional capabilities a CBOR library chooses to support and therefore not specified here.</t>
          <t>Note the following:</t>
          <ul spacing="normal">
            <li>
              <t>It is common for preferred-plus and deterministic decoders to accept non-shortest-length arguments.</t>
            </li>
            <li>
              <t>If the floating-point data type is supported, all serialization types described in this document require support for decoding half-precision representations and subnormals.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="example-data-items">
        <name>Example Data Items</name>
        <t>These are available as individual files at <xref target="Examples-Repo"/>.</t>
        <t>All general serialization examples of strings, arrays and maps include indefinite-length encodings so as to provide full test cases.
CBOR libraries that don't support indefinite-length decoding can not claim to support general serialization even if they support most of the rest of general serialization.
For the purpose of classification by this document they are preferred-plus libraries with extra decoding features.
The extra decoding features can be tested as described in <xref target="NonChecking"/>.</t>
        <t>File: zero.edn</t>
        <artwork><![CDATA[
{
   "description": "The integer 0" ,
   "edn-representations" : ["0"] ,
   "general-serializations": [h'00',
                              h'1800',
                              h'190000',
                              h'1a00000000',
                              h'1b0000000000000000',
                              h'c2420000',
                              h'c240'],
   "preferred-plus-serializations": [h'00'],
   "deterministic-serialization": [h'00']
}
]]></artwork>
        <t>File: three.edn</t>
        <artwork><![CDATA[
{
   "description": "The integer 3" ,
   "edn-representations" : ["3"] ,
   "general-serializations": [h'03',
                              h'1803',
                              h'190003',
                              h'1a00000003',
                              h'1b0000000000000003',
                              h'c2420003' ],
   "preferred-plus-serializations": [h'03'],
   "deterministic-serialization": [h'03']
}
]]></artwork>
        <t>File: minus_twenty_five.edn</t>
        <artwork><![CDATA[
{
   "description": "The integer -25",
   "edn-representations" : ["-25"],
   "general-serializations": [h'3818',
                              h'390018',
                              h'3a00000018',
                              h'3b0000000000000018',
                              h'c3420018' ],
   "preferred-plus-serializations": [h'3818'],
   "deterministic-serialization": [h'3818']
}
]]></artwork>
        <t>File: 65_bit_neg.edn</t>
        <artwork><![CDATA[
{
   "description": "Largest negative integer" ,
   "edn-representations" : ["-18446744073709551616"] ,
   "general-serializations": [h'3bffffffffffffffff',
                              h'c348ffffffffffffffff'],
   "preferred-plus-serializations": [h'3bffffffffffffffff'],
   "deterministic-serialization": [h'3bffffffffffffffff']
}
]]></artwork>
        <t>File: byte_string.edn</t>
        <artwork><![CDATA[
{
   "description": "The byte string of length 3: 0x010203",
   "edn-representations" : ["h'010203'"],
   "general-serializations": [h'43010203',
                              h'5f4101420203ff',
                              h'5f5801015a000000020203ff'],
   "preferred-plus-serializations": [h'43010203'],
   "deterministic-serialization": [h'43010203']
}
]]></artwork>
        <t>File: text_string.edn</t>
        <artwork><![CDATA[
{
   "description": "The text string 'hi there'",
   "edn-representations" : ["\"hi there\""],
   "general-serializations": [
     h'686869207468657265',
     h'7f686869207468657265ff',
     h'7f64686920746468657265ff',
     h'7f790004686920747B000000000000000468657265ff'],
   "preferred-plus-serializations": [
     h'686869207468657265'],
   "deterministic-serialization": [
     h'686869207468657265']
}
]]></artwork>
        <t>File: array.edn</t>
        <artwork><![CDATA[
{
   "description": "The array [1, 2, 3]",
   "edn-representations" : ["[1, 2, 3]"],
   "general-serializations": [h'83010203',
                              h'9f010203ff' ],
   "preferred-plus-serializations": [h'83010203'],
   "deterministic-serialization": [h'83010203']
}
]]></artwork>
        <t>File: map.edn</t>
        <t>Note that map order is not significant in the CBOR data model.
Maps are only sorted to provide deterministic encoding.</t>
        <artwork><![CDATA[
{
  "description": "Map with three items using integer map keys",
  "edn-representations" : [
    "{1:\"x\", 2:\"y\", 3:\"z\"}",
    "{1:\"x\", 3:\"z\", 2:\"y\"}",
    "{2:\"y\", 3:\"z\", 1:\"x\"}",
    "{2:\"y\", 1:\"x\", 3:\"z\"}",
    "{3:\"z\", 1:\"x\", 2:\"y\"}",
    "{3:\"z\", 2:\"y\", 1:\"x\"}" ],
  "general-serializations": [
     h'a301617802617903617a',
     h'a301617803617a026179',
     h'a302617903617a016178',
     h'a302617901617803617a',
     h'a303617a016178026179',
     h'a303617a026179016178',
     h'bf03617a026179016178ff',
     h'a31a00000003617a19000261791B00000000000000016178'],
  "preferred-plus-serializations": [ 
     h'a301617802617903617a',
     h'a301617803617a026179',
     h'a302617903617a016178',
     h'a302617901617803617a',
     h'a303617a016178026179',
     h'a303617a026179016178'],
  "deterministic-serialization": [
    h'a301617802617903617a']
}
]]></artwork>
        <t>File: map_strings.edn</t>
        <artwork><![CDATA[
{
  "description": "Three item map with string keys",
  "edn-representations" : [
     {"abc": 1, "def": 2, "ghi": 3},
     {"abc": 1, "ghi": 3, "def": 2},
     {"def": 2, "abc": 1, "ghi": 3},
     {"def": 2, "ghi": 3, "abc": 1},
     {"ghi": 3, "abc": 1, "def": 2},
     {"ghi": 3, "def": 2, "abc": 1} ],
  "general-serializations": [
     h'a3636162630163646566026367686903',
     h'a3636162630163676869036364656602',
     h'a3636465660263616263016367686903',
     h'a3636465660263676869036361626301',
     h'a3636768690363616263016364656602',
     h'a3636768690363646566026361626301',
     h'bf6162630163646566026367686903ff',
     h'bf7f6161626263ff017f6264656166ff027f63676869ff03ff'],
  "preferred-plus-serializations": [ 
    h'a3636162630163646566026367686903',
    h'a3636162630163676869036364656602',
    h'a3636465660263616263016367686903',
    h'a3636465660263676869036361626301',
    h'a3636768690363616263016364656602',
    h'a3636768690363646566026361626301',
    h'bf6162630163646566026367686903ff' ],
  "deterministic-serialization": [
    h'a3636162630163646566026367686903' ]
}
]]></artwork>
        <t>File: positive_bignum.edn</t>
        <t>Note that big numbers are included in the test data because preferred-plus serialization requires their unification with integers.</t>
        <artwork><![CDATA[
{
  "description": "A positive big num",
  "edn-representations" : ["79228162514264337593543950335"],
  "general-serializations": [h'c24cffffffffffffffffffffffff',
                             h'c24e0000ffffffffffffffffffffffff' ],
  "preferred-plus-serializations": [h'c24cffffffffffffffffffffffff'],
  "deterministic-serialization":  [h'c24cffffffffffffffffffffffff']
}
]]></artwork>
        <t>File: negative_bignum.edn</t>
        <t>Note that this is the value closest that can be represented as a big number, not a type 1 integer for preferred-plus serialization.</t>
        <artwork><![CDATA[
{
   "description": "Negative bignum on boundary with type 1 integer",
   "edn-representations" : ["-18446744073709551617"],
   "general-serializations": [
     h'c349010000000000000000',
     h'c34c000000010000000000000000',
     h'c35f450000000001480000000000000000ff'],
   "preferred-plus-serializations": [
     h'c349010000000000000000'],
   "deterministic-serialization":  [
    h'c349010000000000000000']
}
]]></artwork>
        <t>File: date_epoch_tag.edn</t>
        <t>Note that this is provided as a test case for tags.
There are no requirements for dates in this document.
The tag content in this example does vary by serialization type.</t>
        <artwork><![CDATA[
{
   "description": "An epoch date tag" ,
   "edn-representations" : ["1(1776614355)"] ,
   "general-serializations": [h'c11a69e4fbd3',
                              h'd8011a69e4fbd3',
                              h'd900011a69e4fbd3',
                              h'da000000011a69e4fbd3',
                              h'db00000000000000011a69e4fbd3',
                              h'c11b0000000069e4fbd3'],
   "preferred-plus-serializations": [h'c11a69e4fbd3'],
   "deterministic-serialization":   [h'c11a69e4fbd3']
}

]]></artwork>
        <t>File: date_string_tag.edn</t>
        <t>Note that this is provided as a test case for tags.
There are no requirements for dates in this document.
The tag content in this example does vary by serialization type.</t>
        <artwork><![CDATA[
{
  "description": "A date string tag" ,
  "edn-representations" : ["0(\"2026-04-19T03:59:15Z\")"] ,
  "general-serializations": [
    h'c074323032362d30342d31395430333a35393a31355a',
    h'd80074323032362d30342d31395430333a35393a31355a',
    h'd9000074323032362d30342d31395430333a35393a31355a',
    h'da0000000074323032362d30342d31395430333a35393a31355a',
    h'db000000000000000074323032362d30342d31395430333a35393a31355a',
    h'c07f74323032362d30342d31395430333a35393a31355aff',
    h'c07f6232307232362d30342d31395430333a35393a31355aff'],
  "preferred-plus-serializations": [
    h'c074323032362d30342d31395430333a35393a31355a'],
  "deterministic-serialization":  [
    h'c074323032362d30342d31395430333a35393a31355a']
}

]]></artwork>
        <t>File: true.edn</t>
        <artwork><![CDATA[
{
   "description": "The simple value 'true'" ,
   "edn-representations" : ["true"] ,
   "general-serializations": [h'f5'],
   "preferred-plus-serializations": [h'f5'],
   "deterministic-serialization": [h'f5']
}
]]></artwork>
        <t>File: simple111.edn</t>
        <t>Note that the simple value 111 is of not particular significance.
It was selected because it is an unassigned simple value.</t>
        <artwork><![CDATA[
{
   "description": "The simple value 111" ,
   "edn-representations" : ["simple(111)"] ,
   "general-serializations": [h'f86f'],
   "preferred-plus-serializations": [h'f86f'],
   "deterministic-serialization": [h'f86f']
}
]]></artwork>
        <t>File: float_zero.edn</t>
        <artwork><![CDATA[
{
   "description": "Floating-point positive zero",
   "edn-representations" : ["0.0"] ,
   "general-serializations": [h'f90000',
                              h'fa00000000',
                              h'fb0000000000000000'],
   "preferred-plus-serializations": [h'f90000'],
   "deterministic-serialization": [h'f90000']
}
]]></artwork>
        <t>File: float_double.edn</t>
        <artwork><![CDATA[
{
   "description": "Double-precision normal float" ,
   "edn-representations" : ["1.7976931348623157e+308"] ,
   "general-serializations": [h'fb7fefffffffffffff'],
   "preferred-plus-serializations": [h'fb7fefffffffffffff'],
   "deterministic-serialization": [h'fb7fefffffffffffff']
}
]]></artwork>
        <t>File: float_double_subnormal.edn</t>
        <t>Note that full subnormal support is required for all serializations defined in this document.</t>
        <artwork><![CDATA[
{
   "description": "Double-precision negative subnormal float",
   "edn-representations": ["-5.0e-324"],
   "general-serializations": [h'fb8000000000000001' ],
   "preferred-plus-serializations": [h'fb8000000000000001' ],
   "deterministic-serialization": [h'fb8000000000000001']
}
]]></artwork>
        <t>File: float_single.edn</t>
        <artwork><![CDATA[
{
   "description": "Single-precision normal float" ,
   "edn-representations" : ["-16777216.0"] ,
   "general-serializations": [h'fbc170000000000000',
                              h'facb800000'],
   "preferred-plus-serializations": [h'facb800000'],
   "deterministic-serialization": [h'facb800000']
}
]]></artwork>
        <t>File: float_single_subnormal.edn</t>
        <artwork><![CDATA[
{
   "description": "Single-precision subnormal float" ,
   "edn-representations" : ["5.8774717541114375E-39"] ,
   "general-serializations": [h'fb3800000000000000',
                              h'fa00400000' ],
   "preferred-plus-serializations": [h'fa00400000'],
   "deterministic-serialization": [h'fa00400000']
}
]]></artwork>
        <t>File: float_half.edn</t>
        <artwork><![CDATA[
{
   "description": "half-precision normal float" ,
   "edn-representations" : ["65504.0"] ,
   "general-serializations": [h'fb40effc0000000000',
                              h'fa477fe000',
                              h'f97bff' ],
   "preferred-plus-serializations": [h'f97bff'],
   "deterministic-serialization": [h'f97bff']
}

]]></artwork>
        <t>File: float_half_subnormal.edn</t>
        <artwork><![CDATA[
{
   "description": "Half-precision subnormal float" ,
   "edn-representations" : ["3.0517578125E-5"] ,
   "general-serializations": [h'fb3f00000000000000',
                              h'fa38000000',
                              h'f90200' ],
   "preferred-plus-serializations": [h'f90200'],
   "deterministic-serialization": [h'f90200']
}
]]></artwork>
        <t>File: float_neg_infinity.edn</t>
        <artwork><![CDATA[
{
  "description": "Negative Infinity",
  "edn-representations" : ["-Infinity"] ,
  "general-serializations": [h'f9fc00',
                             h'faff800000',
                             h'fbfff0000000000000'],
  "preferred-plus-serializations": [h'f9fc00'],
  "deterministic-serialization": [h'f9fc00']
}
]]></artwork>
        <t>File: float_quiet_nan.edn</t>
        <artwork><![CDATA[
{
  "description": "Floating-point quiet NaN",
  "edn-representations" : ["NaN"] ,
  "general-serializations": [h'f97e00',
                             h'fa7fc00000',
                             h'fb7ff8000000000000'],
  "preferred-plus-serializations": [h'f97e00'],
  "deterministic-serialization": [h'f97e00']
}
]]></artwork>
        <t>File: float_nan_payload.edn</t>
        <t>The NaN payload is a special case.
For preferred-plus and deterministic serialization, the decode should fail.
For general serialization a NaN with a payload should be returned, but there is no EDN representation for that.</t>
        <artwork><![CDATA[
{
  "description": " Floating-point NaN payload/significand is 0x1ff",
  "edn-representations" : [] ,
  "general-serializations": [h'f97dff',
                             h'fa7fbfe000',
                             h'fb7ff7fc0000000000'],
  "preferred-plus-serializations": [],
  "deterministic-serialization": []
}
]]></artwork>
      </section>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="R." surname="Mahy" fullname="Rohan Mahy">
        <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:
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

-->

</rfc>
