<?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-12" 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-12"/>
    <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="30"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <keyword>cbor</keyword>
    <abstract>
      <?line 112?>

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

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

<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="J." surname="Hildebrand" fullname="Joe Hildebrand">
        <organization/>
        <address>
          <email>hildjj@cursive.net</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:
H4sIAAAAAAAAA9W963LbaJYg+J9PgZUjylImSZO6WnJldcu2nKke38ZSdnV3
ZY0HJEEJZRJgAaBkttIV/RobsRuxf/c1Zt6kn2TP9bsBIKns3t0YVUVaIoHv
cr7znful1+t17s6ig06nSqtZcha9evnhU3SVFGk8S/81rtI8i+JsEr1OqqSY
p1lazjvxaFQkd02Pdib5OIvnMMykiKdVL02qaW88yote6T7Wm8VVUladcVyd
RWU16SwXE/zkLHp+enja6XTwr7POOM/KJCuX8HlVLJNOWRVJPD+LLi+u33TS
RUEfl9X+YHA62O/E8OVZFO2cLxazdEzzlLT0T0k8612n82Snc58XX26KfLng
xXe+JCv4aHIW4Ro7d0m2hGkj+HEfwr+r1QI29Ud4Pc1uoh/xW/p8Hqczfvvv
ca/9vLihz+NifHsW7dxW1aI8e/YMH8OP0rukr889ww+ejYr8vkye4QjPdnjq
tLpdjuBlgtv9zbO1oNwBaHXiZXWbF2edXpRmAKy3/ejtMpuMZvEkgSH5QN7G
yyLJxon3FSzjDE5wvCzSahVd3yZ5sYrevn0FXyW8tdnN7O9LeaCi7/vjfA5z
wuFURTpaVjwxT/IPeRL9lM4myagAyNtRbuGzv/zl72GYEkGQJZV55R/jSTqP
fsyz8W1c5Hf2nTv8IluOZ+nNbfX3N/ghTa0v/pcki67jL/Eqnsf2rS9J1q/k
UwK182Yny4s5QO2ODvnTm1eIbXL28sHxcAAfTCYz/ODy4uLi5OiQMaKKi5sE
0FWPNE2S5Otilhd4oklCJwrYv5wnWfXs+cnx8f7+Kb/I9woHi64qAEtcTKJp
XkRvZjksJrvpfczTrIrOAcS386RKx4xBcqb4e48PCoegv+l6RNN4Vib0N2JE
UqbZNOfnI50NMBs20NsfDE/li9cfLs+i4aA/HA5On+FTV9ev+/h9X9eMGz9/
f95HKJzZvxDzqvimhI86OJMDSYLcwek+3Jc/Xnfkg9PD4cGZ+WNwhN9+uLrQ
T04GAHr64+JrPF/MkrL3KVno+gVmazGfn3TBZOF0/YaJ0x9/5C9CgNVOky8d
Ysmzra7dMyBFCV7r7Fki66fNvLo+/7jvb+LVLAWUiK7z6BzWCr8icYLj/1jk
VT7OZ9HdfvOapukkj2ezNIZbS+hVLpJxSR/37vb7g96ipJMdDA8G/OmYpupV
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
4kmJ6PV6lLZqnVWsFcbRmyUya98saBoKB7GkQXyyBhysw9mNWiPl4huepL53
P7OUsolXoaBnC9A6A0gZBuHGpN1N0q9OvTGiI2lZevyGAmI0vbdWc9qWpSvN
qzmw1GJNrzCT99HU6s9G93lRf+v7iLmNnsmuaTuLiy7kzC799QJ4la7ZsiUK
wITce29j4BMgJMmLTpifHY6ty+funulhytDPsPiqKGejtKioEmdCtipHBHN6
HDki4CIfy+PG/0R/cnUOA1Lpw8glE3MqfYZcszRRMVyo37Haln63RcInIExf
XIVi3pdgMvOa9MmINQ0aXs9ssgC7z/kRwyykWTU9upVr2a+rgPGddCdoB3XI
h8esOi3qPBOpHzCPK6mPyHZP5uCssHXOOVCSoCEKYQkKzVgKn1p5NuUNPmUp
N+GIY6HWUvDEb5ZSmXo/IO9uyvXostzVFe8Xhp2OsWYC1sUem0hLaVDi2kPR
IplmzdSwz3HarjFEGs2A0PAX1y6D4HL2IpHkTr1IeoUqljn4wWzztuFq+J1E
OE4QpIIMnqu2vizT2TKdRGxUnAP3XIrWG9wc/8oQKWgs3iJlHaQSK8WxwC7m
sc1Tp7BbVJpnpuImswnKzRLjf8PNw+oNqBvb7He6hMY3Sc725noyprWb3R8i
5U2cUs0nCrfizqn1bHwpQuI6Gk3DThPz2QLEsgkjMT4m5zqkmRZZ7Tth53PT
MXx8myZ3jIF+CTJ/m6YViY8BDHiEtQd5uo2jpEKhpcxnS8Idp1KsjxG2cqBf
j4qwCgsD+F5+do8FSrg7Htzm/ZYysc4tdUpVNZ7oC3YUOmP2WUVuq0DbOErE
pdUoTj8PChf2TYS3cUqZIAeHMIAg1Hvdn4+pT3xgbzSpm8hWr1EVUTclLl60
FraRALlzDe/siXJKeB3sGdX85+s3vedajTwtxUUDgrjTwFM1IqbzZzaYjSYR
5RejEzA0HiV+p4oDh/5L/MEETVIphbSVZDBAnhQjrQToiR9tksZjdO2MudIk
2e+Uzy7IEY5awESKUccRRsc7o0ipaVg8eYpAR/oCO9j5n/83GZBlnJ+/Hwwu
TnEI/O34iN+C3w8Gw76xazqsQMqAoBbebU9cIzFkzLUs8CIGGqQpa2+K6440
UJoJlsKZS1G6ldM5AlC/f+99/wa/fxXtvn/zag8Q6Of3l68+vL7ovf/w6Z1B
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

-->

</rfc>
