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

<t>This document defines two CBOR serializations: "preferred-plus serialization" and "deterministic serialization."
It also introduces the term "general serialization" to name the complete set of all serializations defined in RFC 8949.
Together, these three form a 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 134?>

<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 anchor="tab-array-ser">
        <name>[1, 2] definite-length and indefinite-length serializations</name>
        <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 most other CBOR data types.</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; compare ASN.1's BER encoding rules).</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 makes it easier 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 may produce an indefinite-length array that is sent to a decoder that supports only definite-length arrays.
Both this encoder and decoder are allowed by <xref target="STD94"/>.</t>
        <t>Decoders in particular often support only a subset of serialization forms — whether because they operate in constrained environments,
or because a full general-purpose decoder is substantially more work to implement, especially in languages like C and Rust that lack built-in 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 this serialization; 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 can reference this serialization instead of defining their own deterministic encoding rules; library implementations can prioritize support for it.</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 updating those in <xref target="STD94"/>.
This approach enables the serialization requirements to be expressed directly in normative <xref target="RFC2119"/> language and to be defined entirely in this document.
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 described in <xref target="STD94"/> are implemented.</t>
        <t>For example, preferred serialization (<xref section="4.1" sectionFormat="of" target="STD94"/>) is commonly implemented without support for indefinite lengths.
Preferred-plus serialization is effectively 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 course 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 fulfill 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 complete set of all encodings standardized in <xref section="3" sectionFormat="of" target="STD94"/>.
The term itself was not explicitly defined in <xref target="STD94"/>.
Preferred-plus and deterministic serialization are subsets of it.</t>
      <t>General serialization permits any and all of these:</t>
      <ul spacing="normal">
        <li>
          <t>CBOR arguments of any length (for example, the integer 0 may be encoded as 0x00, 0x1800, or 0x190000 and so on).</t>
        </li>
        <li>
          <t>Floating-point values encoded at any length (for example, 0.00 can be 0xf90000, 0xfa00000000, and so on).</t>
        </li>
        <li>
          <t>Both definite or indefinite-length strings, arrays, and maps.</t>
        </li>
        <li>
          <t>Big number representation of values that are also representable using major types 0 and 1 (for example, 0 can be encoded as the big number 0xc34100).</t>
        </li>
      </ul>
      <t>A decoder claiming to support general serialization MUST accept and decode all the encodings for the data types it supports.</t>
      <section anchor="general-serialization-is-the-default">
        <name>General Serialization is the Default</name>
        <t>When a CBOR-based protocol specification does not explicitly specify serialization, general serialization is the implied requirement —
meaning a compliant decoder must accept and decode any and all encodings it permits, including both definite and indefinite lengths.</t>
        <t>CBOR Web Token <xref target="RFC8392"/>, for example, does not specify serialization, so a fully compliant CWT decoder must handle general serialization, including indefinite-length strings, arrays, and maps.
In practice, however, many CWT decoders cannot process the full range of general serialization — indefinite lengths in particular.
Encoders have adapted accordingly, typically restricting their output to the subset of serializations that decoders can reliably handle, most notably by avoiding indefinite lengths altogether.
The same pattern holds for other protocols, such as COSE <xref target="RFC9052"/>.</t>
      </section>
      <section anchor="WhenGeneral">
        <name>When To Use General Serialization</name>
        <t>Preferred-plus serialization (<xref target="PreferredPlusSerialization"/>) is efficient and supports the full CBOR data model (except non-trivial NaNs; see <xref target="NaNBasics"/>), satisfying the vast majority of CBOR use cases.
Full general serialization is rarely necessary, and support for it is not widespread.</t>
        <t>The main scenario where general serialization is warranted is a protocol that must accommodate highly constrained encoders,
at the cost of requiring decoders — assumed to be unconstrained — to support every possible serialization option.</t>
        <t>When general serialization is required by a protocol, this SHOULD be stated explicitly.
Although it is the default for CBOR in theory, it has not been widely implemented as such in practice.</t>
        <t>See also special serialization (<xref target="SpecialSerializations"/>), which enables special optimization and efficiency for specific use cases without requiring full general serialization support in the decoder.</t>
        <t>CBOR libraries may nonetheless wish to support general serialization, as a complete set of other serialization forms, to be useful across a broader range of protocols.</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 lose 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>Encoders MUST NOT output any NaN other than the half-precision NaN 0xf9 0x7e 0x00 (sign bit clear, most significant significand bit set, all remaining significand bits clear).
When a signaling NaN, a NaN with a non-zero payload, or a NaN with the sign bit set is presented to an application or library for encoding, the encoder MUST either reject it or encode it as 0xf9 0x7e 0x00.
Consequently, the floating-point values that can be encoded are the finite numbers, positive and negative infinity, and a single NaN.</t>
              </li>
              <li>
                <t>Aside from 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>Leading 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.
See <xref target="BigNumbersCDDL"/> for specification in CDDL.</t>
      </section>
      <section anchor="when-to-use-preferred-plus-serialization">
        <name>When to use preferred-plus serialization</name>
        <t>Preferred-plus is the recommended default.
It supports all CBOR data types and value ranges (except non-trivial NaNs), typically produces the most compact encoding, is straightforward to implement, and is widely supported by CBOR libraries.
It provides strong interoperability because (1) decoders are required to accept all encodings that a preferred-plus encoder is permitted to produce, and (2) the requirements are formally specified.</t>
        <t>Choose a different serialization only when you have a specific need: deterministic serialization when determinism is required, a special serialization with indefinite lengths when streaming is required,
or another special serialization for capabilities beyond what preferred-plus provides (see <xref target="SpecialSerializations"/>).
Note that preferred-plus is deterministic when maps are not in use.</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 in encoded output 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 serialization decoders must support indefinite lengths, 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 interchangeable 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>
      <t>See also <xref target="DeterministicConsiderations"/> for considerations involved in designing a deterministic protocol that extend beyond 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 use 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>When needed, protocols may define special serializations beyond the three described above.
The main capabilities they enable are:</t>
      <ul spacing="normal">
        <li>
          <t>Streaming encoding of strings, arrays, and maps using indefinite lengths, for use when the encoded item(s) exceeds the memory available on the encoding device.</t>
        </li>
        <li>
          <t>Fixed-size integer encoding, allowing values to be copied directly to and from hardware registers.
CBOR is simple enough that encoders and decoders for some protocols can be implemented entirely in hardware.</t>
        </li>
        <li>
          <t>Fixed-width floating-point encoding, relieving the encoder from performing floating-point reduction to the shortest representable form.</t>
        </li>
        <li>
          <t>In-place length updates for strings, arrays, and maps, by encoding their lengths in a fixed number of bits.
For example, if a string length is always encoded in 32 bits, increasing its length from 2^16-1 to 2^16 requires only overwriting the length field rather than shifting all 2^16 bytes of content.</t>
        </li>
        <li>
          <t>Transmission of non-trivial NaN floating-point values (see <xref target="NaN"/>).</t>
        </li>
        <li>
          <t>Deterministic serialization with any or all of the above.</t>
        </li>
      </ul>
      <t>All of these except determinism are also available with general serialization, but a targeted special serialization will usually be substantially easier to implement.</t>
      <t>A recommended approach is to define a special serialization as preferred-plus or deterministic serialization with additional constraints or extensions.
For example, a protocol requiring deterministic streaming of maps and arrays could be specified as:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>Deterministic serialization MUST be used, except that maps and arrays MUST be encoded with indefinite lengths.
Strings retain definite-length encoding, and map ordering MUST follow the rules of 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 Serialization Control Operator</name>
      <t>The ".serial" control operator specifies the serialization of any type in CDDL, including the serialization of the whole document or byte-string-wrapped sub-parts.</t>
      <t>The controller (the right-hand side) MUST be either "prefp" or "dtrm", specifying preferred-plus (<xref target="PreferredPlusSerialization"/>) or deterministic (<xref target="DeterministicSerialization"/>) serialization, respectively.</t>
      <t>The scope of .serial 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 specific serialization must specify it explicitly.
See also <xref target="ByteStringWrapping"/>.</t>
      <t>For example, the following specifies that a message or protocol described by "stuff" is deterministically serialized and wrapped in a byte string:</t>
      <artwork><![CDATA[
stuff = ...
deterministic-stuff = stuff .serial dtrm
wrapped-deterministic-stuff = #6.24(bytes .cbor deterministic-stuff)
]]></artwork>
      <t>For another example, the first lines of a CDDL document as follows specify that "my-protocol" be serialized with preferred-plus.</t>
      <artwork><![CDATA[
my-prefp-protocol = my-protocol .serial prefp
my-protocol = ...
]]></artwork>
      <t>New controller values for new serializations are possible but are highly discouraged.
Standards action is required to add them.</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 anchor="covert-channel">
        <name>Covert Channel</name>
        <t>CBOR’s serialization variants can be used as a covert channel <xref target="LAM73"/> to steganographically exfiltrate data.</t>
        <t>For example, a CBOR argument (such as an integer encoding or a string length) can be encoded up to five different ways (e.g. the value 1 can be encoded as 0x01, 0x1801, 0x190001, 0x1A00000001, or 0x1B0000000000000001).
This variability can be used to encode ~2 hidden bits per argument.
Since every CBOR item carries an argument, even moderately complex protocols may accumulate sufficient bits to exfiltrate sensitive material (e.g., cryptographic keys) or to generate persistent identifiers for tracking users or devices.</t>
        <t>The following techniques may be used to establish a covert channel:</t>
        <ul spacing="normal">
          <li>
            <t>Varying the encoding of CBOR arguments (as above)</t>
          </li>
          <li>
            <t>Representing text or byte strings as indefinite-length encodings, and encoding information in the segmentation structure (e.g., segment lengths or insertion of empty segments)</t>
          </li>
          <li>
            <t>Encoding data within NaN payloads</t>
          </li>
          <li>
            <t>Manipulating the ordering of map entries</t>
          </li>
          <li>
            <t>Varying the Unicode representation of text strings</t>
          </li>
        </ul>
        <t>These channels are covert because most CBOR decoders accept all such representations without raising errors or warnings.¶</t>
        <t>The primary safeguard is to ensure the CBOR encoding library used is trustworthy and does not exfiltrate data.</t>
        <t>Another option is to require preferred-plus or deterministic serialization and to have decoders issue a warning if not compliant.
See <xref target="CheckingDecoder"/>.</t>
      </section>
    </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 ".serial" control operator 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>
      <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>
        <reference anchor="LAM73">
          <front>
            <title>A Note on the Confinement Problem</title>
            <author fullname="Butler W. Lampson">
              <organization/>
            </author>
            <date year="1973" month="October"/>
          </front>
          <seriesInfo name="{&quot;name&quot;=&gt;&quot;Communications of the ACM&quot;, &quot;value&quot;=&gt;&quot;16(10)&quot;}" value=""/>
          <seriesInfo name="{&quot;name&quot;=&gt;&quot;DOI&quot;, &quot;value&quot;=&gt;&quot;10.1145/362375.362389&quot;}" value=""/>
        </reference>
      </references>
    </references>
    <?line 617?>

<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 anchor="tab-models">
        <name>Information Model, Data Model and Serialization</name>
        <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="DeterministicConsiderations">
      <name>General Protocol Considerations for Determinism</name>
      <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 encoded as an integer, never as a floating-point number.
2.000001 is always 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="NaNBasics">
        <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 (Not a Number).
NaN is designed to represent the result of invalid operations, such as the square root of a negative number.</t>
        <t>A NaN is not a single value the way positive infinity is.
It has a sign bit and a trailing significand field — 10 bits in half precision, 23 in single, 52 in double — whose use is not formally defined.
The design intent is that these bits distinguish NaN types and hold diagnostic detail about a local computation.</t>
        <t>IEEE 754 formally defines the notions of quiet and signaling NaN, but the bit pattern distinguishing them is only a recommendation, directed at CPU designers:</t>
        <ul spacing="normal">
          <li>
            <t>A quiet NaN has the most significant significand bit set.</t>
          </li>
          <li>
            <t>A signaling NaN has that bit clear and at least one other significand bit set, to distinguish it from infinity.</t>
          </li>
          <li>
            <t>Either can have a non-zero payload, which is the bits other than the most significant significand bit.</t>
          </li>
          <li>
            <t>No recommendation is made for the sign bit.</t>
          </li>
        </ul>
        <t>This recommendation is not universally followed (e.g., PA-RISC and pre-R6 MIPS).</t>
        <t>An arithmetic operation on a signaling NaN raises the invalid operation exception and does not preserve it, whereas quiet NaNs are usually propagated with the payload intact.
Implementations vary, but this makes quiet NaNs usable for application-defined purposes in a way signaling NaNs are not.</t>
        <t>For this discussion, a non-trivial NaN is a signaling NaN, a NaN with a non-zero payload, or a NaN with the sign bit set, as the host represents it.
A trivial NaN is one that passively indicates that the value is not a number, and nothing more.</t>
      </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 MUST 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-trivial-nans">
        <name>Recommendations for Use of Non-Trivial NaNs</name>
        <t>While non-trivial NaNs are excluded from preferred-plus and deterministic serialization, they are supported by <xref target="GeneralSerialization"/>.</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="code-for-encoding-preferred-plus-floating-point-values">
      <name>Code for Encoding Preferred-Plus Floating-Point Values</name>
      <t>Preferred-plus (<xref target="PreferredPlusEncoding"/>) and deterministic serialization require that floating-point values fitting in single-precision and half-precision be encoded as such.
This C code implements that conversion.
While conversion between single and double is widely supported, conversion to half-precision is not.
<xref section="D" sectionFormat="of" target="STD94"/> provides example code for decoding half-precision values; this appendix provides corresponding code for encoding them.</t>
      <t>Two functions are provided: one to convert from double to single, and another from single to half.
Used together, they cover all possible cases.
If the input is a double, pref_plus_double_to_single() must be called first;
if it succeeds, pref_plus_single_to_half() is then called to complete the conversion from double to half.
If the input is already a single, only pref_plus_single_to_half() need be called.</t>
      <t>(The two functions have identical structure.
Because the constants are difficult to compute and verify, both are provided.)</t>
      <t>Both functions return an integer with the bit pattern for the resulting floating-point value, or -1 if the conversion can't be performed because the input is out of range or precision would be lost.</t>
      <figure anchor="half-encode">
        <name>Example C Code for Preferred-Plus Floating-Point Encoding</name>
        <sourcecode type="c"><![CDATA[
/* Constants based on IEEE 754; _LEN is in bits */

/* Half-precision */
#define HLF_MANT_LEN          10
#define HLF_EXP_LEN           5
#define HLF_MANT_BITS         0x3ffUL /* 10 bits */
#define HLF_SIGN_BIT         (0x01UL << (HLF_EXP_LEN + HLF_MANT_LEN))
#define HLF_NAN_INF_EXP_BITS  0x7c00
#define HLF_QUIET_NAN        (0x1UL << (HLF_MANT_LEN-1))

/* Single-precision */
#define SGL_MANT_LEN          23
#define SGL_EXP_LEN           8
#define SGL_MANT_BITS         0x7fffffUL /* 23 bits */
#define SGL_SIGN_BIT         (0x01UL << (SGL_EXP_LEN + SGL_MANT_LEN))
#define SGL_EXP_BITS          0xffUL /* 8 bits */
#define SGL_QUIET_NAN        (0x1UL << (SGL_MANT_LEN - 1))
#define SGL_ZERO_SUBNORM_EXP  0
#define SGL_NAN_INF_EXP       255
#define SGL_NAN_INF_EXP_BITS (SGL_NAN_INF_EXP << SGL_MANT_LEN)
#define SGL_MANT_ADD_ONE     (0x01UL << SGL_MANT_LEN)

/* Double-precision */
#define DBL_MANT_LEN          52
#define DBL_EXP_LEN           11
#define DBL_MANT_BITS         0xfffffffffffffULL /* 52 bits */
#define DBL_EXP_BITS          0x7ffULL /* 11 bits */
#define DBL_QUIET_NAN        (0x1ULL << (DBL_MANT_LEN-1))
#define DBL_ZERO_SUBNORM_EXP  0
#define DBL_NAN_INF_EXP       2047
#define DBL_MANT_ADD_ONE     (0x01ULL << (DBL_MANT_LEN))

/* Converting single to half; _EXP are biased single exponents */
#define S2H_SIGN_SHIFT       16
#define S2H_BIAS_DIFF_EXP   (127 - 15)
#define S2H_MIN_NORM_EXP     113
#define S2H_MIN_SUBNORM_EXP  102
#define S2H_SUBNORM_SHIFT    126
#define S2H_MAX_NORM_EXP     142
#define S2H_LOST_BITS        0x1fffUL /* 23 - 10 bits */

/* Converting double to single; _EXP are biased double exponents */
#define D2S_SIGN_SHIFT       32
#define D2S_BIAS_DIFF_EXP   (1023 - 127)
#define D2S_MIN_NORM_EXP     898
#define D2S_MIN_SUBNORM_EXP  874
#define D2S_SUBNORM_SHIFT    926
#define D2S_MAX_NORM_EXP     1150
#define D2S_LOST_BITS        0x1fffffffULL /* 52 - 23 bits */


long pref_plus_single_to_half(unsigned long single) {
  const unsigned long sign = single >> S2H_SIGN_SHIFT & HLF_SIGN_BIT;
  const unsigned long mant = single & SGL_MANT_BITS;
  const unsigned long exp  = single >> SGL_MANT_LEN & SGL_EXP_BITS;

  if (exp == SGL_ZERO_SUBNORM_EXP) {
    if (mant == 0) {
      return (long)sign; /* +/- 0.0 */
    } else {
      return -1; /* single subnormals are out of range for half */
    }
  } else if (exp >= S2H_MIN_SUBNORM_EXP && exp < S2H_MIN_NORM_EXP) {
    if (mant & ((1UL << (S2H_SUBNORM_SHIFT - exp)) - 1)) {
      return -1;   /* bits lost in conversion to half subnormal */
    } else {
      return (long)(sign + /* converts to half subnormal */
           ((mant + SGL_MANT_ADD_ONE) >> (S2H_SUBNORM_SHIFT - exp)));
    }
  } else if (exp >= S2H_MIN_NORM_EXP && exp <= S2H_MAX_NORM_EXP) {
    if (mant & S2H_LOST_BITS) {
      return -1; /* bits lost in conversion */
    } else {
      return (long)(sign + /* Converts to normal */
                   ((exp - S2H_BIAS_DIFF_EXP) << HLF_MANT_LEN) +
                   (mant >> (SGL_MANT_LEN - HLF_MANT_LEN)));
    }
  } else if (exp == SGL_NAN_INF_EXP) {
    if (mant == 0) {
      return (long)(sign + HLF_NAN_INF_EXP_BITS); /* +/- infinity */
    } else if (mant == SGL_QUIET_NAN && sign == 0) {
       return HLF_QUIET_NAN + HLF_NAN_INF_EXP_BITS; /* trivial NaN */
    } else {
       return -1; /* non-trivial NaN */
    }
  } else {
     return -1; /* large exponent -- out of range for half */
  }
}


long long pref_plus_double_to_single(unsigned long long dbl) {
  const unsigned long long sign = 
                                dbl >> D2S_SIGN_SHIFT & SGL_SIGN_BIT;
  const unsigned long long mant = dbl & DBL_MANT_BITS;
  const unsigned long long exp  = dbl >> DBL_MANT_LEN & DBL_EXP_BITS;

  if (exp == DBL_ZERO_SUBNORM_EXP) {
    if (mant == 0) {
      return (long long)sign; /* +/- 0.0 */
    } else {
      return -1; /* double subnormals are out of range for single */
    }
  } else if (exp >= D2S_MIN_SUBNORM_EXP && exp < D2S_MIN_NORM_EXP) {
    if (mant & ((1ULL << (D2S_SUBNORM_SHIFT - exp)) - 1)) {
      return -1; /* bits lost in conversion to single subnormal */
    } else {
      return (long long)(sign + /* converts to single subnormal */
           ((mant + DBL_MANT_ADD_ONE) >> (D2S_SUBNORM_SHIFT - exp)));
     }
  } else if (exp >= D2S_MIN_NORM_EXP && exp <= D2S_MAX_NORM_EXP) {
    if (mant & D2S_LOST_BITS) {
      return -1; /* bits lost in conversion */
    } else {
       return (long long)(sign + /* Converts to normal */
                        ((exp - D2S_BIAS_DIFF_EXP) << SGL_MANT_LEN) +
                         (mant >> (DBL_MANT_LEN - SGL_MANT_LEN)));
    }
  } else if (exp == DBL_NAN_INF_EXP) {
    if (mant == 0) {
      /* +/- infinity */
      return (long long)(sign + SGL_NAN_INF_EXP_BITS); 
    } else if (mant == DBL_QUIET_NAN && sign == 0) {
       return SGL_QUIET_NAN + SGL_NAN_INF_EXP_BITS; /* quiet NaN */
    } else {
       return -1; /* non-trivial NaN */
    }
  } else {
     return -1; /* large exponent -- out of range for single */
  }
}
]]></sourcecode>
      </figure>
    </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="BigNumbersCDDL">
      <name>CDDL for Big Numbers</name>
      <t>The types bigint and biguint in the CDDL Standard Prelude (<xref section="D" sectionFormat="of" target="RFC8610"/>) do NOT describe the big numbers described in this document or in <xref section="3.4.3" sectionFormat="of" target="STD94"/>, not even for general serialization.
The types integer and unsigned can be used, but note that they do not fully express the rules that govern the choice between major types 0 and 1 and the big number tags.
CDDL-described protocols SHOULD use integer and unsigned and in prose state that these values correspond to either <xref target="PreferredPlusSerialization"/> of this document or <xref section="3.4.3" sectionFormat="of" target="STD94"/>.
<xref target="BigNumbersDataModel"/> explains the reasons for this.</t>
      <t>The following CDDL can be used:</t>
      <artwork><![CDATA[
; big number byte strings are of unlimited size, but that 
; can't be expressed in CDDL, so a limit of 1,000
bnmax = 1000
bnbstr = bstr .size (8..bnmax)

pplus-tag2bstr = #6.2(bnbstr)
pplus-biguint  = #0 / pplus-tag2bstr

pplus-tag3bstr = #6.3(bnbstr)
pplus-bignint  = #1 / pplus-tag3bstr

pplus-bigint = pplus-biguint / pplus-bignint

]]></artwork>
    </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="signing-and-hashing-encoded-cbor">
      <name>Signing and Hashing Encoded CBOR</name>
      <t>CBOR protocols are generally described as a collection of data items, often using CDDL.
Signing or hashing is performed over some range of the encoded CBOR, possibly all of it.
For signing or hashing to work, the sender/encoder and the receiver/verifier must operate on exactly the same range of encoded bytes, so a protocol definition MUST define that range unambiguously.
There are several ways to specify it:</t>
      <ul spacing="normal">
        <li>
          <t>Name an existing data item (e.g., a CDDL type)</t>
        </li>
        <li>
          <t>Name a data item created specifically for this purpose (e.g., a CDDL type)</t>
        </li>
        <li>
          <t>Describe the input data items in prose</t>
        </li>
        <li>
          <t>Wrap the input in a byte string</t>
        </li>
      </ul>
      <t>Typically, a named data item is an array or a map, but non-aggregate items can be named as well.
When naming an item, the specification should state explicitly whether the input is the full encoded item (head, contents, and trailing "break" if indefinite-length) or only its contents.
Covering the full encoded item is recommended, as it is clearer.
If the item might be tag content (i.e., preceded by one or more tag numbers), the specification should state whether the tag numbers are included in the input; including them is recommended.</t>
      <t>It is also possible to specify a slice of a map or array as the input.
A good way to do this is to define a CDDL type that represents the slice as a CBOR sequence.</t>
      <t>Another practice is to wrap the bytes to be signed or hashed in a byte string, following the pattern of tag 24 (the tag number itself is typically unnecessary and omitted).
This makes the input to the signature or hash — the contents of the byte string — entirely unambiguous: there are no concerns about definite versus indefinite lengths, serialization variants, or tagging; any or all of these work.</t>
      <t>The choice of input bytes also affects implementations and their use of CBOR libraries.</t>
      <t>Byte-string wrapping is guaranteed to work with even simple, basic libraries, although it will probably require two instances of the encoder or decoder: one for the wrapped (signed/hashed) CBOR and one for the wrapping CBOR. See <xref target="ByteStringWrapping"/>.</t>
      <t>If byte-string wrapping is not used, the CBOR library must provide an additional feature that gives access to the undecoded CBOR.
For example, it may offer a "tell()" operation that reports the byte offset of the start of the first covered item and of the end of the last covered item (which is more complicated when indefinite lengths are involved), or it may offer an API that directly returns the undecoded bytes of an item.</t>
      <t>Another tactic is to require deterministic encoding.
The receiver then reconstructs the signed/hashed bytes from the decoded data items rather than accessing the received encoded CBOR.</t>
      <t>In summary, byte-string wrapping is the most reliable approach because it clearly delineates what is signed or hashed and works with every decoder, but the other designs can also be made to work.</t>
    </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-serialization</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'bf636162630163646566026367686903ff',
     h'bf7f6161626263ff017f6264656166ff027f63676869ff03ff'],
  "preferred-plus-serializations": [ 
    h'a3636162630163646566026367686903',
    h'a3636162630163676869036364656602',
    h'a3636465660263616263016367686903',
    h'a3636465660263676869036361626301',
    h'a3636768690363616263016364656602',
    h'a3636768690363646566026361626301'],
  "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="Bormann" fullname="Carsten Bormann">
        <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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
Dh1beCu2SFWk5Scj4cFNwP4weJOA1q3F0zYF/ZKPOZzTNImRnrFtl9TagFB5
Ehsenh62No64t3GkzY1RMa93PO4ECq9RgdBnmnH1KbjPtytYGiXfZm73bO5Z
nNpGnKTNqeWXPY6ptLFHN8Sx9Vyi7YZ7DuNH9FuZ/KXWJFCuIsnF0nrPA0bP
abJde9c3Gn75EnQj/8arrdXkcOxjUki4accOl7T+IGO6fXf9kggSc7MZSLmk
djrtp/GR91xuiuyvwLbes2u203lJEkdaIuNLqYnLU3uO2g7NaxJtaajt9MQt
NkU+0e7StnYa3iDVT+CleV6a0ak/EVyTyaowV4ko8b6lXSQ/mAJys3huO9pw
S2gWm/B0uX2LZgBq7yis+58hVmEyLNd1N0VoqP8ftf17/OLlBy0SZyR8V1il
Gk6SJj6LqSo2wwuPUndNb2NWkmlvxRZR0q6wZFOXpKa8QJOYttcg+QVxQHX4
+A6AghqItCkJhGqt8KmlvbQcLNsI7mWwfMr8Q1sIMoI3opi5jDwkqUBlqfcA
6O64kkFdQMie6Lw6pjkU91FX4Dxvmi51y5UCdcVKgHQhpM259ItBlbMhF9ak
dKKxQ5u2a71D0eGC3m6daymGr0I1ra1JXyGPip46K/9dIlHx7S0yziqxgrmY
ooz9x7QowlzuGy6+p22UndKMhHJBv3u3bIlm+7G9ua1ZO19kc1eDFGtt793i
zLT049677Ci2sP9cnb55mfjPGhlc+kmjSx+lMSqlneW2FjkrS9ZvQbhNRXvF
J5raRku2NINt5uWtzjnKm6bP1ZhCetJiWReZvc3nPqUSrBPPzH3uNOdwqs2g
UIG8i5pVAQuv0qS0Vlw2E1BWOPCjvBImj2olSP6YQNcYi0A+m1of85LEdbO3
f/mP/0prtRUFo4vnl5Q+6X5g87cv4RpQFUTpkFfaMmKhA+tcSvqdDY7PQeAV
lAamcXPx/hBjLBANfklGF6tqlh2IHu2tzMz6d7U2iw2oJBsRrmOJkoalf5qz
3UBUrQio2dGxtaUE7jdW/EcJkXLueA7rY3eaARO2kcrEUktbdUwFRH7GCmKz
Q8VJLupeLLjAKl12pkmisIbNPIgNKVvHPHzbuMaNkcFjQ07jgVH5OcHntfCs
Ws12qrkDv2LF0dBaFgQiGRWLJUfuxVWl7PgFmTPX+pPaZtXU6ihqZMJcK796
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
0dRfAQA=

-->

</rfc>
