<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-serialization-07" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title abbrev="CBOR Serialization">CBOR Serialization and Determinism</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-serialization-07"/>
    <author initials="L." surname="Lundblade" fullname="Laurence Lundblade">
      <organization>Security Theory LLC</organization>
      <address>
        <email>lgl@securitytheory.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="03"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <keyword>cbor</keyword>
    <abstract>
      <?line 113?>

<t>This document defines two CBOR serializations: "preferred-plus serialization" and "deterministic serialization."
It also introduces the term "general serialization" to name the complete set of all serializations defined in RFC 8949.
Together, these three form a set of serializations that cover the majority of CBOR serialization use cases.</t>
      <t>These serializations are largely compatible with those widely implemented by the CBOR community.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-cbor-serialization/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        CBOR Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cbor-wg/draft-ietf-cbor-serialization"/>.</t>
    </note>
  </front>
  <middle>
    <?line 122?>

<section anchor="Introduction">
      <name>Introduction</name>
      <t>Background material on serialization and determinism concepts is provided in <xref target="models"/>.
Readers may wish to review this background information first.</t>
      <t>CBOR intentionally allows multiple valid serializations of the same data item.
For example, the array [1, 2] can be serialized in more than one way:</t>
      <table anchor="tab-array-ser">
        <name>[1, 2] definite-length and indefinite-length serializations</name>
        <thead>
          <tr>
            <th align="left">Type</th>
            <th align="left">Description</th>
            <th align="left">Bytes</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Definite-length</td>
            <td align="left">The array length (2) is encoded at the beginning</td>
            <td align="left">0x82 0x01 0x02</td>
          </tr>
          <tr>
            <td align="left">Indefinite-length</td>
            <td align="left">The array is terminated by the break byte (0xff)</td>
            <td align="left">0x9f  0x01 0x02 0xff</td>
          </tr>
        </tbody>
      </table>
      <t>Similar variation exists for most other CBOR data types.</t>
      <t>This variability is deliberate.
CBOR is designed to allow encodings to be selected according to the constraints and requirements of a particular environment.
The flexibility is a core design feature.
(CBOR is not unique in this regard; compare ASN.1's BER encoding rules).</t>
      <t>For example, indefinite-length serialization is suited for streaming large arrays in constrained environments, where the total length is not known in advance.
Conversely, definite-length serialization makes it easier to decode small arrays in constrained environments.</t>
      <t>As a result, CBOR libraries and protocol implementations commonly support only the serialization forms required for their intended use cases.
This behavior is expected and aligns with CBOR’s design goals.</t>
      <t>However, this flexibility introduces two challenges: interoperability and determinism.</t>
      <section anchor="interoperability">
        <name>Interoperability</name>
        <t>The interoperability challenge arises because partial implementations are both permitted and expected.
For example, an encoder may produce an indefinite-length array that is sent to a decoder that supports only definite-length arrays.
Both this encoder and decoder are allowed by <xref target="STD94"/>.</t>
        <t>Decoders in particular often support only a subset of serialization forms — whether because they operate in constrained environments,
or because a full general-purpose decoder is substantially more work to implement, especially in languages like C and Rust that lack built-in dynamic arrays, maps, and strings.</t>
        <t>In practice, most CBOR usage occurs outside highly constrained environments.
This makes it both feasible and beneficial to define a common serialization suitable for general use.</t>
        <t>Protocol specifications can reference this serialization; library implementations can prioritize support for it.</t>
        <t>This document defines that serialization: preferred-plus serialization.</t>
      </section>
      <section anchor="determinism">
        <name>Determinism</name>
        <t>The determinism challenge arises because there are multiple ways to serialize the same data item.
The example serialization of the array [1,2] above shows this.
This is a problem in some protocols that hash or sign encoded CBOR.</t>
        <t>Many approaches to deterministic serialization are possible, each optimized for different environmental constraints or application requirements.
However, as noted earlier, the majority of CBOR usage occurs outside constrained environments.
It is therefore practical to define a single deterministic serialization suitable for general use.</t>
        <t>Protocol specifications can reference this serialization instead of defining their own deterministic encoding rules; library implementations can prioritize support for it.</t>
        <t>This document defines that serialization: deterministic serialization.</t>
      </section>
      <section anchor="relation-to-rfc-8949">
        <name>Relation to RFC 8949</name>
        <t>This document defines new serializations rather than updating those in <xref target="STD94"/>.
This approach enables the serialization requirements to be expressed directly in normative <xref target="RFC2119"/> language and to be defined entirely in this document.
This approach provides clarity and simplicity for implementers and the CBOR community over the long term.</t>
        <t>The serializations defined herein are formally new but largely interchangeable with the way the serializations described in <xref target="STD94"/> are implemented.</t>
        <t>For example, preferred serialization (<xref section="4.1" sectionFormat="of" target="STD94"/>) is commonly implemented without support for indefinite lengths.
Preferred-plus serialization is effectively the same as preferred serialization without indefinite lengths, so it is largely interchangeable with what is commonly implemented.</t>
      </section>
    </section>
    <section anchor="Recommendations">
      <name>Recommendations Summary</name>
      <section anchor="protocol-specifications">
        <name>Protocol Specifications</name>
        <section anchor="FrameworkProtocols">
          <name>Framework Protocols</name>
          <t>Framework protocols are those that offer a set of options and alternatives, with interoperability depending on the sender and receiver making compatible choices.
These protocols sometimes make use of profiles to define interoperability requirements for specific uses.
Framework protocols are sometimes described as toolbox or building-block protocols, reflecting their role as collections of reusable mechanisms rather than end-to-end protocols.
CWT, COSE, EAT, and CBOR itself are examples of framework protocols.</t>
          <t>It is RECOMMENDED that CBOR-based framework protocols not state serialization requirements, enabling individual uses and profiles to choose serialization to suit their environments and constraints.</t>
          <t>CBOR-based framework protocols MAY impose serialization requirements.
For example, if a protocol is never expected to be deployed in constrained environments where map sorting is too expensive, it may mandate deterministic serialization for all implementations in order to eliminate all serialization variability.</t>
          <t>There is one situation in which a framework protocol MUST require deterministic serialization, though typically limited to a specific subset of the protocol.
This requirement arises when the protocol design requires the involved parties to independently construct and serialize data to be hashed or signed, rather than transmitting the exact serialized bytes that were hashed or signed.
See <xref target="WhenDeterministic"/>.</t>
          <t>See <xref target="COSESerialization"/> for a COSE-based example.</t>
        </section>
        <section anchor="EndToEndProtocols">
          <name>End-to-End Protocols</name>
          <t>End-to-end protocols are specified such that interoperability is assured when they are implemented in accordance with their specification.
When such a protocol includes optional features, they are typically selected through real-time negotiation.
Such protocols often have formal interoperability compliance programs or organize interoperability testing events (for example, "bake-offs").
TLS, HTTP, and FIDO are examples of end-to-end protocols.</t>
          <t>End-to-end protocols MUST define a serialization strategy that ensures the sender and receiver use interoperable serialization.</t>
          <t>The strategy most highly RECOMMENDED is to normatively require preferred-plus serialization.
If a protocol does not need to be deployed where map sorting is too expensive, requiring deterministic serialization is also RECOMMENDED.</t>
          <t>An end-to-end protocol MAY instead define its own specialized serialization (see <xref target="SpecialSerializations"/>).
In such cases, it MUST explicitly specify the permitted serialization behaviors necessary to ensure interoperability.
For example, if a sender is permitted to use indefinite-length serialization, the protocol MUST require that receivers be capable of decoding indefinite-length items.</t>
          <t>As with framework protocols, deterministic serialization may be required for parts of the protocol using hashing or signing.
See <xref target="WhenDeterministic"/>.</t>
          <t>If no specific serialization is required, general serialization (see <xref target="GeneralSerialization"/>) applies by default.
In this case, the sender MAY use any valid serialization, and the receiver MUST be able to decode it.
Defaulting to general serialization is NOT RECOMMENDED, because some serializations like indefinite-lengths are not widely supported.</t>
        </section>
      </section>
      <section anchor="libraries">
        <name>Libraries</name>
        <section anchor="cbor-libraries">
          <name>CBOR Libraries</name>
          <t>It is RECOMMENDED that CBOR libraries support preferred-plus serialization.
This can be achieved by conforming to the decoding requirements in <xref target="PreferredPlusDecoding"/> and by making the encoding behavior defined in <xref target="PreferredPlusEncoding"/> the default or primary encoding API.</t>
          <t>Preferred-plus serialization is recommended because it is suitable for the majority of CBOR-based protocols.
In practice, preferred-plus serialization is equivalent to preferred serialization <xref section="4.1" sectionFormat="of" target="STD94"/> for most use cases.</t>
          <t>It is also RECOMMENDED that CBOR libraries support deterministic serialization, as some protocols (for example, COSE) require it.
Relative to preferred-plus serialization, the only additional requirement for deterministic serialization is that encoded maps be sorted.
This recommendation is particularly strong for environments in which map sorting is easy to implement (for example, Python, Go, and Ruby).</t>
          <t>A CBOR library may choose to implement only deterministic serialization and make it the default.
Deterministic serialization is a superset of preferred-plus serialization; therefore, if deterministic serialization is fully supported, explicit support for preferred-plus serialization may be omitted.</t>
          <t>A CBOR library MAY also choose to support some or all aspects of general serialization (see <xref target="GeneralSerialization"/>) thereby enabling support for protocols that use specialized serializations (see <xref target="SpecialSerializations"/>).</t>
        </section>
        <section anchor="libraries-for-framework-protocols">
          <name>Libraries for Framework Protocols</name>
          <t>When a framework protocol specification does not mandate a specific serialization, it is RECOMMENDED that it implement preferred-plus serialization.
For example, it is recommended that a library implementing CWT or COSE implement preferred-plus serialization.</t>
          <t>However, a library MAY choose to support only deterministic serialization if this aligns with its deployment environment and design goals.</t>
          <t>When a framework protocol mandates serialization requirements, libraries must of cource conform.
For instance, certain parts of COSE mandate deterministic serialization.
See <xref target="COSESerialization"/> for a COSE-based example.</t>
        </section>
        <section anchor="libraries-for-end-to-end-protocols">
          <name>Libraries for End-to-End Protocols</name>
          <t>End-to-end protocols should have explicit serialization requirements to ensure interoperability.
Libraries for end-to-end protocols should fullfill them.</t>
          <t>If an end-to-end protocol specification does not state serialization requirements, the library is free to choose, but it is RECOMMENDED that they implement preferred-plus serialization.</t>
        </section>
      </section>
    </section>
    <section anchor="GeneralSerialization">
      <name>General Serialization</name>
      <t>This section assigns the name "general serialization" to the complete set of all encodings standardized in <xref section="3" sectionFormat="of" target="STD94"/>.
The term itself was not explicitly defined in <xref target="STD94"/>.
Preferred-plus and deterministic serialization are subsets of it.</t>
      <t>General serialization permits any and all of these:</t>
      <ul spacing="normal">
        <li>
          <t>CBOR arguments of any length (for example, the integer 0 may be encoded as 0x00, 0x1800, or 0x190000 and so on).</t>
        </li>
        <li>
          <t>Floating-point values encoded at any length (for example, 0.00 can be 0xf900, 0xfa000000000, and so on).</t>
        </li>
        <li>
          <t>Both definite or indefinite-length strings, arrays, and maps.</t>
        </li>
        <li>
          <t>Big number representation of values that are also representable using major types 0 and 1 (for example, 0 can be encoded as the big number 0xc34100).</t>
        </li>
      </ul>
      <t>A decoder claiming to support general serialization MUST accept and decode all the encodings for the data types it supports.</t>
      <section anchor="general-serialization-is-the-default">
        <name>General Serialization is the Default</name>
        <t>When a CBOR-based protocol specification does not explicitly specify serialization, general serialization is the implied requirement —
meaning a compliant decoder must accept and decode any and all encodings it permits, including both definite and indefinite lengths.</t>
        <t>CBOR Web Token <xref target="RFC8392"/>, for example, does not specify serialization, so a fully compliant CWT decoder must handle general serialization, including indefinite-length strings, arrays, and maps.
In practice, however, many CWT decoders cannot process the full range of general serialization — indefinite lengths in particular.
Encoders have adapted accordingly, typically restricting their output to the subset of serializations that decoders can reliably handle, most notably by avoiding indefinite lengths altogether.
The same pattern holds for other protocols, such as COSE <xref target="RFC9052"/>.</t>
      </section>
      <section anchor="WhenGeneral">
        <name>When To Use General Serialization</name>
        <t>Preferred-plus serialization (<xref target="PreferredPlusSerialization"/>) is efficient and supports the full CBOR data model (except NaN payloads), satisfying the vast majority of CBOR use cases.
Full general serialization is rarely necessary, and support for it is not widespread.</t>
        <t>The main scenario where general serialization is warranted is a protocol that must accommodate highly constrained encoders,
at the cost of requiring decoders — assumed to be unconstrained — to support every possible serialization option.</t>
        <t>When general serialization is required by a protocol, this SHOULD be stated explicitly.
Although it is the default for CBOR in theory, it has not been widely implemented as such in practice.</t>
        <t>See also special serialization (<xref target="SpecialSerializations"/>), which enables special optimization and efficiency for specific use cases without requiring full general serialization support in the decoder.</t>
        <t>CBOR libraries may nonetheless wish to support general serialization, as a complete set of other serialization forms, to be useful across a broader range of protocols.</t>
      </section>
    </section>
    <section anchor="PreferredPlusSerialization">
      <name>Preferred-Plus Serialization</name>
      <t>This section defines a serialization named "preferred-plus serialization."</t>
      <section anchor="PreferredPlusEncoding">
        <name>Encoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>The shortest-form of the CBOR argument must be used for all major types.
The shortest-form encoding for any argument that is not a floating  point value is:  </t>
            <ul spacing="normal">
              <li>
                <t>0 to 23 and -1 to -24 MUST be encoded in the same byte as the major type.</t>
              </li>
              <li>
                <t>24 to 255 and -25 to -256 MUST be encoded only with an additional byte (ai = 0x18).</t>
              </li>
              <li>
                <t>256 to 65535 and -257 to -65536 MUST be encoded only with an additional two bytes (ai = 0x19).</t>
              </li>
              <li>
                <t>65536 to 4294967295 and -65537 to -4294967296 MUST be encoded only with an additional four bytes (ai = 0x1a).</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If maps or arrays are encoded, they MUST use definite-length encoding (never indefinite-length).</t>
          </li>
          <li>
            <t>If text or byte strings are encoded, they MUST use definite-length encoding (never indefinite-length).</t>
          </li>
          <li>
            <t>If floating-point numbers are encoded, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>Half-precision MUST be supported</t>
              </li>
              <li>
                <t>Values MUST be encoded in the shortest of double, single or half-precision that preserves precision.
For example, 0.0 can always be reduced to half-precision so it MUST be encoded as 0xf90000
For another example, 0.1 would loose precision if not encoded as double-precision so it MUST be encoded as 0xfb3fb999999999999a.
Subnormal numbers MUST be supported in this shortest-length encoding.</t>
              </li>
              <li>
                <t>The only NaN that may be encoded is a half-precision quiet NaN (the sign bit and all but the highest payload bit is clear), specifically 0xf97e00.</t>
              </li>
              <li>
                <t>Aside from the the requirement allowing only the half-precision quiet NaN, these are the same floating-point requirements as <xref section="4.1" sectionFormat="of" target="STD94"/> and also as <xref section="4.2.1" sectionFormat="of" target="STD94"/>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If big numbers (tags 2 and 3) are encoded, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>Leadings zeros MUST NOT be encoded.</t>
              </li>
              <li>
                <t>If a value can be encoded using major type 0 or 1, then it MUST be encoded with major type 0 or 1, never as a big number.</t>
              </li>
            </ul>
          </li>
        </ol>
      </section>
      <section anchor="PreferredPlusDecoding">
        <name>Decoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Decoders MUST accept shortest-form encoded arguments.</t>
          </li>
          <li>
            <t>If arrays or maps are supported, definite-length arrays or maps MUST be accepted.</t>
          </li>
          <li>
            <t>If text or byte strings are supported, definite-length text or byte strings MUST be accepted.</t>
          </li>
          <li>
            <t>If floating-point numbers are supported, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>Half-precision values MUST be accepted.</t>
              </li>
              <li>
                <t>Double- and single-precision values SHOULD be accepted; leaving these out is only foreseen for decoders that need to work in exceptionally constrained environments.</t>
              </li>
              <li>
                <t>If double-precision values are accepted, single-precision values MUST be accepted.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If big numbers (tags 2 and 3) are accepted, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>Big numbers described in <xref section="3.4.3" sectionFormat="of" target="STD94"/> MUST be accepted.</t>
              </li>
              <li>
                <t>Leading zeros MUST be ignored.</t>
              </li>
              <li>
                <t>An empty byte string MUST be accepted and treated as the value zero.</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>See also <xref target="BigNumbersDataModel"/> and <xref target="BigNumberStrategies"/> for further background on big numbers.</t>
      </section>
      <section anchor="when-to-use-preferred-plus-serialization">
        <name>When to use preferred-plus serialization</name>
        <t>Preferred-plus is the recommended default.
It supports all CBOR data types and value ranges (except non-trivial NaNs), typically produces the most compact encoding, is straightforward to implement, and is widely supported by CBOR libraries.
It provides strong interoperability because (1) decoders are required to accept all encodings that a preferred-plus encoder is permitted to produce, and (2) the requirements are formally specified.</t>
        <t>Choose a different serialization only when you have a specific need: deterministic serialization when determinism is required, a special serialization with indefinite lengths when streaming is required,
or another special serialization for capabilities beyond what preferred-plus provides (see <xref target="SpecialSerializations"/>).
Note that preferred-plus is deterministic when maps are not in use.</t>
      </section>
      <section anchor="RelationToPreferred">
        <name>Relation To Preferred Serialization</name>
        <t>Preferred-plus serialization is defined to be the long-term replacement for preferred serialization.</t>
        <t>The differences are:</t>
        <ul spacing="normal">
          <li>
            <t>Definite lengths are a requirement, not a preference.</t>
          </li>
          <li>
            <t>The only NaN allowed is the half-precision quiet NaN.</t>
          </li>
          <li>
            <t>For big numbers, leading zeros must be ignored and the empty string must be accepted as zero.</t>
          </li>
        </ul>
        <t>These differences are not of significance in real-world implementations, so preferred-plus serialization is already largely supported.</t>
        <t><xref section="3" sectionFormat="of" target="STD94"/> states that in preferred serialization the use of definite-length encoding is a "preference", not a requirement.
Technically that means preferred seriaization decoders must support indefinite legnths, but in reality many do not.
Indefinite lengths, particularly for strings, are often not supported because they are more complex to implement than other parts of CBOR.
Because of this, the implementation of most CBOR protocols use only definite lengths.</t>
        <t>Further, much of the CBOR community didn't notice the use of the word "preference" and realize its implications for decoder implementations.
It was somewhat assumed that preferred serialization didn't allow indefinite lengths.
That preferred serialization decoders are technically required to support indefinite lengths wasn't noticed by many implementers until several years after the publication of <xref target="STD94"/>.</t>
        <t>Briefly stated, the reason that the divergence on NaNs is not of consequence in the real world, is that their non-trivial forms are used extremely rarely and support for them in programming environments and CBOR libraries is unreliable.
See <xref target="NaNCompatibility"/> for a detailed discussion.</t>
        <t>Thus preferred-plus serialization is largely interchangable with preferred serialization in the real world.</t>
      </section>
    </section>
    <section anchor="DeterministicSerialization">
      <name>Deterministic Serialization</name>
      <t>This section defines a serialization named "deterministic serialization"</t>
      <t>Deterministic serialization is the same as described in <xref section="4.2.1" sectionFormat="of" target="STD94"/> except for the encoding of floating-point NaNs.
See <xref target="PreferredPlusSerialization"/> and <xref target="NaN"/> for details on, and the rationale for NaN encoding.</t>
      <t>Note that in deterministic serialization, any big number that can be represented as an integer must be encoded as an integer.
This rule is inherited from preferred-plus serialization (<xref target="PreferredPlusSerialization"/>), just as <xref section="4.2.1" sectionFormat="of" target="STD94"/> inherits this requirement from preferred serialization.</t>
      <t>See also <xref target="DeterministicConsiderations"/> for considerations involved in designing a deterministic protocol that extend beyond serialization.</t>
      <section anchor="DeterministicEncoding">
        <name>Encoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>All of preferred-plus serialization defined in <xref target="PreferredPlusEncoding"/> MUST be used.</t>
          </li>
          <li>
            <t>If a map is encoded, the items in it MUST be sorted in the bytewise lexicographic order of their deterministic encodings of the map keys.
(Note that this is the same as the sorting in <xref section="4.2.1" sectionFormat="of" target="STD94"/> and not the same as <xref section="3.9" sectionFormat="of" target="RFC7049"/> / <xref section="4.2.3" sectionFormat="of" target="STD94"/>.</t>
          </li>
        </ol>
      </section>
      <section anchor="DeterministicDecoding">
        <name>Decoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Decoders MUST meet the decoder requirements described in <xref target="PreferredPlusDecoding"/>.
That is, deterministic encoding imposes no requirements over and above the requirements for decoding preferred-plus serialization.</t>
          </li>
        </ol>
      </section>
      <section anchor="WhenDeterministic">
        <name>When to use Deterministic Serialization</name>
        <section anchor="not-commonly-needed-for-hashing-and-signing">
          <name>Not Commonly Needed for Hashing and Signing</name>
          <t>Most applications do not require deterministic encoding — even those that employ signing or hashing to authenticate or protect the integrity of data.
For example, the payload of a COSE_Sign message (See <xref target="RFC9052"/>) does not need to be encoded deterministically because it is transmitted with the message.
The recipient receives the exact same bytes that were signed.</t>
          <t>Deterministic encoding becomes necessary only when the protected data is not transmitted as the exact bytes that are used for authenticity or integrity verification.
In such cases, both the sender and the receiver must independently construct the exact same sequence of bytes.
To guarantee this, the encoding must eliminate all variability and ambiguity.
The Sig_structure, defined in <xref section="4.4" sectionFormat="of" target="RFC9052"/>, is an example of this requirement.
Such designs are often chosen to reduce data size, preserve privacy, or meet other design constraints.</t>
          <t>See the more detailed, COSE-based example in <xref target="COSESerialization"/>.</t>
        </section>
        <section anchor="decoding-deterministic-serialization-and-relation-to-preferred-plus-serialization">
          <name>Decoding Deterministic Serialization and Relation to Preferred-Plus Serialization</name>
          <t>The only difference between preferred-plus and deterministic serialization is that in deterministic serialization, maps are required to be sorted by their keys.
Preferred-plus serialization exists as a separate mode solely because map sorting can be too expensive in some constrained environments.</t>
          <t>Map decoding must never depend on the sort order of a map, even when maps are required to be sorted.
As a result, deterministic serialization (<xref target="DeterministicSerialization"/>) can always be decoded by a decoder that supports preferred-plus serialization (<xref target="PreferredPlusSerialization"/>).
Because of this property, deterministic serialization can always be used in place of preferred-plus serialization.
In environments where map sorting is not costly, it is both acceptable and beneficial to always use deterministic serialization.
In such environments, a CBOR encoder may produce deterministic encoding by default and may even omit support for preferred-plus encoding entirely.</t>
          <t>However, note that deterministic serialization is never a substitute for general serialization where uses cases may require indefinite lengths, separate big numbers from integers in the data model, or need non-trivial NaNs.</t>
        </section>
        <section anchor="no-map-ordering-semantics">
          <name>No Map Ordering Semantics</name>
          <t>In the basic generic data model, maps are unordered (See <xref section="5.6" sectionFormat="of" target="STD94"/>).
Applications MUST NOT rely on any particular map ordering, even if deterministic serialization was used.
A CBOR library is not required to preserve the order of keys when decoding a map, and the underlying programming language may not preserve map order either — for example, the Go programming language provides no ordering guarantees for maps.
The sole purpose of map sorting in deterministic serialization is to ensure reproducibility of the encoded byte stream, not to provide any semantic ordering of map entries.
If an application requires a map to be ordered, it is responsible for applying its own sorting.</t>
        </section>
      </section>
    </section>
    <section anchor="SpecialSerializations">
      <name>Special Serializations</name>
      <t>When needed, protocols may define special serializations beyond the three described above.
The main capabilities they enable are:</t>
      <ul spacing="normal">
        <li>
          <t>Streaming encoding of strings, arrays, and maps using indefinite lengths, for use when the encoded item(s) exceeds the memory available on the encoding device.</t>
        </li>
        <li>
          <t>Fixed-size integer encoding, allowing values to be copied directly to and from hardware registers.
CBOR is simple enough that encoders and decoders for some protocols can be implemented entirely in hardware.</t>
        </li>
        <li>
          <t>Fixed-width floating-point encoding, relieving the encoder from performing floating-point reduction to the shortest representable form.</t>
        </li>
        <li>
          <t>In-place length updates for strings, arrays, and maps, by encoding their lengths in a fixed number of bits.
For example, if a string length is always encoded in 32 bits, increasing its length from 2^16 to 2^16+1 requires only overwriting the length field rather than shifting all 2^16 bytes of content.</t>
        </li>
        <li>
          <t>Transmission of non-trivial NaN floating-point values (see <xref target="NaN"/>).</t>
        </li>
        <li>
          <t>Deterministic serialization with any or all of the above.</t>
        </li>
      </ul>
      <t>All of these except determinism are also available with general serialization, but a targeted special serialization will usually be substantially easier to implement.</t>
      <t>A recommended approach is to define a special serialization as preferred-plus or deterministic serialization with additional constraints or extensions.
For example, a protocol requiring deterministic streaming of maps and arrays could be specified as:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>Deterministic serialization MUST be used, except that maps and arrays MUST be encoded with indefinite lengths.
Strings retain definite-length encoding, and map ordering MUST follow the rules of deterministic serialization.</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="TagDataModelRule">
      <name>New Tag Data Model Rule</name>
      <t><cref anchor="to-be-removed4">This section is new in draft-03. The author thinks it may be out of place in this document, but there's no other good place for it yet.</cref></t>
      <t><xref section="2" sectionFormat="of" target="STD94"/> states that each new CBOR tag definition introduces a new and distinct data type.
In contrast, the definitions of Tags 2 and 3 (bignums) in <xref section="3.4.3" sectionFormat="of" target="STD94"/> do not introduce a separate data type; instead, they attach directly to the integer type and extend its numeric range.
As a result, the generic data model’s integer type is modified rather than augmented with a new, independent type (see <xref target="BigNumbersDataModel"/>).</t>
      <t>This document establishes a new rule that prohibits future tag definitions from having such effects:</t>
      <t>All future CBOR tag definitions MUST NOT incorporate, modify, or otherwise affect any data types other than the type defined by the tag itself.
A set of tags MAY affect each other, provided that all defining authorities for those tags explicitly agree.</t>
      <t>Tags 2 and 3 are exempt from this rule, as they were defined prior to the establishment of this requirement.</t>
    </section>
    <section anchor="CDDL-Operators">
      <name>CDDL Serialization Control Operator</name>
      <t>The ".serial" control operator specifies the serialization of any type in CDDL, including the serialization of the whole document or byte-string-wrapped sub-parts.</t>
      <t>The controller (the right-hand side) MUST be either "prefp" or "dtrm", specifying preferred-plus (<xref target="PreferredPlusSerialization"/>) or deterministic (<xref target="DeterministicSerialization"/>) serialization, respectively.</t>
      <t>The scope of .serial applies recursively through nested arrays and maps, but does not extend into byte strings or other data items that happen to contain encoded CBOR.
Every instance of embedded CBOR that requires specific serialization must specify it explicitly.
See also <xref target="ByteStringWrapping"/>.</t>
      <t>For example, the following specifies that a message or protocol described by "stuff" is deterministically serialized and wrapped in a byte string:</t>
      <artwork><![CDATA[
stuff = ...
deterministic-stuff = stuff .serial dtrm
wrapped-deterministic-stuff = #6.24(bytes .cbor deterministic-stuff)
]]></artwork>
      <t>For another example, the first lines of a CDDL document as follows specify that "my-protocol" be serialized with preferred-plus.</t>
      <artwork><![CDATA[
my-prefp-protocol = my-protocol .serial prefp
my-protocol = ...
]]></artwork>
      <t>New controller values for new serializations are possible but are highly discouraged.
Standards action is required to add them.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations in <xref section="10" sectionFormat="of" target="STD94"/> apply.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t><cref anchor="to-be-removed">RFC Editor: please replace RFCXXXX with the RFC
number of this RFC and remove this note.</cref></t>
      <t>This document requests IANA to register the ".serial" control operator into the registry "<xref section="CDDL Control Operators" relative="#cddl-control-operators" sectionFormat="bare" target="IANA.cddl"/>" of the <xref target="IANA.cddl"/> registry group.</t>
      <t>IANA is requested to add a reference to <xref target="TagDataModelRule"/> to the CBOR tag registry <xref target="IANA.cbor-tags"/>.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="STD94">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </reference>
        <reference anchor="IANA.cddl" target="https://www.iana.org/assignments/cddl">
          <front>
            <title>Concise Data Definition Language (CDDL)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.cbor-tags" target="https://www.iana.org/assignments/cbor-tags">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8392">
          <front>
            <title>CBOR Web Token (CWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="May" year="2018"/>
            <abstract>
              <t>CBOR Web Token (CWT) is a compact means of representing claims to be transferred between two parties. The claims in a CWT are encoded in the Concise Binary Object Representation (CBOR), and CBOR Object Signing and Encryption (COSE) is used for added application-layer security protection. A claim is a piece of information asserted about a subject and is represented as a name/value pair consisting of a claim name and a claim value. CWT is derived from JSON Web Token (JWT) but uses CBOR rather than JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8392"/>
          <seriesInfo name="DOI" value="10.17487/RFC8392"/>
        </reference>
        <reference anchor="RFC9413">
          <front>
            <title>Maintaining Robust Protocols</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="June" year="2023"/>
            <abstract>
              <t>The main goal of the networking standards process is to enable the long-term interoperability of protocols. This document describes active protocol maintenance, a means to accomplish that goal. By evolving specifications and implementations, it is possible to reduce ambiguity over time and create a healthy ecosystem.</t>
              <t>The robustness principle, often phrased as "be conservative in what you send, and liberal in what you accept", has long guided the design and implementation of Internet protocols. However, it has been interpreted in a variety of ways. While some interpretations help ensure the health of the Internet, others can negatively affect interoperability over time. When a protocol is actively maintained, protocol designers and implementers can avoid these pitfalls.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9413"/>
          <seriesInfo name="DOI" value="10.17487/RFC9413"/>
        </reference>
        <reference anchor="RFC9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
              <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="96"/>
          <seriesInfo name="RFC" value="9052"/>
          <seriesInfo name="DOI" value="10.17487/RFC9052"/>
        </reference>
        <reference anchor="RFC7049">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="October" year="2013"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="Examples-Repo" target="https://github.com/cbor-wg/draft-ietf-cbor-serialization/tree/main/examples">
          <front>
            <title>draft-ietf-cbor-serialization</title>
            <author>
              <organization>IETF CBOR WG</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="CTAP2" target="https://fidoalliance.org/specs/fido-v2.0-ps-20190130/fido-client-to-authenticator-protocol-v2.0-ps-20190130.html">
          <front>
            <title>Client To Authenticator Protocol v2</title>
            <author>
              <organization>W3C</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="NaNBoxing" target="https://craftinginterpreters.com/optimization.html#nan-boxing">
          <front>
            <title>Crafting Interpreters</title>
            <author fullname="Robert Nystrom">
              <organization/>
            </author>
            <date year="2021" month="July"/>
          </front>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>dCBOR: Deterministic CBOR</title>
            <author fullname="Wolf McNally" initials="W." surname="McNally">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Christopher Allen" initials="C." surname="Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Laurence Lundblade" initials="L." surname="Lundblade">
              <organization>Security Theory LLC</organization>
            </author>
            <date day="11" month="February" year="2026"/>
            <abstract>
              <t>   The purpose of determinism is to ensure that semantically equivalent
   data items are encoded into identical byte streams.  CBOR (RFC 8949)
   defines "Deterministically Encoded CBOR" in its Section 4.2, but
   leaves some important choices up to the application developer.  The
   present document specifies dCBOR, a set of narrowing rules for CBOR
   that can be used to help achieve interoperable deterministic encoding
   for a variety of applications desiring a narrow and clearly defined
   set of choices.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-17"/>
        </reference>
        <reference anchor="UML" target="https://www.omg.org/spec/UML/2.5.1/PDF">
          <front>
            <title>OMG Unified Modeling Language (OMG UML) Version 2.5.1</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="December"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 577?>

<section anchor="models">
      <name>Information Model, Data Model and Serialization</name>
      <t>To understand CBOR serialization and determinism, it's helpful to distinguish between the general concepts of an information model, a data model, and serialization.
These are broad concepts that can be applied to other serialization schemes like JSON and ASN.1</t>
      <table anchor="tab-models">
        <name>Information Model, Data Model and Serialization</name>
        <thead>
          <tr>
            <th align="left"> </th>
            <th align="left">Information Model</th>
            <th align="left">Data Model</th>
            <th align="left">Serialization</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Abstraction Level</td>
            <td align="left">Top level; conceptual</td>
            <td align="left">Realization of information in data structures and data types</td>
            <td align="left">Actual bytes encoded for transmission</td>
          </tr>
          <tr>
            <td align="left">Example</td>
            <td align="left">The temperature of something</td>
            <td align="left">A floating-point number representing the temperature</td>
            <td align="left">Encoded CBOR of a floating-point number</td>
          </tr>
          <tr>
            <td align="left">Standards</td>
            <td align="left">
              <xref target="UML"/></td>
            <td align="left">CDDL</td>
            <td align="left">CBOR</td>
          </tr>
          <tr>
            <td align="left">Implementation Representation</td>
            <td align="left">n/a</td>
            <td align="left">API Input to CBOR encoder library, output from CBOR decoder library</td>
            <td align="left">Encoded CBOR in memory or for transmission</td>
          </tr>
        </tbody>
      </table>
      <t>CBOR doesn't provide facilities for information models.
They are mentioned here for completeness and to provide some context.</t>
      <t>CBOR defines a palette of basic types that are the usual integers, floating-point numbers, strings, arrays, maps and other.
Extended types may be constructed from these basic types.
These basic and extended types are used to construct the data model of a CBOR protocol.
While not required, <xref target="RFC8610"/> may be used to describe the data model of a protocol.
The types in the data model are serialized per <xref target="STD94"/> to create encoded CBOR.</t>
      <t>CBOR allows certain data types to be serialized in multiple ways to facilitate easier implementation in constrained environments.
For example, indefinite-length encoding enables strings, arrays, and maps to be streamed without knowing their length upfront.</t>
      <t>Crucially, CBOR allows — and even expects — that some implementations will not support all serialization variants.
In contrast, JSON permits variations (e.g., representing 1 as 1, 1.0, or 0.1e1), but expects all parsers to handle them.
That is, the variation in JSON is for human readability, not to facilitate easier implementation in constrained environments.</t>
    </section>
    <section anchor="DeterministicConsiderations">
      <name>General Protocol Considerations for Determinism</name>
      <t>In addition to <xref target="DeterministicSerialization"/>, there are considerations in the design of any deterministic protocol.</t>
      <t>For a protocol to be deterministic, both the encoding (serialization) and data model (application) layer must be deterministic.
While deterministic serialization, <xref target="DeterministicSerialization"/>, ensures determinism at the encoding layer, requirements at the application layer may also be necessary.</t>
      <t>Here’s an example application layer specification:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>At the sender’s convenience, the birth date MAY be sent either as an integer epoch date or string date. The receiver MUST decode both formats.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>While this specification is interoperable, it lacks determinism.
There is variability in the data model layer akin to variability in the CBOR encoding layer when deterministic serialization is not required.</t>
      <t>To make this example application layer specification deterministic, specify one date format and prohibit the other.</t>
      <t>A more interesting source of application layer variability comes from CBOR’s variety of number types. For instance, the number 2 can be represented as an integer, float, big number, decimal fraction and other.
Most protocols designs will just specify one number type to use, and that will give determinism, but here’s an example specification that doesn’t:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>At the sender’s convenience, the fluid level measurement MAY be encoded as an integer or a floating-point number. This allows for minimal encoding size while supporting a large range. The receiver MUST be able to accept both integers and floating-point numbers for the measurement.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>Again, this ensures interoperability but not determinism — identical fluid level measurements can be represented in more than one way.
Determinism can be achieved by allowing only floating-point, though that doesn’t minimize encoding size.</t>
      <t>A better solution requires the fluid level always be encoded using the smallest representation for every particular value.
For example, a fluid level of 2 is always encoding as an integer, never as a floating-point number.
2.000001 is always be encoded as a floating-point number so as to not lose precision.
See the numeric reduction defined by <xref target="I-D.mcnally-deterministic-cbor"/>.</t>
      <t>Although this is not strictly a CBOR issue, deterministic CBOR protocol designers should be mindful of variability in Unicode text, as some characters can be encoded in multiple ways.</t>
      <t>While this is not an exhaustive list of application-layer considerations for deterministic CBOR protocols, it highlights the nature of variability in the data model layer and some sources of variability in the CBOR data model (i.e., in the application layer).</t>
    </section>
    <section anchor="NaN">
      <name>IEEE 754 NaN</name>
      <t>This section provides background information on <xref target="IEEE754"/> NaN (Not a Number) and its use in CBOR.</t>
      <section anchor="basics">
        <name>Basics</name>
        <t><xref target="IEEE754"/> defines the most widely used representation for floating-point numbers.
It includes special values for infinity and NaN.
NaN was originally designed to represent the result of invalid computations, such as division by zero.
Although IEEE 754 intended NaN primarily for local computation, NaN values are sometimes transmitted in network protocols, and CBOR supports their representation.</t>
        <t>An IEEE 754 NaN includes a payload of up to 52 bits (depending on precision) whose use is not formally defined.
NaN values also include an unused sign bit.</t>
        <t>IEEE 754 distinguishes between quiet NaNs (qNaNs) and signaling NaNs (sNaNs):</t>
        <ul spacing="normal">
          <li>
            <t>A signaling NaN typically raises a floating-point exception when encountered.</t>
          </li>
          <li>
            <t>A quiet NaN does not raise an exception.</t>
          </li>
          <li>
            <t>The distinction is implementation-specific, but typically:
            </t>
            <ul spacing="normal">
              <li>
                <t>The highest bit of the payload is set --&gt; quiet NaN.</t>
              </li>
              <li>
                <t>Any other payload bit is set --&gt; signaling NaN.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>At least one payload bit must be set for a signaling NaN to distinguish it from infinity.</t>
          </li>
        </ul>
        <t>In this document:</t>
        <ul spacing="normal">
          <li>
            <t>A "non-trivial NaN" refers to any NaN that is not a quiet NaN.</t>
          </li>
          <li>
            <t>A non-trivial NaN is used to carry additional, protocol-specific information within floating-point values.</t>
          </li>
        </ul>
      </section>
      <section anchor="implementation-support-for-non-trivial-nans">
        <name>Implementation Support for Non-Trivial NaNs</name>
        <t>This section discusses the extent of programming language and CPU support for NaN payloads.</t>
        <t>Although <xref target="IEEE754"/> has existed for decades, support for manipulating non-trivial NaNs has historically been limited and inconsistent.
Some key points:</t>
        <ul spacing="normal">
          <li>
            <t>Programming languages:  </t>
            <ul spacing="normal">
              <li>
                <t>The programming languages C, C++, Java, Python and Rust do no provide APIs to set or extract NaN payloads.</t>
              </li>
              <li>
                <t>IEEE 754 is over thirty years old, enough time for support to be added if there was need.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>CPU hardware:  </t>
            <ul spacing="normal">
              <li>
                <t>CPUs use the distinction between signaling and quiet NaNs to determine whether to raise exceptions.</t>
              </li>
              <li>
                <t>A non-trivial NaN matching the CPU’s signaling NaN pattern may either trigger an exception or be converted into a quiet NaN.</t>
              </li>
              <li>
                <t>Instructions converting between single and double precision sometimes discard or alter NaN payloads.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>As a result, applications that rely on non-trivial NaNs generally cannot depend on CPU instructions, floating-point libraries, or programming environments.
Instead, they usually need their own software implementation of IEEE 754 to encode and decode the full bit patterns to reliably process non-trivial NaNs.</t>
      </section>
      <section anchor="use-and-non-use-for-non-trivial-nans">
        <name>Use and Non-use for Non-Trivial NaNs</name>
        <t>Non-trivial NaNs, excluding signaling NaNs, are not produced by standard floating-point operations.
They are typically created at the application level, where software may take advantage of unused bits in the NaN payload.
Such uses are rare and unusual, but they do exist.</t>
        <t>One example is the R programming language, which is designed for statistical computing and therefore operates heavily on numeric data.
R uses NaN payloads to distinguish various error or missing-data conditions beyond standard computational exceptions such as division by zero.</t>
        <t>Another example is NaNboxing (see <xref target="NaNBoxing"/>), a technique used by some language runtimes — such as certain JavaScript engines — to efficiently represent multiple data types within a single 64-bit word by storing type tags or pointers in the NaN payload.
(CBOR can represent such payloads, but NaNboxed pointers are generally not meaningful or portable across machines, and therefore are usually unsuitable for network transmission or file storage.)</t>
        <t>CBOR’s NaN-payload support can be leveraged if data from these systems must be transmitted over a network or written to persistent storage.</t>
        <t>A designer of a new protocol that makes extensive use of floating-point values might be tempted to use NaN payloads to encode out-of-band information such as error conditions.
For example, NaN payloads could be used to distinguish situations such as sensor offline, sensor absent, sensor error, or sensor out of calibration.
While this is technically possible in CBOR, it comes with significant drawbacks:</t>
        <ul spacing="normal">
          <li>
            <t>Preferred-plus and deterministic serialization cannot be used for this protocol.</t>
          </li>
          <li>
            <t>Support for NaN payloads is unreliable across programming environments and CBOR libraries.</t>
          </li>
          <li>
            <t>Values cannot be translated directly to JSON, which does not support NaNs of any kind.</t>
          </li>
        </ul>
      </section>
      <section anchor="clarification-of-rfc-8949">
        <name>Clarification of RFC 8949</name>
        <t>This is a clarifying restatement of how NaNs are to be treated according to <xref target="STD94"/>.</t>
        <t>NaNs represented in floating-point values of different lengths are considered equivalent in the basic generic data model if:</t>
        <ul spacing="normal">
          <li>
            <t>Their sign bits are identical, and</t>
          </li>
          <li>
            <t>Their significands are identical after both significands are zero-extended on the right to 64 bits</t>
          </li>
        </ul>
        <t>This equivalence is established for the entire CBOR basic generic data model.
A NaN encoded as half-, single-, or double-precision is equivalent whenever it satisfies the rules above.
This remains true regardless of how a CBOR library accepts, stores, or presents a NaN in its API.
At the application layer, the equivalence still holds.
The only way to avoid this equivalence is by using a tag specifically designed to carry NaNs without these equivalence rules, since tags extend the data model unless otherwise specified.</t>
        <t>The equivalence is similar to how the floating-point value 1.0 is treated as the same value regardless of the precision used to encode it.
Some floating-point values cannot be represented in shorter formats (e.g., 2.0e+50 cannot be encoded in half-precision).
The same is true for some NaNs.</t>
        <t>In preferred serialization, this equivalence MUST be used to shorten encoding length.
If a NaN can be represented equivalently in a shorter form (e.g., half-precision rather than single-precision), then the shorter representation MUS be used.</t>
        <t>This equivalence also applies when floating-point values are used as map keys.
A map key encoded as half-precision MUST be considered a duplicate of one encoded as double-precision if they meet the equivalence rules above.</t>
        <t>However, this equivalence does not apply to map sorting.
Sorting operates on the fully encoded and serialized representation, not on the abstract data model.</t>
        <t>It is <xref section="2" sectionFormat="of" target="STD94"/> that establishes this equivalence by stating that the number of bytes used to encode a floating-point value is not visible in the data model.
<xref section="4.1" sectionFormat="of" target="STD94"/> defines preferred serialization.
It requires shortest-length encoding of NaNs including instructions on how to do it.
<xref section="5.6.1" sectionFormat="of" target="STD94"/> describes how NaNs are treated as equivalent when used as map keys.
These three parts of <xref target="STD94"/> are consistent and are the basis of this restatement.</t>
        <t>Since <xref section="4.2.1" sectionFormat="of" target="STD94"/>, (Core Deterministic Encoding Requirements), explicitly requires preferred serialization, compliant deterministic encodings must use the shortest equivalent representation of NaNs.</t>
        <t>Finally, <xref section="4.2.2" sectionFormat="of" target="STD94"/> discusses alternative approaches to deterministic encoding.
It suggests, for example, that all NaNs may be encoded as a half-precision quiet NaN.
This section is distinct from the Core Deterministic Encoding Requirements and represents an optional alternative for handling NaNs.</t>
      </section>
      <section anchor="NaNCompatibility">
        <name>Divergence from <xref target="STD94"/></name>
        <t>Non-trivial NaNs are not permitted in either preferred-plus or deterministic serializations.
This is in contrast to preferred serialization and <xref section="4.2.1" sectionFormat="of" target="STD94"/>.</t>
        <t>Note that the prohibition of non-trivial NaNs is the sole difference between deterministic serialization (<xref target="DeterministicSerialization"/>) and <xref section="4.2.1" sectionFormat="of" target="STD94"/>.</t>
        <t>The divergence is justified by the following:</t>
        <ul spacing="normal">
          <li>
            <t>Encoding and equivalence of non-trivial NaNs was a little unclear <xref target="STD94"/>.</t>
          </li>
          <li>
            <t>IEEE 754 doesn't set requirements for their handling.</t>
          </li>
          <li>
            <t>Non-trivial NaNs are not well-supported across CPUs and programming environments.</t>
          </li>
          <li>
            <t>Because preferred serialization of non-trivial NaNs is difficult and error-prone to implement, many CBOR implementations don't encode and/or decode non-trivial NaNs, or don't encode or decode them correctly.</t>
          </li>
          <li>
            <t>Practical use cases for non-trivial NaNs are extremely rare.</t>
          </li>
          <li>
            <t>Reducing non-trivial NaNs to a half-precision quiet NaN is simple and supported by programming environments (e.g., <tt>isnan()</tt> can be used to detect all NaNs).</t>
          </li>
          <li>
            <t>Non-trivial NaNs remain supported by general serialization; the divergence is only for preferred-plus and deterministic serialization.</t>
          </li>
          <li>
            <t>A new CBOR tag can be defined in the future to explicitly support them.</t>
          </li>
        </ul>
      </section>
      <section anchor="recommendations-for-use-of-non-trival-nans">
        <name>Recommendations for Use of Non-Trival NaNs</name>
        <t>While non-trivial NaNs are excluded from preferred-plus and deterministic serialization, they are theoretically supported by <xref target="STD94"/>.
General serialization does support them.</t>
        <t>New protocol designs SHOULD avoid non-trivial NaNs.
Support for them is unreliable, and it is straightforward to design CBOR-based protocols that do not depend on them.
In many cases, the use of NaN can be replaced entirely with null.
JSON requires use of null as it does not support NaNs at all.</t>
        <t>The primary use case for non-trivial NaNs is existing systems that already use them.
For example, a program that relies on non-trivial NaNs internally may need to serialize its data to run across machines connected by a network.</t>
      </section>
    </section>
    <section anchor="code-for-encoding-preferred-plus-floating-point-values">
      <name>Code for Encoding Preferred-Plus Floating-Point Values</name>
      <t>Preferred-plus (<xref target="PreferredPlusEncoding"/>) and deterministic serialization require that floating-point values fitting in single-precision and half-precision be encoded as such.
This C code implements that conversion.
While conversion between single and double is widely supported, conversion to half-precision is not.
<xref section="D" sectionFormat="of" target="STD94"/> provides example code for decoding half-precision values; this appendix provides corresponding code for encoding them.</t>
      <t>Two functions are provided: one to convert from double to single, and another from single to half.
Used together, they cover all possible cases.
If the input is a double, pref_plus_double_to_single() must be called first;
if it succeeds, pref_plus_single_to_half() is then called to complete the conversion from double to half.
If the input is already a single, only pref_plus_single_to_half() need be called.</t>
      <t>(The two functions have identical structure.
Because the constants are difficult to compute and verify, both are provided.)</t>
      <t>Both functions return an integer with the bit pattern for the resulting floating-point value, or -1 if the conversion can't be performed because the input is out of range or precision would be lost.</t>
      <figure anchor="half-encode">
        <name>Example C Code for Preferred-Plus Ploating-Point Encoding</name>
        <sourcecode type="c"><![CDATA[
/* Constants based on IEEE 754; _LEN is in bits */

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

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

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

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

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


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

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


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

  if (exp == DBL_ZERO_SUBNORM_EXP) {
    if (mant == 0) {
      return (long long)sign; /* +/- 0.0 */
    } else {
      return -1; /* double subnormals are out of range for single */
    }
  } else if (exp >= D2S_MIN_SUBNORM_EXP && exp < D2S_MIN_NORM_EXP) {
    if (mant & ((1ULL << (D2S_SUBNORM_SHIFT - exp)) - 1)) {
      return -1; /* bits lost in conversion to single subnormal */
    } else {
      return (long long)(sign + /* converts to single subnormal */
           ((mant + DBL_MANT_ADD_ONE) >> (D2S_SUBNORM_SHIFT - exp)));
     }
  } else if (exp >= D2S_MIN_NORM_EXP && exp <= D2S_MAX_NORM_EXP) {
    if (mant & D2S_LOST_BITS) {
      return -1; /* bits lost in conversion */
    } else {
       return (long long)(sign + /* Converts to normal */
                        ((exp - D2S_BIAS_DIFF_EXP) << SGL_MANT_LEN) +
                         (mant >> (DBL_MANT_LEN - SGL_MANT_LEN)));
    }
  } else if (exp == DBL_NAN_INF_EXP) {
    if (mant == 0) {
      /* +/- infinity */
      return (long long)(sign + SGL_NAN_INF_EXP_BITS); 
    } else if (mant == DBL_QUIET_NAN && sign == 0) {
       return SGL_QUIET_NAN + SGL_NAN_INF_EXP_BITS; /* quiet NaN */
    } else {
       return -1; /* non-trivial NaN */
    }
  } else {
     return -1; /* large exponent -- out of range for single */
  }
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="BigNumbersDataModel">
      <name>Big Numbers and the CBOR Data Model</name>
      <t>The primary purpose of this document is to define preferred-plus and deterministic serialization.
Accordingly, <xref target="PreferredPlusSerialization"/> describes CBOR’s unified integer space in terms of serialization behavior.
This is an effective and clear way to describe what implementors must do.
An implementation that follows the requirements in <xref target="PreferredPlusSerialization"/> will be complete and correct with respect to serialization.</t>
      <t>From a conceptual perspective, however, additional discussion is warranted regarding the CBOR data model itself.
That discussion is provided in this appendix.
(Please review <xref target="models"/> for background on the difference between serialization and the data model).</t>
      <t>In the basic, generic CBOR data model, each tag represents a distinct data type (<xref section="2" sectionFormat="of" target="STD94"/>).
Tags are also distinct from the major types, such as numbers and strings.
By this, an integer value such as 0 or 1 encoded as major type 0 is clearly distinct in the data model from the same integer value encoded as tag 2.</t>
      <t>However, the text in <xref section="3.4.3" sectionFormat="of" target="STD94"/> overrides this by defining these encodings to be equivalent rather than distinct.
This text therefore modifies the CBOR data model.
No other serialization requirement in <xref target="STD94"/> or in this document alters the data model; this equivalence is the sole exception.
This is unusual because the data model is otherwise orthogonal to serialization.</t>
      <t>Further, <xref section="3.4.3" sectionFormat="of" target="STD94"/>  along with text in <xref section="2" sectionFormat="of" target="STD94"/> are interpreted such that there is never a CBOR data model where there is a distinction between these integer representations.
That is, the equivalence applies regardless of the serialization even though much of the relevant text appears in proximity to discussions of serialization.</t>
      <t>This document does not attempt to update or revise the text of <xref section="3.4.3" sectionFormat="of" target="STD94"/>.
Rather, it records the commonly accepted interpretation of that text and its implications for the CBOR data model.</t>
      <t>This document does create a new rule for future tag definitions.
See <xref target="TagDataModelRule"/>.</t>
    </section>
    <section anchor="BigNumberStrategies">
      <name>Big Number Implementation Strategies</name>
      <t><xref target="BigNumbersDataModel"/> describes how CBOR defines a single integer number space, in which big numbers are not distinct from values encoded using major types 0 and 1.
This appendix discusses approaches for implementers to support that model.</t>
      <t>Some programming environments provide strong native support for big numbers (e.g., Python, Ruby, and Go), while others do not (e.g., C, C++, and Rust).
Even in environments that support big numbers, operations on native-sized integers (e.g., 64-bit integers) are typically much more efficient.
It is therefore reasonable for a CBOR library to expose separate APIs for native-sized integers and for big numbers.</t>
      <t>When a CBOR library provides a big number API, values that fall within the range of major types 0 and 1 must be encoded using those major types rather than tags 2 or 3.
Similarly, decoding facilities that return big numbers must accept values encoded using major types 0 and 1, even though the returned representation is a big number.</t>
      <t>Alternatively, some CBOR libraries may choose to return tags 2 and 3 as raw byte strings, as this approach is simpler than implementing full big number support.
When a library adopts this approach, it should clearly document that the application layer is responsible for performing the integer unification.
The application is also responsible for handling CBOR’s offset-by-one encoding of negative values and the extended negative integer range permitted by major type 1.</t>
      <t>In most cases, these additional processing steps are straightforward when the application already uses a big number library.</t>
      <t>Another acceptable approach is for a CBOR library to provide a generic mechanism that allows applications to register handlers for specific tags.
In this case, handlers for tags 2 and 3 MUST perform the required unification with major types 0 and 1.</t>
      <t>Finally, note that big numbers are not a widely used feature of CBOR.
Some CBOR libraries may entirely omit support for tags 2 and 3.</t>
    </section>
    <section anchor="CheckingDecoder">
      <name>Serialization Checking</name>
      <t>Serialization checking rejects input which, while well-formed CBOR, does not conform to a particular serialization rule set it is enforcing.
For example, a decoder checking for deterministic serialization will error out if map keys are not in the required sorted order.
Likewise, a decoder checking for preferred-plus serialization will reject any CBOR data item that is not encoded in its shortest form.</t>
      <t>This type of checking goes beyond the basic requirement of verifying that input is well-formed CBOR.
The data rejected by serialization checking is well-formed; it is rejected because it violates additional serialization constraints.</t>
      <section anchor="serialization-checking-use-cases">
        <name>Serialization Checking Use Cases</name>
        <t>Some applications that rely on deterministic serialization may choose serialization checking in order to ensure that the data they consume is truly deterministic and that the assumptions their logic makes about determinism hold.</t>
        <t>Some protocol environments may use serialization checking to minimize representational variants as a strategy to improve interoperability.
Discouraging variants early prevents them from compounding.
See <xref target="RFC9413"/> on maintaining robust protocols.</t>
        <t>Serialization checking may enhance security in certain contexts, but such checking is never a substitute for correct and complete CBOR input validation.
All CBOR decoders — regardless of their capabilities, modes, or optional features — must always perform full input validation. This includes rejecting CBOR features the decoder does not support.
For example, a decoder that does not support indefinite-length items must reject them because they are unsupported, not because it is acting as a checking decoder.</t>
        <t>Decoders that fail to perform this essential input validation are fundamentally inadequate and represent a security risk.
The appropriate remedy is to fix their input validation, not to add the serialization checking described here.</t>
      </section>
    </section>
    <section anchor="ByteStringWrapping">
      <name>CBOR Byte String Wrapping</name>
      <t>This appendix provides non-normative guidance on byte-string wrapping of CBOR.
It applies primarily to tag 24 and the CDDL .cbor and .cborseq control operators, but also to the serialization-specifying control operators described in <xref target="CDDL-Operators"/>.
It also applies when prose states the byte-string wrapping requirement, such as for the COSE protected headers.
See also <xref target="COSEPayload"/>.</t>
      <section anchor="purpose">
        <name>Purpose</name>
        <dl>
          <dt>Error isolation:</dt>
          <dd>
            <t>Wrapping CBOR in a byte string prevents encoding errors in the wrapped data from causing the enclosing CBOR to fail during decoding.
(CBOR decoding generally halts at the first error and lacks internal length redundancy found in formats like ASN.1/DER.)</t>
          </dd>
          <dt>CBOR library support for signing and hashing:</dt>
          <dd>
            <t>When wrapped CBOR needs to be signed or hashed, its original encoded bytes must be available.
Most CBOR libraries cannot directly extract the raw bytes of substructures, but byte-string wrapping provides direct access to the exact bytes for signing or hashing.</t>
          </dd>
          <dt>Protocol embedding:</dt>
          <dd>
            <t>Byte-string wrapping is generally useful when messages from one CBOR-based protocol need to be embedded within another CBOR protocol.</t>
          </dd>
          <dt>Special map keys:</dt>
          <dd>
            <t>Some CBOR libraries only support simple, non-aggregate map keys (e.g., integers or strings).
To use complex data types like arrays and maps as map keys, they can be wrapped in a byte string.</t>
          </dd>
        </dl>
      </section>
      <section anchor="wrapping-recommendations">
        <name>Wrapping Recommendations</name>
        <t>The serialization requirements for the wrapping CBOR may differ from those for the wrapped CBOR.
CBOR itself imposes no universal rule that they must match; this is determined by the design of the wrapping protocol.</t>
        <t>The wrapping protocol should not impose serialization requirements on the wrapped message.
The two should be treated as independent entities.
This approach avoids potential conflicts between serialization rules.</t>
        <t>For example, assume protocol XYZ wraps protocol ABC.
If protocol ABC requires Canonical CBOR as specified in <xref section="3.9" sectionFormat="of" target="RFC7049"/> (e.g., <xref target="CTAP2"/> from WebAuthn) while protocol XYZ requires deterministic serialization, <xref target="DeterministicSerialization"/>, a conflict would arise.</t>
        <t>Most CBOR data to be signed or hashed does not require a specific serialization.
CBOR, being a modern, fully specified, binary protocol, does not need canonicalization, wrapping, or armoring like other data representation formats such as JSON.
See the discussion in <xref target="WhenDeterministic"/>.</t>
      </section>
      <section anchor="cbor-library-implementation-suggestion">
        <name>CBOR Library Implementation Suggestion</name>
        <t>A straightforward implementation strategy is to instantiate a second CBOR encoder or decoder for the wrapped message.
However, this may be suboptimal in memory-constrained environments, as it may require both a duplicate copy of the wrapped data and an additional encoder/decoder instance.</t>
        <t>A more efficient approach can be for the CBOR library to treat the wrapped CBOR like a container (similar to arrays or maps).
Many CBOR implementations already handle arrays and maps as containers without requiring a separate instance.
Similarly, a byte-string wrapping encoded CBOR can be treated as a container that always contains exactly one item.</t>
      </section>
    </section>
    <section anchor="COSESerialization">
      <name>Serialization for COSE</name>
      <t>This appendix highlights how the topics in this document apply to CBOR Object Signing and Encryption  (COSE <xref target="RFC9052"/>).</t>
      <t>It focuses on the COSE_Sign1 message (<xref section="4.2" sectionFormat="of" target="RFC9052"/>), which is sufficient for illustrating the relevant considerations.
COSE_Sign1 is a simple structure for signing a payload.
Its serialization can be described in three parts:</t>
      <ul spacing="normal">
        <li>
          <t>The payload</t>
        </li>
        <li>
          <t>The Sig_structure</t>
        </li>
        <li>
          <t>The encoded message (the header parameters and the array of four that is the COSE_Sign1)</t>
        </li>
      </ul>
      <section anchor="COSEPayload">
        <name>COSE Payload Serialization</name>
        <t>The signed payload may or may not be CBOR, but assume that it is, perhaps a CWT or EAT.
The payload is transmitted from the signer/sender fully intact all the way to the verifier/receiver.
Because it is transmitted fully intact, CBOR is a binary protocol and intermediaries do not do things like wrap long lines or add base 64 encoding or such, it is not special in any way and COSE imposes no serialization restrictions on it at all.
That is, it can use any serialization it wants.
The serialization is selected by the protocol that defines the payload, not by COSE.</t>
        <t>This highlights the principle that determinism is often NOT needed for signing and hashing described in <xref target="WhenDeterministic"/>.</t>
        <t>It is also worth noting that the payload is a byte string wrapped.
This is not for determinism, armoring or canonicalization.
It is so that the payload can be any data format, including not CBOR.
It is also so CBOR libraries can return the CBOR-encoded payload for processing by the verification algorithms.
Most CBOR libraries decoders do not provide access to any arbitrary chunk of encoded CBOR in the middle of a message.
This is an example of byte string wrapping described in <xref target="ByteStringWrapping"/>.</t>
      </section>
      <section anchor="COSESigStructure">
        <name>COSE Sig_structure</name>
        <t>The Sig_structure <xref section="4.4" sectionFormat="of" target="RFC9052"/> is used to aggregate all the items that are input to the signature algorithm — the payload, protected headers and other.</t>
        <t>The Sig_structure is not transmitted from the sender to the receiver; instead, it is constructed independently by both parties.
COSE therefore explicitly requires deterministic encoding so that both the sender and receiver produce identical encoded CBOR representations.
This requirement is specified in <xref section="9" sectionFormat="of" target="RFC9052"/>.</t>
        <t>This COSE requirement is effectively equivalent to the deterministic serialization defined in <xref target="DeterministicSerialization"/>, since no floating-point NaNs are involved.
It is also effectively equivalent to preferred-plus serialization as defined in <xref target="PreferredPlusSerialization"/>, because the Sig_structure contains no maps.</t>
        <t>The determinism requirement does not apply to the protected headers incorporated into the Sig_structure.
Deterministic encoding of the headers is unnecessary because they are transmitted in the exact encoded form in which they are included in the Sig_structure.</t>
        <t>Furthermore, determinism requirements do not extend into CBOR inside of byte strings.
Once CBOR data is wrapped in a byte string, its internal encoding is treated as opaque and is not subject to surrounding serialization constraints.</t>
        <t>This illustrates the general need for deterministic serialization when signed data is reconstructed rather than transmitted in the exact form that was signed.
See <xref target="WhenDeterministic"/>.</t>
      </section>
      <section anchor="COSEMessage">
        <name>The Encoded Message</name>
        <t>A COSE_Sign1 message is an array of four elements containing two header parameter chunks, the payload, and the signature.
The two header parameter chunks are maps that hold the various header parameters.
COSE places no serialization requirements on these elements.
The COSE protocol functions correctly regardless of the CBOR serialization used, as long as the decoder can decode what the encoder sends.</t>
        <t>In this respect, the serialization of the COSE_Sign1 message is no different from that of any other CBOR-based protocol message.
Indefinite-length items may be used, and non-shortest CBOR arguments are permitted.
The only requirement is that the serialization used by the encoder be decodable by the receiver.</t>
        <t>Strictly speaking, COSE is a framework protocol intended for incorporation into an end-to-end protocol, which should explicitly define its serialization requirements.
See <xref target="FrameworkProtocols"/> and <xref target="EndToEndProtocols"/>.</t>
        <t>In practice, some COSE libraries have implicitly implemented only the preferred (or preferred-plus) serialization, and end-to-end protocols have often defaulted to whatever behavior the underlying COSE library provides.
While this generally works — particularly because the preferred serialization aligns with the recommendations here — it is more robust for an end-to-end protocol to state its serialization requirements explicitly.</t>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>This appendix provides examples of the serializations described in this document.
Each example is a single data item.
Collectively, the examples cover the major CBOR data types and some special cases.
<xref target="tab-example"/> describes the five fields provided for each example.</t>
      <table anchor="tab-example">
        <name>Example Data Item Fields</name>
        <thead>
          <tr>
            <th align="left">field</th>
            <th align="left">description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">description</td>
            <td align="left">Text describing the item</td>
          </tr>
          <tr>
            <td align="left">edn-representations</td>
            <td align="left">Unencoded value(s) for the data item</td>
          </tr>
          <tr>
            <td align="left">general-serializations</td>
            <td align="left">Encoded representation(s) for general serialization</td>
          </tr>
          <tr>
            <td align="left">preferred-plus-serializations</td>
            <td align="left">Encoded representation(s) for preferred-plus serialization</td>
          </tr>
          <tr>
            <td align="left">deterministic-serializations</td>
            <td align="left">Encoded representation for deterministic serialization</td>
          </tr>
        </tbody>
      </table>
      <section anchor="use-for-testing">
        <name>Use for Testing</name>
        <t>These examples are designed to support testing of CBOR libraries.
They cover only what is defined in this document and therefore do not provide complete or general CBOR test coverage.
All examples are well-formed and valid.</t>
        <t>While the CBOR-encoded serializations for each item can be used directly as test input, the EDN representation usually must be incorporated into the test manually.
For example, the EDN string "-5.0e-324" will likely need to be passed as a value of type double to the API of a C-language CBOR library that encodes double-precision numbers.</t>
        <t>Not all CBOR libraries support every data type represented in these examples.
This is acceptable: tests for unsupported types may be skipped, or used to verify that an appropriate “unsupported” error is returned.</t>
        <section anchor="encode-test">
          <name>Encode Test</name>
          <t>To test encoding, invoke the encoder for each example data item.
The encoder input is the item's EDN representations.
If an example provides multiple EDN representations, each of them should be tested.</t>
          <t>The encoder should be either configured for, or to default to, one of the three serialization types described in this document.
A test succeeds if the encoder produces any of the encoded representations given in the example for that serialization type.</t>
          <t>If an encoder supports multiple serialization types, each type can be tested in turn.</t>
        </section>
        <section anchor="decode-test">
          <name>Decode Test</name>
          <t>To test decoding, invoke the decoder for each example data.</t>
          <t>The decoder should be either to be configured for, or to default to, one of the three serialization types described in this document.
For the selected serialization type, process every encoded representation defined for the target type.
A test passes if the decoded output matches the value specified by the corresponding EDN representation.</t>
          <t>If a decoder supports multiple serialization types, each type can be tested in turn.</t>
        </section>
        <section anchor="checking-decoder-test">
          <name>Checking Decoder Test</name>
          <t>Checking decoders are described in <xref target="CheckingDecoder"/>.</t>
          <t>This test verifies that a checking decoder rejects encodings allowed by general serialization but non-conforming for the target serialization type.
It applies only to CBOR libraries that implement serialization conformance checking.</t>
          <t>Testing a checking decoder for a target serialization type is typically performed as follows: for each example, supply the decoder with every representation permitted under general serialization except those allowed for the target serialization type.
Decoding each such input must result in a conformance-checking error.</t>
          <t>General-serialization decoders are not tested in this way, since they must accept all valid serialization forms.</t>
        </section>
        <section anchor="NonChecking">
          <name>Non-Checking Decoder Test</name>
          <t>A non-checking decoder may accept encodings beyond what is required for the target serialization type.
For example, a preferred-plus decoder will often accept non-shortest-length arguments, even though it is not required to do so, and such encodings are not permitted under preferred-plus.
These examples can be used to test such extended decoding.</t>
          <t>Testing proceeds similarly to that for a checking decoder: inputs outside the target serialization type are supplied to the decoder.
The difference is that, for a non-checking decoder, many of these inputs may successfully decode rather than producing a conformance error.
When decoding does fail, the expected error is typically “unsupported.”</t>
          <t>Which encoding forms are accepted and which are rejected as unsupported is entirely dependent on the additional capabilities a CBOR library chooses to support and therefore not specified here.</t>
          <t>Note the following:</t>
          <ul spacing="normal">
            <li>
              <t>It is common for preferred-plus and deterministic decoders to accept non-shortest-length arguments.</t>
            </li>
            <li>
              <t>If the floating-point data type is supported, all serialization types described in this document require support for decoding half-precision representations and subnormals.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="example-data-items">
        <name>Example Data Items</name>
        <t>These are available as individual files at <xref target="Examples-Repo"/>.</t>
        <t>All general serialization examples of strings, arrays and maps include indefinite-length encodings so as to provide full test cases.
CBOR libraries that don't support indefinite-length decoding can not claim to support general serialization even if they support most of the rest of general serialization.
For the purpose of classification by this document they are preferred-plus libraries with extra decoding features.
The extra decoding features can be tested as described in <xref target="NonChecking"/>.</t>
        <t>File: zero.edn</t>
        <artwork><![CDATA[
{
   "description": "The integer 0" ,
   "edn-representations" : ["0"] ,
   "general-serializations": [h'00',
                              h'1800',
                              h'190000',
                              h'1a00000000',
                              h'1b0000000000000000',
                              h'c2420000',
                              h'c240'],
   "preferred-plus-serializations": [h'00'],
   "deterministic-serialization": [h'00']
}
]]></artwork>
        <t>File: three.edn</t>
        <artwork><![CDATA[
{
   "description": "The integer 3" ,
   "edn-representations" : ["3"] ,
   "general-serializations": [h'03',
                              h'1803',
                              h'190003',
                              h'1a00000003',
                              h'1b0000000000000003',
                              h'c2420003' ],
   "preferred-plus-serializations": [h'03'],
   "deterministic-serialization": [h'03']
}
]]></artwork>
        <t>File: minus_twenty_five.edn</t>
        <artwork><![CDATA[
{
   "description": "The integer -25",
   "edn-representations" : ["-25"],
   "general-serializations": [h'3818',
                              h'390018',
                              h'3a00000018',
                              h'3b0000000000000018',
                              h'c3420018' ],
   "preferred-plus-serializations": [h'3818'],
   "deterministic-serialization": [h'3818']
}
]]></artwork>
        <t>File: 65_bit_neg.edn</t>
        <artwork><![CDATA[
{
   "description": "Largest negative integer" ,
   "edn-representations" : ["-18446744073709551616"] ,
   "general-serializations": [h'3bffffffffffffffff',
                              h'c348ffffffffffffffff'],
   "preferred-plus-serializations": [h'3bffffffffffffffff'],
   "deterministic-serialization": [h'3bffffffffffffffff']
}
]]></artwork>
        <t>File: byte_string.edn</t>
        <artwork><![CDATA[
{
   "description": "The byte string of length 3: 0x010203",
   "edn-representations" : ["h'010203'"],
   "general-serializations": [h'43010203',
                              h'5f4101420203ff',
                              h'5f5801015a000000020203ff'],
   "preferred-plus-serializations": [h'43010203'],
   "deterministic-serialization": [h'43010203']
}
]]></artwork>
        <t>File: text_string.edn</t>
        <artwork><![CDATA[
{
   "description": "The text string 'hi there'",
   "edn-representations" : ["\"hi there\""],
   "general-serializations": [
     h'686869207468657265',
     h'7f686869207468657265ff',
     h'7f64686920746468657265ff',
     h'7f790004686920747B000000000000000468657265ff'],
   "preferred-plus-serializations": [
     h'686869207468657265'],
   "deterministic-serialization": [
     h'686869207468657265']
}
]]></artwork>
        <t>File: array.edn</t>
        <artwork><![CDATA[
{
   "description": "The array [1, 2, 3]",
   "edn-representations" : ["[1, 2, 3]"],
   "general-serializations": [h'83010203',
                              h'9f010203ff' ],
   "preferred-plus-serializations": [h'83010203'],
   "deterministic-serialization": [h'83010203']
}
]]></artwork>
        <t>File: map.edn</t>
        <t>Note that map order is not significant in the CBOR data model.
Maps are only sorted to provide deterministic encoding.</t>
        <artwork><![CDATA[
{
  "description": "Map with three items using integer map keys",
  "edn-representations" : [
    "{1:\"x\", 2:\"y\", 3:\"z\"}",
    "{1:\"x\", 3:\"z\", 2:\"y\"}",
    "{2:\"y\", 3:\"z\", 1:\"x\"}",
    "{2:\"y\", 1:\"x\", 3:\"z\"}",
    "{3:\"z\", 1:\"x\", 2:\"y\"}",
    "{3:\"z\", 2:\"y\", 1:\"x\"}" ],
  "general-serializations": [
     h'a301617802617903617a',
     h'a301617803617a026179',
     h'a302617903617a016178',
     h'a302617901617803617a',
     h'a303617a016178026179',
     h'a303617a026179016178',
     h'bf03617a026179016178ff',
     h'a31a00000003617a19000261791B00000000000000016178'],
  "preferred-plus-serializations": [ 
     h'a301617802617903617a',
     h'a301617803617a026179',
     h'a302617903617a016178',
     h'a302617901617803617a',
     h'a303617a016178026179',
     h'a303617a026179016178'],
  "deterministic-serialization": [
    h'a301617802617903617a']
}
]]></artwork>
        <t>File: map_strings.edn</t>
        <artwork><![CDATA[
{
  "description": "Three item map with string keys",
  "edn-representations" : [
     {"abc": 1, "def": 2, "ghi": 3},
     {"abc": 1, "ghi": 3, "def": 2},
     {"def": 2, "abc": 1, "ghi": 3},
     {"def": 2, "ghi": 3, "abc": 1},
     {"ghi": 3, "abc": 1, "def": 2},
     {"ghi": 3, "def": 2, "abc": 1} ],
  "general-serializations": [
     h'a3636162630163646566026367686903',
     h'a3636162630163676869036364656602',
     h'a3636465660263616263016367686903',
     h'a3636465660263676869036361626301',
     h'a3636768690363616263016364656602',
     h'a3636768690363646566026361626301',
     h'bf636162630163646566026367686903ff',
     h'bf7f6161626263ff017f6264656166ff027f63676869ff03ff'],
  "preferred-plus-serializations": [ 
    h'a3636162630163646566026367686903',
    h'a3636162630163676869036364656602',
    h'a3636465660263616263016367686903',
    h'a3636465660263676869036361626301',
    h'a3636768690363616263016364656602',
    h'a3636768690363646566026361626301'],
  "deterministic-serialization": [
    h'a3636162630163646566026367686903' ]
}
]]></artwork>
        <t>File: positive_bignum.edn</t>
        <t>Note that big numbers are included in the test data because preferred-plus serialization requires their unification with integers.</t>
        <artwork><![CDATA[
{
  "description": "A positive big num",
  "edn-representations" : ["79228162514264337593543950335"],
  "general-serializations": [h'c24cffffffffffffffffffffffff',
                             h'c24e0000ffffffffffffffffffffffff' ],
  "preferred-plus-serializations": [h'c24cffffffffffffffffffffffff'],
  "deterministic-serialization":  [h'c24cffffffffffffffffffffffff']
}
]]></artwork>
        <t>File: negative_bignum.edn</t>
        <t>Note that this is the value closest that can be represented as a big number, not a type 1 integer for preferred-plus serialization.</t>
        <artwork><![CDATA[
{
   "description": "Negative bignum on boundary with type 1 integer",
   "edn-representations" : ["-18446744073709551617"],
   "general-serializations": [
     h'c349010000000000000000',
     h'c34c000000010000000000000000',
     h'c35f450000000001480000000000000000ff'],
   "preferred-plus-serializations": [
     h'c349010000000000000000'],
   "deterministic-serialization":  [
    h'c349010000000000000000']
}
]]></artwork>
        <t>File: date_epoch_tag.edn</t>
        <t>Note that this is provided as a test case for tags.
There are no requirements for dates in this document.
The tag content in this example does vary by serialization type.</t>
        <artwork><![CDATA[
{
   "description": "An epoch date tag" ,
   "edn-representations" : ["1(1776614355)"] ,
   "general-serializations": [h'c11a69e4fbd3',
                              h'd8011a69e4fbd3',
                              h'd900011a69e4fbd3',
                              h'da000000011a69e4fbd3',
                              h'db00000000000000011a69e4fbd3',
                              h'c11b0000000069e4fbd3'],
   "preferred-plus-serializations": [h'c11a69e4fbd3'],
   "deterministic-serialization":   [h'c11a69e4fbd3']
}

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

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

]]></artwork>
        <t>File: float_half_subnormal.edn</t>
        <artwork><![CDATA[
{
   "description": "Half-precision subnormal float" ,
   "edn-representations" : ["3.0517578125E-5"] ,
   "general-serializations": [h'fb3f00000000000000',
                              h'fa38000000',
                              h'f90200' ],
   "preferred-plus-serializations": [h'f90200'],
   "deterministic-serialization": [h'f90200']
}
]]></artwork>
        <t>File: float_neg_infinity.edn</t>
        <artwork><![CDATA[
{
  "description": "Negative Infinity",
  "edn-representations" : ["-Infinity"] ,
  "general-serializations": [h'f9fc00',
                             h'faff800000',
                             h'fbfff0000000000000'],
  "preferred-plus-serializations": [h'f9fc00'],
  "deterministic-serialization": [h'f9fc00']
}
]]></artwork>
        <t>File: float_quiet_nan.edn</t>
        <artwork><![CDATA[
{
  "description": "Floating-point quiet NaN",
  "edn-representations" : ["NaN"] ,
  "general-serializations": [h'f97e00',
                             h'fa7fc00000',
                             h'fb7ff8000000000000'],
  "preferred-plus-serializations": [h'f97e00'],
  "deterministic-serialization": [h'f97e00']
}
]]></artwork>
        <t>File: float_nan_payload.edn</t>
        <t>The NaN payload is a special case.
For preferred-plus and deterministic serialization, the decode should fail.
For general serialization a NaN with a payload should be returned, but there is no EDN representation for that.</t>
        <artwork><![CDATA[
{
  "description": " Floating-point NaN payload/significand is 0x1ff",
  "edn-representations" : [] ,
  "general-serializations": [h'f97dff',
                             h'fa7fbfe000',
                             h'fb7ff7fc0000000000'],
  "preferred-plus-serializations": [],
  "deterministic-serialization": []
}
]]></artwork>
      </section>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="R." surname="Mahy" fullname="Rohan Mahy">
        <organization/>
        <address>
          <email>rohan.ietf@gmail.com</email>
        </address>
      </contact>
      <contact initials="J." surname="Hildebrand" fullname="Joe Hildebrand">
        <organization/>
        <address>
          <email>hildjj@cursive.net</email>
        </address>
      </contact>
      <contact initials="W." surname="McNally" fullname="Wolf McNally">
        <organization>Blockchain Commons</organization>
        <address>
          <email>wolf@wolfmcnally.com</email>
        </address>
      </contact>
      <contact initials="C." surname="Bormann" fullname="Carsten Bormann">
        <organization>Universität Bremen TZI</organization>
        <address>
          <email>cabo@tzi.org</email>
        </address>
      </contact>
      <contact initials="A." surname="Rundgren" fullname="Anders Rundgren">
        <organization/>
        <address>
          <email>anders.rundgren.net@gmail.com</email>
        </address>
      </contact>
      <contact initials="V." surname="Goncharov" fullname="Vadim Goncharov">
        <organization/>
        <address>
          <email>vadimnuclight@gmail.com</email>
        </address>
      </contact>
      <contact initials="K." surname="Takayama" fullname="Ken Takayama">
        <organization/>
        <address>
          <email>ken.takayama.ietf@gmail.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
muJkf9XhTYdoKWEfCNVa508L/GhRSLYR3NsO2cQ/tL0UI3gjipnLyEOSClSW
pu/nZxycB3UBIXui8+qYxiHcl1GB86xputQtWgjUFeuB0YWQtonSSwBVzoZc
N5OyhcYObQKpVc9Ehwv6/nSupWKyCtW0tiZ9hSymeuqs/HeJRMW3t8g4q8QK
5mKKMvYf074CUzpvuAQXs+nPboE2Qrmgf6ZbvUCzeTgtr635I19kc1eDTEtt
F9jirLD049677Ci2sH9MnTq5JOq5N5vpL1MHctmhNJaXRMtR48RwB4C1bd7L
1T4Qt6l0p/g8nNaXNkPbNnrxVucc5U3T52pMIT1psayLzN7mc59SCdZJK6f7
3Cna7hSdcJsbIwuv0qS0Vlw2E1DWJ/CjvBImj2olSP5V2eJrpGonYW9RksEd
cfpf/tO/0lptXbHo8tlzSo9yP7D5mc/hGlAtNOmeVDpd0ANf27kU9jobHJ+D
wCsoDUzj5vL9IfpQEQ1+TUaXq2pGxa/TebAyM+vf1fYmNqCSbCO4jiVKGpb+
aU5mA1F16lJL9mPc0gOW8RZIYUKknETdAtbHdWEMmLDFSCaWWtqqYyog8jNW
EJsdKk6S3BwXCy6zSJfdaXlbr/hObEjZOubZ2oYGrg8cjw05jQdG5ecEn9fC
s2qVm6n0BvyKdQdDa1kQaGBULJYcuU9LlbJjB2TOXKvQaQs+k7Jf1MiEuVZ+
ER+p8gGsCZWLBUnC0o2v19ajqitpxviunjBn2DmVh8b5cu0RDhVCOJnS1epl
9Y916dqPxrbBMW4De7mFIHtOMccSSKSiRieF2mtXY2wa7VTuEi5ApaqXyDXe
tBZWUAum9A1r4B9mCluOjGHFmG68GHazjsU/bhYM3M50CgCHJrr7EmsnKYTy
acmiw5z766AO1q/b+BCeJMV+eYT/8ylDqDU4nSe06lmVL9Nx2eBu17pQtPZ3
I9L6rh0Z7mU2LtZcBjra5xV86eH/uTf9FUp9YzIYC7/A7z7iCEPT33nfq0hC
blkZwamYW64MMpFHbz5f0T1Tmdg4mP1eHECq7IQpOym5uZCKdL5Yaiu2XlWh
fc+UcXDUFKc6EpVDubGl9uUvmPqjmUw+U4wwEMAdsNqBY4HyWrmBYYSnVLk0
XxXGjuhD84BpGJ6A6Cm15rWuDiOyDbMAreWKlCHnZmdSS07oPOp0zE95co4R
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
6sxjejti1U7IZHGIf/47VlgyoZJFAQA=

-->

</rfc>
