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

<t>RFC 8949 defines CBOR, a standard for serializing data types such as integers, strings, and arrays into encoded bytes.
CBOR serialization is flexible, allowing data types to be encoded in multiple ways to accommodate deployment in constrained environments.
This document normatively defines one particular serialization, called "preferred-plus serialization," that is suitable for the majority of CBOR-based protocols.
Protocol designers and implementers who choose it need not understand or specify serialization details themselves.
This document also normatively defines a deterministic serialization.
These serializations are largely compatible with those widely implemented by the CBOR community.</t>
      <t>This document updates RFC 8949 with a new rule that limits how new tag definitions can affect the CBOR data model.</t>
      <t>This document provides clarifications to RFC 8949 regarding bignums and floating-point NaN handling, along with general background information on serialization, determinism, and CBOR byte-string wrapping.</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 138?>

<section anchor="Introduction">
      <name>Introduction</name>
      <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">e.g., <xref target="UML"/></td>
              <td align="left">CDDL <xref target="RFC8610"/></td>
              <td align="left">CBOR <xref target="RFC8949"/></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 context.</t>
        <t>CBOR defines a palette of basic types, including the usual integers, floating-point numbers, strings, arrays, and maps.
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, CDDL may be used to describe the data model of a protocol.</t>
        <t>The types in the data model are serialized per <xref target="RFC8949"/> to create encoded CBOR.</t>
      </section>
      <section anchor="flexible-serialization">
        <name>Flexible Serialization</name>
        <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">Encoded 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">0x820102</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">0x9f0102ff</td>
            </tr>
          </tbody>
        </table>
        <t>Similar flexibility exists for most other CBOR data types.</t>
        <t>This flexibility is deliberate: CBOR is designed to allow encodings to be selected according to the constraints and requirements of a particular environment.
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.
(CBOR is not unique in this regard; compare ASN.1's BER encoding rules.)</t>
        <t>Crucially, CBOR allows — and even expects — that some implementations will not support all serialization variants.
JSON also permits variation (1, 1.0, and 0.1e1 represent the same number), but expects every parser to handle all of it, since the variation is there for human readability rather than for ease of implementation in constrained environments.</t>
        <t>However, CBOR's 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="RFC8949"/>.</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>From many years of CBOR deployment, we know that some serialization variants like indefinite-lengths are not commonly used.
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><xref target="PreferredPlusSerialization"/> 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 above, some serialization variants like indefinite-lengths are not commonly used.
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><xref target="DeterministicSerialization"/> defines that serialization: deterministic serialization.</t>
        </section>
      </section>
      <section anchor="unspecified-serialization">
        <name>Unspecified Serialization</name>
        <t>Many CBOR-based protocols, such as CWT <xref target="RFC8392"/>, state no serialization requirements, which leaves open what an implementation needs to support.
Is a CWT decoder required to accept indefinite-length items, for example?</t>
        <t>One interpretation of <xref target="RFC8949"/> is that, absent any specification, a decoder is expected to accept every serialization variant, so that it can decode anything it receives.
<xref target="RFC8949"/> defines this full set of variants without naming it; this document introduces the name "general serialization" for it in <xref target="GeneralSerialization"/>.</t>
        <t>In practice, however, decoders for CWT and other CBOR-based protocols often omit support for indefinite lengths and other variations because of the added complexity, and encoders accordingly avoid them.
An encoder emitting indefinite lengths would still be fully conforming, yet could fail against such a decoder.
This practice has rarely caused problems, but it means interoperability rests on convention rather than on the specifications themselves.
<xref target="Recommendations"/> addresses this.</t>
      </section>
      <section anchor="relation-to-rfc-8949">
        <name>Relation to RFC 8949</name>
        <section anchor="serialization">
          <name>Serialization</name>
          <t>This document defines new serializations rather than updating those in <xref target="RFC8949"/>.
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 here are formally new, but they differ little in practice from what CBOR libraries already implement.
For example, the shortest-length argument encoding described in <xref section="4.1" sectionFormat="of" target="RFC8949"/> is widely implemented for both encoding and decoding, and is the same as that required by the serializations defined here.
See <xref target="RelationToPreferred"/>.</t>
        </section>
        <section anchor="tags-and-data-models">
          <name>Tags and Data Models</name>
          <t>This document updates <xref target="RFC8949"/> in one way: it limits how new tag definitions can affect data models.
The definitions of tags 2 and 3 (bignums) in <xref section="3.4.3" sectionFormat="of" target="RFC8949"/> modifies the integer type in the CBOR basic generic data model; this is allowed as a one-time exception.
The new rule preserves data model definitions against later modification by unrelated tag definitions, which might undermine their semantics and upset their previous use.</t>
        </section>
      </section>
    </section>
    <section anchor="Recommendations">
      <name>Recommendations Summary</name>
      <section anchor="ProtocolSpecifications">
        <name>Protocol Specifications</name>
        <section anchor="FrameworkProtocols">
          <name>Framework Protocols</name>
          <t>Framework protocols are those that offer 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 new CBOR-based framework protocols not impose serialization requirements and include a statement such as:</t>
          <ul empty="true">
            <li>
              <t>This protocol intentionally specifies no serialization requirements so that serialization can be adapted to individual environments.
End-to-end protocols (or profiles) that use this protocol are expected to specify serialization.</t>
            </li>
          </ul>
          <t>It is RECOMMENDED that extant framework protocols that are silent about serialization (e.g., CWT) be interpreted as if they contained this statement.</t>
          <t>Alternatively, new 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>One scenario in particular calls for deterministic serialization in a framework protocol: a design in which the parties independently construct and serialize the data to be hashed or signed, rather than transmitting those exact bytes.
See <xref target="WhenDeterministic"/>.
For such a design to function correctly, the framework protocol must require deterministic serialization, possibly only for a subset of the protocol.
COSE is an example, elaborated upon in <xref target="COSESerialization"/>.</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 multi-vendor interop testing events.
TLS, HTTP, and FIDO are examples of end-to-end protocols.</t>
          <t>New 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 — conformance with <xref target="PreferredPlusEncoding"/> and <xref target="PreferredPlusDecoding"/>.
If a protocol does not need to be deployed where map sorting is too expensive, requiring deterministic serialization — conformance with <xref target="DeterministicEncoding"/> and <xref target="DeterministicDecoding"/> — 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>An end-to-end protocol that gives no serialization requirements is ambiguous.
For such extant protocols, use of preferred-plus serialization is RECOMMENDED unless existing deployments of that protocol have established a different practice.</t>
        </section>
      </section>
      <section anchor="libraries">
        <name>Libraries</name>
        <t>For the following sections on libraries, implementing preferred-plus serialization means making <xref target="PreferredPlusEncoding"/> the default or primary behavior for encoding and fulfilling <xref target="PreferredPlusDecoding"/> for decoding.
Similarly, implementing deterministic serialization means making <xref target="DeterministicEncoding"/> the default or primary behavior for encoding and fulfilling <xref target="DeterministicDecoding"/> for decoding.</t>
        <section anchor="cbor-libraries">
          <name>CBOR Libraries</name>
          <t>It is RECOMMENDED that CBOR libraries implement preferred-plus serialization.</t>
          <t>Preferred-plus serialization is recommended because it is suitable for the majority of CBOR-based protocols.
Also, in practice, preferred-plus serialization is equivalent to preferred serialization (<xref section="4.1" sectionFormat="of" target="RFC8949"/>) for most use cases.</t>
          <t>It is also RECOMMENDED that CBOR libraries offer deterministic serialization either as a selectable option or as the default, 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 stronger for environments in which map sorting is easy to implement (for example, Python, Go, and Ruby).</t>
          <t>Deterministic serialization requirements are a superset of those for preferred-plus; a CBOR library that implements only deterministic serialization therefore satisfies the recommendation for preferred-plus serialization.</t>
          <t>A CBOR library MAY also implement 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 a library for it implement preferred-plus serialization.
For example, CWT does not mandate a serialization, so it is recommended that libraries implementing them use preferred-plus serialization.
Alternatively, a framework protocol library may implement only deterministic serialization if this aligns with its deployment environment and design goals.</t>
          <t>When a framework protocol mandates serialization requirements, conforming libraries follow them.
For instance, small parts of COSE require deterministic serialization to function correctly.
See <xref target="COSESerialization"/>, which shows how COSE requires deterministic serialization for some parts and, as a framework protocol should, leaves others unconstrained.</t>
        </section>
        <section anchor="libraries-for-end-to-end-protocols">
          <name>Libraries for End-to-End Protocols</name>
          <t>End-to-end protocols are expected to state serialization requirements to ensure interoperability.
Libraries for end-to-end protocols are expected to adhere to them.</t>
          <t>If an end-to-end protocol specification does not state serialization requirements, it is RECOMMENDED that the library implement preferred-plus serialization, unless existing deployments of that protocol have established a different practice (see <xref target="EndToEndProtocols"/>).</t>
        </section>
      </section>
    </section>
    <section anchor="GeneralSerialization">
      <name>General Serialization</name>
      <t>This section assigns the name "general serialization" to the complete set of encodings standardized in <xref section="3" sectionFormat="of" target="RFC8949"/>.
<xref target="RFC8949"/> does not name this set, though it alludes to it in passing as "variant-tolerant decoding".
Any serialization, whether defined in this document or elsewhere, permits only encodings drawn from this set.
General serialization is therefore a superset of them all.
It is described as follows:</t>
      <ul spacing="normal">
        <li>
          <t>CBOR arguments of any length (for example, the integer 0 may be encoded as 0x00, 0x1800, 0x190000, and so on).</t>
        </li>
        <li>
          <t>Floating-point values encoded at any length (for example, 0.0 can be encoded as half-, single-, or double-precision).</t>
        </li>
        <li>
          <t>Both definite- and indefinite-length strings, arrays, and maps.</t>
        </li>
        <li>
          <t>Maps with keys in any order.</t>
        </li>
        <li>
          <t>Bignum representation of values that are also representable using major types 0 and 1 (for example, 0 can be encoded as the bignum 0xc24100).</t>
        </li>
      </ul>
      <t>A decoder claiming to support general serialization MUST accept and decode all the various encodings for the data types it supports.</t>
      <section anchor="default-serialization">
        <name>Default Serialization</name>
        <t><xref target="RFC8949"/> does not explicitly specify default encoding or decoding requirements.
Nothing in it says what a CBOR library needs to support, or what an implementation of a protocol that gives no serialization requirements needs to do.</t>
        <t>Some readers take <xref target="RFC8949"/> to imply that a decoder has to support general serialization and that an encoder is free to use any variant.
This document does not adopt that interpretation, and many implementers have not either.
For example, CWT and COSE decoders typically do not support indefinite lengths, and their encoders do not produce them.</t>
        <t>This document therefore does not treat general serialization, or any other serialization, as a default.
<xref target="ProtocolSpecifications"/> describes how protocol specifications are expected to address serialization, including how to interpret framework and end-to-end protocols that are silent about it.</t>
      </section>
      <section anchor="WhenGeneral">
        <name>When To Use General Serialization</name>
        <t>General serialization is rarely necessary, and support for it is not universal.
Preferred-plus serialization (<xref target="PreferredPlusSerialization"/>) is compact and supports the full CBOR data model (except non-trivial NaNs; see <xref target="NaNBasics"/>), satisfying the vast majority of CBOR use cases.</t>
        <t>The main scenario where general serialization is warranted is a protocol that has to accommodate highly constrained encoders,
at the cost of requiring decoders — assumed to be unconstrained — to support every possible serialization option.</t>
        <t>A protocol that requires general serialization needs to state so explicitly; see Section {EndToEndProtocols}.</t>
        <t>See also special serializations (<xref target="SpecialSerializations"/>), which enable 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 serialization forms, to be useful to 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>
      <t>Preferred-plus serialization specifies how each data type is encoded.
Like the rest of CBOR, it does not specify which data types an implementation supports, nor which range of values it supports for a given type.
An implementation is free to support as much or as little of CBOR as its protocol requires; preferred-plus constrains only the encoding of what it does support.</t>
      <t>For example, a very small CBOR library might support only the integers 0 to 10 and arrays of length 0 to 10.
Preferred-plus allows this, but requires that those arrays be definite-length and that, over this range, the integer value and the array length each be encoded in the initial byte.</t>
      <t>Similarly, preferred-plus places no requirement on the range or precision of floating-point values, but requires that each value it does encode be encoded in exactly one way — for example, 5.9604644775390625E-8 is always encoded as a half-precision subnormal.</t>
      <t>Many protocols use only some data types, and only part of the range of those they use.
Implementers need to ensure that the library they use supports the data types, ranges, and precision their protocol requires, and that its encoding and decoding meet the requirements in this section.
A library intended for general use will typically support most or all data types and values.</t>
      <section anchor="PreferredPlusEncoding">
        <name>Encoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>The shortest form of the CBOR argument (see <xref section="3" sectionFormat="of" target="RFC8949"/>) MUST be used.
This does not apply when the CBOR item is a floating-point value.
The following describes how an argument in each range is encoded.
"ai" is the additional information, the low-order 5 bits of the initial byte.  </t>
            <ul spacing="normal">
              <li>
                <t>0..23 is encoded in the same byte as the major type.</t>
              </li>
              <li>
                <t>24..255 is encoded with one additional byte (ai = 0x18).</t>
              </li>
              <li>
                <t>256..65535 is encoded with two additional bytes (ai = 0x19).</t>
              </li>
              <li>
                <t>65536..4294967295 is encoded with four additional bytes (ai = 0x1a).</t>
              </li>
              <li>
                <t>4294967296..18446744073709551615 is encoded with eight additional bytes (ai = 0x1b).</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Definite-length encoding MUST be used for text and byte strings.</t>
          </li>
          <li>
            <t>Definite-length encoding MUST be used for maps and arrays.</t>
          </li>
          <li>
            <t>Floating-point:  </t>
            <ul spacing="normal">
              <li>
                <t>Values MUST be encoded in the shortest of double, single, or half-precision that represents the value exactly.
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 used where they give the shortest exact encoding.</t>
              </li>
              <li>
                <t>Encoders MUST NOT output any NaN other than the half-precision NaN 0xf97e00 (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 0xf97e00.
Consequently, the floating-point values that can be encoded are the finite numbers, positive and negative infinity, and one 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="RFC8949"/> and also as <xref section="4.2.1" sectionFormat="of" target="RFC8949"/>.</t>
              </li>
              <li>
                <t>Note that this implies that most preferred-plus implementations have to support encoding as single and half-precision.
Specifically, if the numbers presented for encoding are double-precision, then conversion to single and half-precision is required.
If the numbers presented for encoding are only single-precision, then conversion to half-precision is required.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Bignums (tags 2 and 3):  </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 bignum.</t>
              </li>
            </ul>
          </li>
        </ol>
      </section>
      <section anchor="PreferredPlusDecoding">
        <name>Decoder Requirements</name>
        <t>If a decoder claims to support preferred-plus serialization it MUST meet these requirements for the data types and ranges it has chosen to support.
A preferred-plus decoder MAY accept non-preferred-plus input.
See <xref target="CheckingDecoder"/>.
A decoder SHOULD support the same types and ranges as its corresponding encoder, if it has one.</t>
        <ol spacing="normal" type="1"><li>
            <t>The shortest-form argument MUST be accepted for all major types.</t>
          </li>
          <li>
            <t>If arrays or maps are accepted, definite-length arrays or maps MUST be accepted.</t>
          </li>
          <li>
            <t>If text or byte strings are accepted, definite-length text or byte strings MUST be accepted.</t>
          </li>
          <li>
            <t>If floating-point numbers are accepted, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>If the range of double-precision is supported, finite double-, single-, and half-precision values MUST be accepted.</t>
              </li>
              <li>
                <t>If the range of single-precision is supported, finite single- and half-precision values MUST be accepted.</t>
              </li>
              <li>
                <t>Half-precision NaN (0xf97e00), Infinity (0xf97c00), and -Infinity (0xf9fc00) MUST be accepted.
These are the only forms of these values a preferred-plus encoder can produce, so accepting their single- and double-precision forms is allowed, but not required.</t>
              </li>
              <li>
                <t>No requirement is made on how a decoded floating-point value is represented to the layer(s) above the decoder; conversion from double, single, or half-precision into that representation may be necessary.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If bignums (tags 2 and 3) are accepted, the following apply. (This is a maximally permissive acceptance mode, adopted to compensate for ambiguity in <xref section="3.4.3" sectionFormat="of" target="RFC8949"/>.)  </t>
            <ul spacing="normal">
              <li>
                <t>Bignums described in <xref section="3.4.3" sectionFormat="of" target="RFC8949"/> MUST be accepted. This includes:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Leading zeros MUST be ignored.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>For full interoperability, an empty byte string MUST be accepted and treated as the value 0 for a positive bignum and the value -1 for a negative bignum.</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>See  <xref target="BigNumbersDataModel"/> and <xref target="BigNumberStrategies"/> for further background on bignums, <xref target="BigNumbersCDDL"/> for the CDDL specification, and <xref target="CheckingDecoder"/> for overrides to the above decoding rules for serialization-checking decoders.</t>
      </section>
      <section anchor="when-to-use-preferred-plus-serialization">
        <name>When to use preferred-plus serialization</name>
        <t>Preferred-plus is the recommended choice for most protocols.
It can serialize all CBOR data types and value ranges (except non-trivial NaNs), encodes compactly, is straightforward to implement, and is widely supported by CBOR libraries.
It provides strong serialization 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 equivalent to the deterministic serialization of <xref target="DeterministicSerialization"/> 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 (<xref section="4.1" sectionFormat="of" target="RFC8949"/>).</t>
        <t>The differences are:</t>
        <ul spacing="normal">
          <li>
            <t>Encoders use only definite lengths; this is a requirement, not a preference.</t>
          </li>
          <li>
            <t>Encoders emit only the half-precision quiet NaN.</t>
          </li>
          <li>
            <t>Decoders ignore leading zeros in bignums and accept the empty byte string as zero.</t>
          </li>
        </ul>
        <t>These differences are unlikely to affect real-world implementations and many implementations are already close to conforming.</t>
        <t><xref section="3" sectionFormat="of" target="RFC8949"/> 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="RFC8949"/>.</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="RFC8949"/> 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 bignum 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="RFC8949"/> 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="RFC8949"/> and not the same as <xref section="3.9" sectionFormat="of" target="RFC7049"/> / <xref section="4.2.3" sectionFormat="of" target="RFC8949"/>.)</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>Preferred-plus is deterministic if no maps are encoded.</t>
          <t>The decoders are identical (except for a checking decoder for deterministic serialization).</t>
          <t>However, note that deterministic serialization is never a substitute for general serialization where use cases may require indefinite lengths, separate bignums from integers in the data model, or need non-trivial NaNs.</t>
        </section>
      </section>
      <section anchor="map-ordering">
        <name>Map Ordering</name>
        <t>Map ordering in the serialization layer is only to provide determinism and is entirely orthogonal to map ordering at the data model and application layer.</t>
        <section anchor="ordering-at-the-serialization-layer">
          <name>Ordering at the Serialization Layer</name>
          <t>For maps to be encoded deterministically, two independent entities must encode them exactly the same.
The only way to do this for maps is to sort each map's key-value pairs by key.
Thus, for deterministic encoding, maps are sorted.</t>
          <t>While not stated explicitly in <xref target="RFC8949"/>, it does imply that map decoding must never depend on map ordering.
All CBOR map decoding must succeed regardless of the map order.</t>
          <t>There is one exception to this: checking decoders (see <xref target="CheckingDecoder"/>) for deterministic or other serializations that order maps.
Their purpose is to make sure the received CBOR is encoded exactly as specified.
A checking decoder for deterministic serialization therefore rejects unordered maps.</t>
        </section>
        <section anchor="ordering-at-the-data-model-layer">
          <name>Ordering at the Data Model Layer</name>
          <t>Essentially there is no map ordering at the data model layer; applications and implementations can not rely on it.</t>
          <t>The CBOR data model for maps clearly indicates that they are not ordered (see <xref section="5.6" sectionFormat="of" target="RFC8949"/>).
This is the same as for JSON objects.</t>
          <t>Some programming environments, like the Go programming language, provide no ordering guarantees for maps.
A CBOR decoder is under no obligation to present a map in the order it was received.
Even if a map is deterministically encoded, it may not be presented at the application layer in map key order.</t>
          <t>A particular CBOR library or a particular programming environment may present sorted maps to the CBOR application if it wishes, but this is a feature of the library or programming environment only; protocols or system designs can not expect it at the application layer, even when deterministic serialization is required.</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 text strings, byte 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>Use of a bignum for shorter encoding of 33- to 56-bit integers (a 40-bit value with implied tag takes 6 bytes rather than 9).</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><xref section="2" sectionFormat="of" target="RFC8949"/> 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="RFC8949"/> 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 top-level data item or byte-string-wrapped sub-parts.</t>
      <t>The controller (the right-hand side) is a text string and 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 extends recursively through nested arrays, maps, and tag content, 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>As with filtering control operators such as .size, .serial constraints intersect when nested, whether through direct nesting or because a type with its own .serial appears within the scope of another.
Since deterministic serialization is a subset of preferred-plus, wherever both apply the effective requirement is deterministic, regardless of which one is outermost.</t>
      <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="RFC8949"/> apply.</t>
      <section anchor="CovertChannels">
        <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 in 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 about 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>Techniques that may be used to establish a covert channel include:</t>
        <ul spacing="normal">
          <li>
            <t>Varying the encoding of CBOR arguments (as above)</t>
          </li>
          <li>
            <t>Varying the encoding of floating-point values (half-, single-, or double-precision)</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 some 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>Checking for preferred-plus or deterministic serialization as described in <xref target="CheckingDecoder"/> can reveal unexpected variation, and so expose an attack, but cannot prevent one.</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="RFC8949">
          <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="10" month="August" 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-18"/>
        </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" initials="B." surname="Lampson">
              <organization>Xerox Palo Alto Research Center, Palo Alto, CA</organization>
            </author>
            <date month="October" year="1973"/>
          </front>
          <seriesInfo name="Communications of the ACM" value="vol. 16, no. 10, pp. 613-615"/>
          <seriesInfo name="DOI" value="10.1145/362375.362389"/>
          <refcontent>Association for Computing Machinery (ACM)</refcontent>
        </reference>
        <reference anchor="UNICODE-NORM" target="https://www.unicode.org/reports/tr15/">
          <front>
            <title>Unicode Normalization Forms</title>
            <author initials="K." surname="Whistler" fullname="Ken Whistler">
              <organization/>
            </author>
            <date year="2025" month="July" day="30"/>
          </front>
          <seriesInfo name="Unicode Standard Annex" value="#15"/>
        </reference>
      </references>
    </references>
    <?line 712?>

<section anchor="DeterministicConsiderations">
      <name>Specifying a Fully Deterministic Protocol</name>
      <t>While deterministic serialization (<xref target="DeterministicSerialization"/>) is sufficient to make most protocols fully deterministic, it is not sufficient for all.
This appendix describes some issues that may need further requirements.
Note that these issues occur for parts of the protocol that the sender and receiver construct independently.
See <xref target="WhenDeterministic"/>.</t>
      <section anchor="protocol-data-definition">
        <name>Protocol Data Definition</name>
        <t>For a protocol to be deterministic, its definition at the data model layer must be deterministic.</t>
        <t>Here’s an example definition:</t>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <t>At the sender’s convenience, the birth date MAY be encoded either as an integer epoch date or string date. The receiver MUST decode both formats.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>While this definition is interoperable, it lacks determinism.
The definition leaves a choice open, just as CBOR leaves encoding choices open when deterministic serialization is not required.</t>
        <t>To make this example definition deterministic, specify one date format and prohibit the other.</t>
        <t>A more interesting source of variability is CBOR's variety of number types.
For instance, the number 2 can be represented as an integer, float, bignum, decimal fraction and others defined by tags in the CBOR tag registry.
Most protocol 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 example, a fluid level of 2 is always encoded as an integer, never as a floating-point number; and a level of 2.000001 is always encoded as a floating-point number so as not to lose precision.
See the numeric reduction defined by <xref target="I-D.mcnally-deterministic-cbor"/>.</t>
      </section>
      <section anchor="text-strings-and-unicode">
        <name>Text Strings and Unicode</name>
        <t>CBOR's text string type (major type 3) carries UTF-8, which is itself unambiguous.
Unicode is not: the same text may be written as different sequences of code points, since a character with a diacritic can appear either precomposed or as a base character plus combining marks.
"é" is either U+00E9 or U+0065 plus U+0301.
As with the number types above, a deterministic protocol must choose one representation — typically by requiring a Unicode normalization form like Unicode Normalization Form C (NFC) <xref target="UNICODE-NORM"/>.</t>
      </section>
      <section anchor="cbor-tags">
        <name>CBOR Tags</name>
        <t>Some tags allow their content to be represented in more than one way.
For example, the epoch date (tag 1) allows either integer or floating-point representation.
A deterministic protocol using tags should examine each tag's definition for such variability and define a deterministic rule for selecting among the alternatives it finds.</t>
      </section>
    </section>
    <section anchor="NaN">
      <name>IEEE 754 NaN</name>
      <t>This section provides background information on <xref target="IEEE754"/> NaN (Not a Number) and its use in CBOR.</t>
      <section anchor="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, JavaScript, Python and Rust do not 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="RFC8949"/>.</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="RFC8949"/> 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="RFC8949"/> 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="RFC8949"/> describes how NaNs are treated as equivalent when used as map keys.
These three parts of <xref target="RFC8949"/> are consistent and are the basis of this restatement.</t>
        <t>Since <xref section="4.2.1" sectionFormat="of" target="RFC8949"/>, (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="RFC8949"/> 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 RFC 8949</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="RFC8949"/>.</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="RFC8949"/>.</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="RFC8949"/>.</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="RFC8949"/> 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 a negative value on failure.
-1 indicates the conversion can't be performed because the input is out of range or precision would be lost.
-2 indicates a non-trivial NaN was given for encoding which should either be rejected or output as a half-precision quiet NaN.</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  103
#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 -2; /* 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 -2; /* non-trivial NaN */
    }
  } else {
     return -1; /* large exponent -- out of range for single */
  }
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="BigNumbersDataModel">
      <name>Bignums 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="RFC8949"/>).
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="RFC8949"/> 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="RFC8949"/> 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="RFC8949"/>  along with text in <xref section="2" sectionFormat="of" target="RFC8949"/> 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="RFC8949"/>.
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 Bignums</name>
      <t>The types bigint and biguint in the CDDL Standard Prelude (<xref section="D" sectionFormat="of" target="RFC8610"/>) do NOT describe the bignums described in this document or in <xref section="3.4.3" sectionFormat="of" target="RFC8949"/>, 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 bignum 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="RFC8949"/>.
<xref target="BigNumbersDataModel"/> explains the reasons for this.</t>
      <t>The following CDDL can be used:</t>
      <artwork><![CDATA[
; bignum 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>Bignum Implementation Strategies</name>
      <t><xref target="BigNumbersDataModel"/> describes how CBOR defines a single integer number space, in which bignums 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 bignums (e.g., JavaScript, Python, Ruby, and Go), while others do not (e.g., C, C++, and Rust).
Even in environments that support bignums, 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 bignums.</t>
      <t>When a CBOR library provides a bignum 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 bignums must accept values encoded using major types 0 and 1, even though the returned representation is a bignum.</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 bignum 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 bignum 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 bignums 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 that, while well-formed CBOR, does not conform to a 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, for instance, any CBOR data item that is not encoded in its shortest form.</t>
      <t>To align with long-settled security practice and defend against malformed input attacks, every CBOR decoder must reject all input that is not well-formed.
Serialization checking goes beyond that.
The data rejected by serialization checking is well-formed; it is rejected only because of additional serialization constraints.</t>
      <section anchor="serialization-checking-use-cases">
        <name>Serialization Checking Use Cases</name>
        <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 helps defend against covert channels described in <xref target="CovertChannels"/>.</t>
        <t>Applications that rely on deterministic serialization may use serialization checking to ensure that the data they consume is truly deterministic and that the assumptions their logic makes about determinism hold.</t>
        <t>A protocol that depends on deterministic serialization may recommend or require its decoders to perform serialization checking.
CBOR libraries may offer serialization checking as a selectable option, at some cost in code size and processing.</t>
        <t>Serialization checking may enhance security in certain contexts, but such checking is never a substitute for complete well-formedness checking.
All CBOR decoders — regardless of their capabilities, modes, or optional features — must perform full well-formedness checking.
They must also reject well-formed input that uses features they do not support.
For example, a decoder that does not support indefinite-length items rejects them because they are unsupported, not because it is acting as a checking decoder.</t>
        <t>A decoder that fails to perform well-formedness checking is unsafe, whatever else it does.
The appropriate remedy is to fix it, not to add the serialization checking described here.</t>
      </section>
      <section anchor="bignum-leading-zero-exception">
        <name>Bignum Leading Zero Exception</name>
        <t><xref section="3.4.3" sectionFormat="of" target="RFC8949"/> requires that decoders supporting tags 2 and 3 be able to decode bignums that have leading zeros, even though preferred serialization never produces them.
This conflicts with the goal of a decoder that checks for preferred or deterministic serialization: such a decoder needs to reject a bignum with leading zeros as non-conformant.</t>
        <t>This document recommends that decoders performing serialization checking reject bignums containing leading zeros, notwithstanding the MUST in <xref section="3.4.3" sectionFormat="of" target="RFC8949"/>.
Serialization checking is optional.
When a protocol selects it — for example, because it depends on deterministic encoding — decoders are expected to perform the check, including rejecting non-preferred bignum encodings such as those with leading zeros.</t>
        <t>Note that serialization-checking decoders always reject the empty byte string, because it always represents a value (0 for tag 2, -1 for tag 3) that can be encoded directly using major type 0 or 1.</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 bignums are included in the test data because preferred-plus serialization requires their unification with integers.</t>
        <artwork><![CDATA[
{
  "description": "A positive bignum",
  "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 bignum, 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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
a3qFmbyPplZ/NrrPi/pb30fMbfRMds3XxugkupAzu/TXC+BVumbLligAE3Lv
vY2BT4CQJC86YX52OLYun7t7pocpQz/D4quinI3SoqJKnAnZqhwRzOlx5IiA
i3wsjxv/E/3J1TkMSKUPI5dMzKn0GXLN0kTFcKF+x2pb+t0WCZ+AMH1xFYp5
2Opc+2TEmgYNr2c2WYDd5/yIYRbSrJoe3cq17NdVwPhOuhO0gzrkw2NWnRZ1
nonUD5jHldRHZLsnc3BW2DrnHChJ0BCFsASFZiyFT608m/IGn7KUm3DEsVBr
KXjiN0upTL0fkHc35Xp0We7qivcLw07HWDMB62KPTaSlNChx7aFokXTbxbvU
sM9x2q4xRBrNgNDwV9cug+By9iKR5E69SHqFKpY5+MFs87bhavidRDhOEKSC
DJ6rtr4s09kynURsVJwD91yK1hvcHP/KECloLN4iZR2kEivFscAu5rHNU6ew
W1SaZ6biJrMJys0S43/DzcPqDagb2+x3uoTGN0nO9uZ6Mqa1m90fIuVNnFLN
Jwq34s6p9Wx8KULiOhpNw04T89kCxLIJIzE+Juc6pJkWWe07Yedz0zF8fJsm
d4yBfgkyf5umFYmPAQx4hLUHebqNo6RCoaXMZ0vCHadSrI8RtnKgX4+KsAoL
A/hefnaPBUq4Ox7c5v2WMrHOLXVKVTWe6At2FDpj9llFbqtA2zhKxKXVKE4/
DwoX9k2Et3FKmSAHhzCAINR73Z+PqU98YG80qZvIVq9RFVE3JS5etBa2kQC5
cw3v7IlySngd7BnV/OfrN73nWo08LcVFA4K408BTNSKm82c2mI0mEeUXoxMw
NB4lfqeKA4f+S/zBBE1SKYW0lWQwQJ4UI60E6IkfbZLGY3TtjLnSJNnvlM8u
yBGOWsBEilHHEUbHO6NIqWlYPHmKQEf6AjvY+Z//NxmQZZyfvx8MLk5xCPzt
+Ijfgt8PBsO+sWs6rEDKgKAW3m1PXCMxZMy1LPAiBhqkKWtviuuONFCaCZbC
mUtRupXTOQJQv3/vff8Gv38V7b5/82oPEOjn95evPry+6L3/8OmdQRdiMugH
k1BDYkCxeqnTQp0TIoVtJi81C78j9GDVoWi4pzRbYO6Q+lq4j3/dz9vgK6QC
1849wGgJGP5AfkP44qknL1EwypKqVPu5IyZowp+InK1coQbbVdKhzHOhTrHt
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

-->

</rfc>
