<?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-11" 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-11"/>
    <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 122?>

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

<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 anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</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 <bcp14>RECOMMENDED</bcp14> 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 <bcp14>RECOMMENDED</bcp14> 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 <bcp14>MAY</bcp14> 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 <bcp14>MUST</bcp14> define a serialization strategy that ensures the sender and receiver use interoperable serialization.</t>
          <t>The strategy most highly <bcp14>RECOMMENDED</bcp14> 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 <bcp14>RECOMMENDED</bcp14>.</t>
          <t>An end-to-end protocol <bcp14>MAY</bcp14> instead define its own specialized serialization (see <xref target="SpecialSerializations"/>).
In such cases, it <bcp14>MUST</bcp14> explicitly specify the permitted serialization behaviors necessary to ensure interoperability.
For example, if a sender is permitted to use indefinite-length serialization, the protocol <bcp14>MUST</bcp14> 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 <bcp14>RECOMMENDED</bcp14> 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 <bcp14>RECOMMENDED</bcp14> 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 <bcp14>RECOMMENDED</bcp14> 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 <bcp14>MAY</bcp14> 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 <bcp14>RECOMMENDED</bcp14> 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 <bcp14>RECOMMENDED</bcp14> 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 <bcp14>MUST</bcp14> 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"/>) <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> be used for text and byte strings.</t>
          </li>
          <li>
            <t>Definite-length encoding <bcp14>MUST</bcp14> be used for maps and arrays.</t>
          </li>
          <li>
            <t>Floating-point:  </t>
            <ul spacing="normal">
              <li>
                <t>Values <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> be encoded as 0xf90000.
For another example, 0.1 would lose precision if not encoded as double-precision so it <bcp14>MUST</bcp14> be encoded as 0xfb3fb999999999999a.
Subnormal numbers <bcp14>MUST</bcp14> be used where they give the shortest exact encoding.</t>
              </li>
              <li>
                <t>Encoders <bcp14>MUST NOT</bcp14> 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 <bcp14>MUST</bcp14> 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 <bcp14>MUST NOT</bcp14> be encoded.</t>
              </li>
              <li>
                <t>If a value can be encoded using major type 0 or 1, then it <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> meet these requirements for the data types and ranges it has chosen to support.
A preferred-plus decoder <bcp14>MAY</bcp14> accept non-preferred-plus input.
See <xref target="CheckingDecoder"/>.
A decoder <bcp14>SHOULD</bcp14> 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 <bcp14>MUST</bcp14> be accepted for all major types.</t>
          </li>
          <li>
            <t>If arrays or maps are accepted, definite-length arrays or maps <bcp14>MUST</bcp14> be accepted.</t>
          </li>
          <li>
            <t>If text or byte strings are accepted, definite-length text or byte strings <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> be accepted.</t>
              </li>
              <li>
                <t>If the range of single-precision is supported, finite single- and half-precision values <bcp14>MUST</bcp14> be accepted.</t>
              </li>
              <li>
                <t>Half-precision NaN (0xf97e00), Infinity (0xf97c00), and -Infinity (0xf9fc00) <bcp14>MUST</bcp14> 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"/> <bcp14>MUST</bcp14> be accepted. This includes:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Leading zeros <bcp14>MUST</bcp14> be ignored.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>For full interoperability, an empty byte string <bcp14>MUST</bcp14> 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"/> <bcp14>MUST</bcp14> be used.</t>
          </li>
          <li>
            <t>If a map is encoded, the items in it <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> be used, except that maps and arrays <bcp14>MUST</bcp14> be encoded with indefinite lengths.
Strings retain definite-length encoding, and map ordering <bcp14>MUST</bcp14> 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 <bcp14>MUST NOT</bcp14> incorporate, modify, or otherwise affect any data types other than the type defined by the tag itself.
A set of tags <bcp14>MAY</bcp14> 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 <bcp14>MUST</bcp14> 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="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>
        <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="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </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 734?>

<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 <bcp14>MAY</bcp14> be encoded either as an integer epoch date or string date. The receiver <bcp14>MUST</bcp14> 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 <bcp14>MAY</bcp14> be encoded as an integer or a floating-point number. This allows for minimal encoding size while supporting a large range. The receiver <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> be used.</t>
        <t>This equivalence also applies when floating-point values are used as map keys.
A map key encoded as half-precision <bcp14>MUST</bcp14> 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 <bcp14>SHOULD</bcp14> 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 <bcp14>SHOULD</bcp14> 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 <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> 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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
2ndgEqEJsdg+vLu0BY5Smygu1YMaS19z4eb23oN+7KoJ/muuUmErK+WzpKk6
4X8oynfjUskXa08C1oLReZwqLknPJu+RlD2DC5Qt4ZDlpq09EDZKs/Vlxr5I
R3dxDPAUovUNd91s6n+XWixix2ALPjwks1nP9hYQDZHs7hKJ2WKt7UXaQqDt
3FsOD88MKzUxRSQtHFMNsyRokEOF7zmvKPDTTXLcuTXxPjVNAGoTitLhPG+f
JQc0ddnj3reomWMI51i6YnNlQ7IANUHPL2KPr3/A8K5GnxAZ/NuojFPAx6mD
zwjVqqqL3Pff0zKLs929/x5mceE1GFuyt9eIBKxC+TM2Vjp5Lg4YF/G1u9sj
64GyB94rUiFLd+q3shDFJQ9yl4c53RO19+QHz4PNByYlaurmeS092HieFOfS
XJZ9w6a0XkWR+MD88uUHBme9cOuVa47TeF/pEclqY90PcV1rkeCad6SnVNXS
e0pCSBDqUl7WJi5I1Gfke3YYyJcZX0UpE4xHI4ZCX2PBbBmndBQZwbIl5jhQ
4TsjfcjL+BW3umwxFjHTDlKf9F42X8tUnLfkbBFjqnB/7kkjksu8qZAN3jPj
BUtZmK/PkBGnRvHeJGSQ41RbiVEsDhnKczTHh2ZnZJgZx7VgRK7ac6WGRC6B
GoZpBEV6TYvw9ySVs2GuVoE2rJlga9jvbTQ2ag1XgkOzUjcF9sSid71jZUNT
Sl/WQhOtCBAvOTjUEHdtzmx6Jar11eme2O4MTeut1Lobu/BSMMaXL+eafvPK
FUZN/J56aMZ6PKaKaGP/TWkKZXJ6zDh+Q1czmluODGnazUMOtC8bOyndUhXl
LBIuKe5ht5mkbXPMZEArDtAjAi6BQb/zEzOJW/KKC+0as4cBLqWxbNONJ+sE
h+lgL3MyyGr/SiSSHxHnPvInH6v8I8+1u2e8GGjTQqqK1Q6ed7ioolReLd0h
+EUcAhe5uyeCXqYDSLfJWVKx9tHcVNNusrZsoQGxgRNxsDULoNttdgBHs4uk
qPLOh+K5rFHWpLnaDkuyVir5xedpJSDZE9Zapn6DWJ99JaXY3ZNH99ILShcy
ExcJTJO5CRUm4scNulMTLvv803rhPUJaiRsyEZWs7yNk43RGu+kNvdgfD/zA
A77hyp5c3i/xelTZExAHizS8LRwb4IN6eGZU9aC370xWD4tCMRkzXDL//rDn
QaOEWbUZaalajh6HFeBaNih9WOoiGneefku5pHxuzDHhOZXAn0cf31xciRpE
dvxvn3bwnaDPLnz6RGKPf3zz+uPb86sbetH8DAfeAxf//N7/PjqqD/Di8uba
fD/4fDCd/vQmgrk1FjWY9Pryhyt8x7yyi0UE4JXf/z7adSf9zlvj3p43ytX5
1cfLK36YFzD4jH2CvYf+60+XFzf4qDOVO5OO3RvC6Aiu65CHOGu//uFNA8D2
D7wH6gB7Vh8gANjJFH8YZvsHNZjha2th5s77nbdMB2b6kDc3TK4TP2ucdx0A
PXj0omEw2Z8uPrz7eP3TC0wDwJlhMu975wAVlEdHbU/wsnfD92AZ3nbroD5/
9erju6uLEGb+W3jyr0KTrQOJVy+aTv5o33ugfvLDYX2E4Oin7s9Pb+gkjvZr
R6Hjh4d3Yl4aDhtfajk/PkB3Wz33+PCLdceH3zcc3+DwpL7hhgOozy6376UN
NPOFBCBvOA8yoVFKtE++x4z8jMQ1F3H3f+QLc/3j5Wu9MsNj7/sXl+fXH19d
vtYN7A73TxCJj/a8x95eXn20EKAzPag94EFpOPAf0C/NWob7/krenv9zMMXh
vvfAm3fXPt7AEbr0oucS2gCMoThWB6Q80QjIV/vXdUAe7Hvf1wE54DXtn+x5
D9ZA+ez0We0BD5TPTg79pYSgPHVASSPUQDk8GnhPtMDSv309lwp3OtjgtV0w
W2biHqXH+Mu96EsnYjErCr8Hpfd7xV4s9Onj6u88Dvm8ZZQ5GsXNKL/zGUvb
S3DCkT+1S79/5zGI5xjwCsLxLr70/feN9Jw3yY/xgr6PBvphpBLhLs69h+t4
jtD97mkvGvQHCFh86GuUzEAuC97pDelZWWm5HHE6mrS/ccU2Nk/Ppma8jhlT
V/+H7xvv6e9+RwD5fe2W17b1u2h317C82oXu4TB7e8z/mjYS4VYImVCaFCt1
oAfaPa4HDANzl5DoOxxXVK+yfSAl+7yX72qMcQ8xoX1fe8+3gGsNqN/XCFsD
VD3S1gi6NYB7HJheOmBqBI8FE66/V+cQe3j8njQafdc4AG2OQOpLR74k2w5W
uWwOd33MPdM9NwnIe+YCmlwzH4ruBL7sB+fKhMubWaf2Be3myWluV2tqPkBz
+vv0Qqhq1W+5vOgjDafdK0eLer11RONr56vS+IDQ16wIPj2l/0xGs3Zi71L8
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
SYJVJx7T2xKrtkImi0P88/8AKkAzDzSCAQA=

-->

</rfc>
