<?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-05" 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-05"/>
    <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="March" day="28"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <keyword>cbor</keyword>
    <abstract>
      <?line 106?>

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

<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>
        <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 integers, maps, strings, and floating-point numbers.</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; BER and DER encoding for ASN.1 are a similar design choice.)</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 works well 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 might transmit an indefinite-length array to a decoder that does not support indefinite-length encodings.
Both implementations are compliant with <xref target="STD94"/>.</t>
        <t>Decoders, in particular, frequently choose not to support all serialization forms.
This may be due to operation in constrained environments or because implementing a full general decoder is significantly more work
(particularly in languages like C and Rust, which lack built-in support for 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 such a serialization rather than restating detailed encoding rules, and 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 and library implementations can reference this serialization instead of defining their own deterministic encoding rules.</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 attempting to clarify those in <xref target="STD94"/> (that need clarification).
This approach enables the serialization requirements to be expressed directly in normative <xref target="RFC2119"/> language, and to be consolidated in this single comprehensive specification.
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 desecribed in <xref target="STD94"/> are implemented.</t>
        <t>For example, preferred serialization described in <xref target="STD94"/> is commonly implemented without support for indefinite-lengths.</t>
        <t>Preferred-plus serialization as defined here is largely 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>
      <t><cref anchor="to-be-removed5">This section substantially revised in -03 and hopefully close to its final form</cref></t>
      <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 full set of serialization options standardized in <xref section="3" sectionFormat="of" target="STD94"/>.
This full set was not explicitly named in <xref target="STD94"/>.</t>
      <t>General serialization consists of all of these:</t>
      <ul spacing="normal">
        <li>
          <t>Any length CBOR argument (e.g., the integer 0 may be encoded as 0x00, 0x1800 or or 0x190000 and so on).</t>
        </li>
        <li>
          <t>Floating-point values may be encoded using any length (e.g. 0.00 can be 0xf900, 0xfa000000000 and so on).</t>
        </li>
        <li>
          <t>Both definite or indefinite-length strings, arrays and maps are allowed.</t>
        </li>
        <li>
          <t>Big numbers can represent values that are also representable by major types 0 and 1 (e.g., 0 can be encoded as a big number, as 0xc34100).</t>
        </li>
      </ul>
      <t>A decoder that supports general serialization is able to decode all of these.</t>
      <section anchor="WhenGeneral">
        <name>When To Use General Serialization</name>
        <t>Preferred-plus serialization (<xref target="PreferredPlusSerialization"/>) satisfies the vast majority of CBOR use cases; therefore, the need for general serialization is rare and arises only in unusual circumstances.
The following are representative examples:</t>
        <ul spacing="normal">
          <li>
            <t>Enable on-the-fly, streaming encoding of strings, arrays, and maps with indefinite lengths.
This is useful when an array, map, or string is many times larger than the available memory on the encoding device.</t>
          </li>
          <li>
            <t>Directly encode or decode integer values from hardware registers with fixed-size integer encoding.
CBOR is sufficiently simple that encoders and decoders for some protocols can be implemented solely in hardware without any software.
Fixed-size integer encoding allows values to be copied directly in and out of hardware registers.</t>
          </li>
          <li>
            <t>Enable in place update of the lengths of strings, arrays and maps by using fixed-size encoding of their lengths.
For example, if the length of a string is always encoded in 32 bits, increasing the 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 NaNs in floating-point values (see <xref target="NaN"/>).</t>
          </li>
        </ul>
        <t>Except for non-trivial NaNs, the other serializations can encode the same data types and value ranges as general serialization.
Its purpose is solely to simplify or optimize encoding in atypical constrained environments.
The choice of serialization is orthogonal to the data model.
See also the section on special serializations in <xref target="SpecialSerializations"/>.</t>
      </section>
      <section anchor="general-serialization-is-the-default">
        <name>General Serialization is the Default</name>
        <t>If a CBOR-based protocol specification does not explicitly specify serialization, general serialization is implied.
This means that a compliant decoder for such a protocol is required to accept all forms allowed by general serialization including both definite and indefinite lengths.
For example, CBOR Web Token, <xref target="RFC8392"/> does not specify serialization; therefore, a full and proper CWT decoder must be able to handle variable-length CBOR argments plus indefinite-length strings, arrays and maps.</t>
        <t>In practice, however, it is widely recognized that some CWT decoders cannot process the full range of general serialization, particularly indefinite lengths.
As a result, CWT encoders typically limit themselves to the subset of serializations that decoders can reliably handle, most notably by never encoding indefinite lengths.
This is also true in practice of other protocols implementations like those for <xref target="RFC9052"/>.</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>The purpose of preferred-plus serialization is to provide interoperability without requiring support for indefinite-length decoding.
If an encoder never produces indefinite-length items, the decoder can safely treat them as errors.
Supporting indefinite-length decoding, especially for strings, introduces additional complexity and often necessitates dynamic memory allocation, so omitting it significantly reduces the implementation burden.</t>
        <t>Preferred-plus serialization also provides a size efficiency gain by encoding the CBOR argument in the shortest form.
Implementations typically find encoding and decoding in this form to be straightforward.</t>
        <t>The easy implementation and broad usefulness makes preferred-plus serialization the best choice for most CBOR protocols.
To some degree it is a de facto standard for common CBOR protocols.</t>
        <t>See <xref target="WhenGeneral"/> for uses cases where preferred-plus serialization may not be suitable.
Otherwise, for the vast majority of use cases, preferred-plus serialization provides interoperaibility, small encoded size and low implementation costs.</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>
      <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>Although discouraged, defining special serializations that differ from those specified here is permitted.
For example, a use case might require deterministim from a protocol that uses indefinite lengths.
For another example, a protocol may require only a subset of general serialization features — for instance, fixed-length integer encodings but not indefinite lengths.</t>
      <t>A recommended way to define a special serialization is to describe it as preferred-plus or deterministic serialization with additional constraints or extensions.
For example, a protocol requiring deterministic streaming of maps and arrays can be defined as follows:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>Deterministic serialization MUST be used, but all maps and arrays MUST be encoded with indefinite lengths, never definite lengths.
Strings are still encoded with definite lengths.
Maps are still to be ordered as required by 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 Control Operators</name>
      <t>Four new control operators are defined for use in CDDL <xref target="RFC8610"/>.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Purpose</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">.prefp</td>
            <td align="left">Use preferred-plus serialization for a data item</td>
          </tr>
          <tr>
            <td align="left">.prefpseq</td>
            <td align="left">Use preferred-plus serialization for a CBOR sequence</td>
          </tr>
          <tr>
            <td align="left">.dtrm</td>
            <td align="left">Use deterministic serialization for a data item</td>
          </tr>
          <tr>
            <td align="left">.dtrmseq</td>
            <td align="left">Use deterministic serialization for a CBOR sequence</td>
          </tr>
        </tbody>
      </table>
      <t>These operators have the same semantics as the .cbor and .cborseq operators (See <xref section="3.8.4" sectionFormat="of" target="RFC8610"/>) with the additional requirement for preferred-plus or deterministic serialization.
These specify that what is in the “controller” (the right side of the operator) be serialized as indicated.</t>
      <t>For example, a byte string containing embedded CBOR that must be deterministically encoded can be described in CDDL as:</t>
      <artwork><![CDATA[
leaf = #6.24(bytes .dtrm any)
]]></artwork>
      <t>The scope of these operators 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 constrained serialization must specify that constraint explicitly.
See also <xref target="ByteStringWrapping"/>.</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 contents of
<xref target="tbl-iana-reqs"/> 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>
      <?v3xml2rfc table_borders="light" ?>

<table anchor="tbl-iana-reqs">
        <name>New control operators to be registered</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">.prefp</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.prefpseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.dtrm</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.dtrmseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
      <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="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 578?>

<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>
        <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="general-protocol-considerations-for-determinism">
      <name>General Protocol Considerations for Determinism</name>
      <t>This is the section that covers what is know as ALDR in some discussions.</t>
      <t>[^rfced] Please remove above sentence before publication</t>
      <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="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 consists of a single data item.
Collectively, the examples cover the major CBOR data types as well as several useful special cases.
Each example includes five fields, as described in <xref target="tab-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 CBOR library testing, as described in the following sections.
They are for validating the serialization rules defined in this document, not for general CBOR testing (all data items are well-formed and valid).</t>
        <t>Most CBOR libraries operate on environment-specific data representations with library-specific APIs, rather than on EDN.
As a result, the EDN representation of each data item will typically need to be transformed into the corresponding representation used by the target environment.
For example, in the C programming language, the floating-point value 1.5 is a double, and the encoding API will likely accept an argument of that type.</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 input to the encoder is the EDN representation of the data item.
Most examples have a single EDN representation, but some have multiple; in those cases, each EDN representation should be tested.</t>
          <t>The encoder is expected to be configured for, or to default to, one of the three serialization types described in this document.
A test succeeds if the encoder produces any valid encoded representation for that serialization type.</t>
          <t>If an encoder supports multiple serialization modes, each mode can be tested in turn.</t>
        </section>
        <section anchor="decode-test">
          <name>Decode Test</name>
          <t>To test decoding, invoke the decoder for each of the example data items.</t>
          <t>The decoder is expected to be configured for, or to default to, one of the three serialization types described in this document.
For each example, decoding should be attempted using all encoded representations defined for that serialization type.
The test succeeds if the decoded result matches the value specified in the EDN representation.</t>
          <t>If a decoder supports multiple serialization modes, each mode 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>The purpose of this test is to verify that a checking decoder correctly rejects non-conforming encodings for a given serialization type.
This test applies only to CBOR libraries that support serialization conformance checking.</t>
          <t>There is no notion of a checking decoder for general serialization, since such a decoder must, by definition, accept all valid serialization forms.
(It should still reject not-well-formed or invalid CBOR, but such cases are out of scope for this document and these examples.)</t>
          <t>To test a preferred-plus checking decoder, invoke the decoder for each example data item.
The inputs should be the encoded representations permitted by general serialization, excluding those allowed under preferred-plus.
Each invocation is expected to result in a conformance error.</t>
          <t>Similarly, to test a deterministic checking decoder, invoke it for each example data item.
The inputs should include representations permitted by both general and preferred-plus serialization, excluding those allowed under deterministic serialization.
Each invocation is expected to result in a conformance error.</t>
        </section>
        <section anchor="non-checking-decoder-test">
          <name>Non-Checking Decoder Test</name>
          <t>A non-checking decoder may accept encodings beyond the constraints of the specific serialization type it nominally supports.
For example, a preferred-plus decoder will often accept non-shortest-length arguments, even though 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, in that inputs outside the target serialization type are provided 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 data item types are accepted and which are rejected as unsupported is highly dependent on the specific CBOR library and the additional capabilities it implements and thus 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 values.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="example-data-items">
        <name>Example Data Items</name>
        <t>These are available as individual files at https://github.com/cbor-wg/draft-ietf-cbor-serialization.</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>
        <artwork><![CDATA[
{
   "description": "The integer 3" ,
   "edn-representations" : ["3"] ,
   "general-serializations": [h'03',
                              h'1803',
                              h'190003',
                              h'1a00000003',
                              h'1b00000000000003',
                              h'c2420003' ],
   "preferred-plus-serializations": [h'03'],
   "deterministic-serialization": [h'03']
}
]]></artwork>
        <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>
        <artwork><![CDATA[
{
   "description": "The floating-point value 1.5 (which can be reduced to half-precision)" ,
   "edn-representations" : ["1.5"] ,
   "general-serializations": [h'f93e00',
                              h'fafc000000',
                              h'fb3ff8000000000000' ],
   "preferred-plus-serializations": [h'f93e00'],
   "deterministic-serialization": [h'f93e00']
}
]]></artwork>
        <artwork><![CDATA[
{
   "description": "Postive Infinity",
   "edn-representations" : ["Infinity"] ,
   "general-serializations": [h'f97c00',
                              h'fa7f800000',
                              h'fb7ff0000000000000' ],
   "preferred-plus-serializations": [h'f97c00'],
   "deterministic-serialization": [h'f97c00']
}
]]></artwork>
        <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>
        <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>
        <artwork><![CDATA[
{
   "description": "The integer 2^96 -1, which can only be represented by a big number",
   "edn-representations" : ["79228162514264337593543950335"],
   "general-serializations": [h'c24cffffffffffffffffffffffff',
                              h'c24e0000ffffffffffffffffffffffff' ],
   "preferred-plus-serializations": [h'c24cffffffffffffffffffffffff'],
   "deterministic-serialization":   [h'c24cffffffffffffffffffffffff']
}
]]></artwork>
        <artwork><![CDATA[
{
   "description": "The byte string of length 3: 0x010203",
   "edn-representations" : ["h'010203'"],
   "general-serializations": [h'43010203',
                              h'5f4101420203ff' ],
   "preferred-plus-serializations": [h'43010203'],
   "deterministic-serialization": [h'43010203']
}
]]></artwork>
        <artwork><![CDATA[
{
   "description": "The text string 'hi there'",
   "edn-representations" : ["\"hi there\""],
   "general-serializations": [h'686869207468657265',
                              h'7f686869207468657265ff',
                              h'7f64686920746468657265ff' ],
   "preferred-plus-serializations": [h'686869207468657265'],
   "deterministic-serialization": [h'686869207468657265']
}
]]></artwork>
        <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>
        <artwork><![CDATA[
{
  "description": "Map with three items. Note that map order is never significant in th data model in CBOR",
  "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'  ],
  "preferred-plus-serializations": [ h'a301617802617903617a',
                                     h'a301617803617a026179',
                                     h'a302617903617a016178',
                                     h'a302617901617803617a',
                                     h'a303617a016178026179',
                                     h'a303617a026179016178' ],
  "deterministic-serialization": [h'a301617802617903617a']
}
]]></artwork>
        <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 with payload 0x1ff",
   "edn-representations" : [] ,
   "general-serializations": [h'f97fff',
                              h'f7fff80000',
                              h'fb7ffffc0000000000' ],
   "preferred-plus-serializations": [h'f97fff'],
   "deterministic-serialization": [h'f97fff']
}
]]></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="Borman" fullname="Carsten Borman">
        <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:
H4sIAJg2yGkAA8V92XIb2ZXgO74ig4qYIm0A4qKNrLbblESV5dEWIquru+1y
TwJIAGklMuFcSMFSOfwR8zIRPW/zJ/Mn/pI5690yEwBdMzGsCBUJZN7l3HPP
voxGo8HtRXQ2GNRpnSUX0Yvn7z9G10mZxln6l7hOizyK81n0MqmTcpXmabUa
xJNJmdx2PTqYFdM8XsEwszKe16M0qeej6aQoR5X72CiL66SqB9O4voiqejYY
zOCDi8G0yKskr5rqIqrLJhlUdZnEq4vo9dXNq0G6Lunjqj49Pj4/Ph3E8OVF
FB1crtdZOqWBK1rrxyTORjfpKjkY3BXlp0VZNGte7eBTsoGPZhcRLmpwm+QN
TBvBj/sQ/l1v1rCLH+D1NF9E3+G39PkqTjN++ze4uXFRLujzuJwuL6KDZV2v
q4uHD/Ex/Ci9Tcb63EP84OGkLO6q5CGO8PCAp07rZTOBlwlQd4uHW2F3MICf
uKmXRXkxGEVpDsB6M47eNPlsksWzBIbkE3gTN2WSTxPvK1jGBRzZtCnTehPd
LJOi3ERv3ryArxLeWrbIflPJAzV9P54WK5gTDqcu00lT88Q8ycdiGefR23i5
sSOU+Bnt+jcL/ITe1xd+VyTRb9NslkxKOCr70hI++9OffgPzVgizPKnNKz8U
2Tx6O30XZ9mGtxDnAoyL6HlWTD9Nl3GaRy+K1QpQwI55By/+Bv9ZAVLCy95C
XsRlVSd59LwoV3HeGvf7HJYBa6n/9/+qo+dlsoJHb/79tR18Gk+K39R/SQkD
dNDLfAYvRR8B4gsAvn06pi/GpXyB++sAzr/Es3QVfVfksKGyuLWv3+IXeTPN
0sWy68X/iquLP8WbeBXbtz7BRLV8Gp7HIMd917BJxP+Pr16cnpycXwzg9+ub
l+eP6FKM5JrAr7+6wGeenT86H/Djz56cHMPXs1mGH7y+urp6+pjfiuq4XCRw
sfUupEmSfF5nRYlXIUnoKgCdaACk9cNnT588OT095xeZAuFg0XUNIIvLWTQv
yuhVVsBS88XoQ5HmdXQJuLlcJXU65asnlwF/HzGG4xD0N9GVaB5nVUJ/41VK
qjSfF/x8pLMBSYANjE6PT87li5fvX19EJ8fjk5Pj84f4FABmjN+Pdc248ct3
l2OEwoX9C69sHS8q+GiAMzlwJsidnZ8C+v1wM5APzh+dnF2YP44f47fvr6/0
k6fHj/hgohc3lx9OZd1KrbMUoBjdFNElQAF+RUIIEPtQFnUxLbLo9lSeDw5l
ns4KuBNpDBSCTqRaJ9OKPh7dno6PR+uKgHF8cnbMn05pqlFdjGJ3qtFapmq9
Nl7Wq4xnd49Iz+iHsxf8t3tG+Mm7+N3z4jMcd7BVpIpIjF/nwIrWJTKkqmP4
aCT/j6J5k2VKpyZJWUfvNsBSAPudeX/XZJthdHp8etINqKlMmzqz4g16WKzr
dCX0grb6II/z0YRWTvt4PXo5Fsozmhn2CWAjqs5H+v3bN/4u37/9DmnPPE1m
0dtilmS44zdxvmjiRRId0tdv3xxF/4LECXjz6fjx+MTdz8tkmqxgs7ink6fd
e7q7uxsXq4U594cw5EMa6eGHl68AbUejURRPAFbxtB4MbpZpFemNjWbJPM2T
KqrvCpYAPPYE3OgAoDRPyjKZjdZZU/nfHxCHPvDg4T8xPhi8riPAhgKYG5zW
rJnibMskwleig0WSJ2WchcPWBdFCehDPfQhEEx6YZAk8WUfF3H8hwuNDgYG3
M4O58LJFSOLGg5sC4LVEIMK/FQ5aJgmSolUUR3D46wzW3zkurjSu4RngHrSW
VfyngpgtPNkGV9TA6NO4SqoxwhnnCoYDKSfK8PyyDc0MH+Oe7oAEwvhFhb/O
8MsUV4UnBJuZbGhumg9eWjU5rGAsB7tKgV7BVXuAN4ngSyv58sD986fB4Hk8
JdkJzgsoGK0qgueqlmxoD3MFswFBWddVBCgDlOEW1kaw/fJlhdhc/fTTeADy
GbHJVbyBxVdLPDsQKNPkDlYN703sxIZ+wlTzFDg2bIJ2hdcxx4/xegG2ZCBV
Rasmq1OAAhx9ls5CSMIBIFAqxBK4K3GU1slqPHgF5DL5HCP06LgB4iUs7Pcn
cIN+hLPJo4k9FN7MCngZnjNgUQ7wjzdwmb9GNyAyRt7PV7iN1bRMCdWivX6+
Rs83IBu3Ph58HbV/uj7b8dPzCowPa4WbADAZZUm+AOzCxdwYeMiHh6dHeLQg
WBZ4soDqCLJJAvQxR1L1NTr+/OwU/jk+wX9O7foB22bBDO74MChjUewgMOgZ
8Sf4Ay7b4fHn+fyIxj+fR84E+DmMPxhcAzmGm8L3niCefAb6UpEIgfiyAKQb
Atat4V+gbbBc+AUReK7yxZrki7xBAso3EpbFdCTN8BIjIQSaDF/DMseCivhZ
lS6QigAmEy4ygHAG/IgQKEumuLN4OgUFBEEFX+AeUekBQgsTs/ZSJn9uUhI4
a8LZOFrHJVDJBveW5LdpWeT45RjpBSwdNmkXh9QJcJPXE82TuAYlYDw41IXm
RR0BMfhzkyAe020rkwXIWd9Gz68+sqYH/9fVE+gur9+NT4gOxVElMJYJpssi
BfnhaODforR10j7RgFmrJkVo4Pis5eFsROcYHypcnwENPOnsHE7tDogz0/q6
qIEuyTSyw095cZfjAPHslgScwYsiR3E+QV6/fW2oMVbRXZJleECzBPE8qlZw
qnssDFDmEg+hTCogRUMmwIAuZYxiJ4FXxSVLr4U8TUl9AWJWNet1AcIK/UEU
y1sgEsRKsYQhCA+ljOI5XkqHpxACT5JlfJviJYCL+3kteAhrgUEXMDPxElzq
3//2PxSXowWIh7if3xZ3yS1zQnjdQzeHO4MsADpLhhBNQAQgYalYwy2RZwM2
gazowQOW5JzHiAW2XzYjwwmksC3Y0DTGTdLFiNugRFydFLCpNU5Y63Z17wHN
BzLO5KwE1gj6VQQnm1fwHn7TRmUmV3jRBTtKZvmzImHs0/Nrv2qIwnjwHJfX
tW6SLkAsr/lYvnwhaRHZ5uAlT1fhBXOIwjCaIzbAMCgiLAuUCXAdsERdCmJv
BxYJfiAfBhI1a/A2RQR5vqb9iA4ivDkFswu8wjEJX5EKaQohvPGAVSDXAkPF
dRILxbs2OLQ7QSkmByrA0m4FN+cTCDFs02mqGq99Ol3CA1NgCk2a1SN4XPeI
F2G2ARkQBEq+qUrr8X2h90cAxtcAPBRsgXLBE0VV8zVtKpSwiymaIKKiqSsQ
XaIlIAQJXn33XQD4CVYLCENIB1S3IhkN550AIGDTiKVETlDYZBly1ZKlkCaS
wIpbUQgChGHNRp9DcZ2gKEQDUJSkbbL0VA1AJw5GhcNcMo7io1VNnA4vY5xm
tB0h9WWTJQIsplibNomKEXQpyrMgCnmQT+txr6KAt8Nb00W0TUUQ4uBaHIku
eGJmH0moiTHgRTLC4B0SbbwMKsN1ioE4g5CEUFOY+2IhSIXxBOT7qFqi0Il0
UfCAGDAQeDjDFWJyVcAcSvAFEMsYBF7kekhkVYxCBIRtv41zIJVreCOeLpOK
MaZXUaJdrouKkG0YJfBOJEqp8IVZOifUqF2kBZxyRQ54LLYGVE/6GFviHxNp
Q3SBW5qKYtTWbTrvUP/lAT0vrfjI5kgP5FoGd6UC7MySrZD4B27OLjy3t4oY
XyDAwI5AicF9M41HcY6YMAoe/kr9C3avW7JNS+ZL8jHJeEUAMFVf+2bIQb8K
VCKXNsTAJ1frWiTTKZDjdL4RFZMUOGFE0SEtNU/gOPkpgemR3AJFYNg5nknV
IcN4Mi4LyMCcgTpVMOgMvpnWzAuMlRLmFyMlrEA5BFMrfh+xrACtj9QHlW0F
dZCnlskyydG27CNCuGbRWSvemkguFSIIEHH4k2id0bRLxqO2rh0Z/T8rEKBw
jKzghyeg5ge8AylfadJ4UauFAxsCn6uN/k+SEZA+oHuxYwQgEteGMolyCaif
E1XB9QRxFsdcMA7Ed0Ocg1ObkTLbGi11ZFfXCIGrAxrgs4lQJqroivYzA6Q8
LoxwNgWHIeNx1btmXUR7YtABC+TZzoCd8L1DbO/ZI91CuIT4HcjeAvbrZrVC
svLlQfDNT4PB7/9YF6NJMgLkBxSZPf6x46OL6IZJzlSI2wS4do6SLsyOhpKK
j2B0fEbotwSRDaUukFMyvK017gtkddClM8ImIhWGEF57hBC/exC9KgGOKI6Z
xypYvvnUfAg7sI9azhaTMkZzI7QKZDskiJCBTE1trHIAiHO60qjGIYBb8v4s
WQPIkBAhYSO0RveJaMfTBD0zKHPhE45JjJVR4sVoR7OrQzYMbDFhQY3UI1gV
fD9PM+WyxGtaK/HoFOmqAjscBGbqg4Wd0d6ZGGcqsknxmYRnEF9xi6MJOrDs
60NkPGgqsCylLDJCcfg6Y5Qgu0CZALfFfa8SRFmQinx6DjBDY33i6Jyw4hc/
3AzJvTCMri5vmICycaAG7XhOqxdCQLPM2ztEEZpuxMerF+/fvr169/LqJZ87
DjSaxIieHe+xcgQ8dhs3GDLXwN3DlU2BFjfMyo32bA5NVB1/LFJ60lpA56ks
+L4j+Yglcct6317+G1729iS+kOSbPuYsAoqOj1wXsdWo3cysAMOzYsO3uFfF
YhsHqDCATiXhQ0ooRIMRKxsi/ULtbYXOsnq7jIToi3pgKOzAEoqStFgYOUvZ
AtehMTpmMGZlTIzRAlqldWNURtbR4g6IRm+/v75R4G1bK0qXRbNYohcexUGg
bLgwgV9sbyGSRqYxSCZ0HuHpzimplgAgzb1H1dohz7Kskua3RQaUmHVsRjbk
H0iVRMumM2umNYsHRrEgfYKPGOV8GEIk/WQ29C6nmhj0miMCTa38RxbQWqXC
OwR1ON54cJ2gVPQDbOmlC0oyFfB3eM+9+Azg1oQGRAEE8wV1WaB8EF0x2YD/
eawA/r4p4B+XE1x1UBgmf3w+yIxRI6VNtGgrSl1V1SDL1mPZhJIJ2fDIYIpm
PCPvpGUoxCEUVP21ty+fZg3KcsyAkBmyQbQa2tksihkTbb0sCftKjCNBMg6X
eFHUqcx13bCcKBsu5hhGsIxvVXLrMGCJTWdKiLeAi0F6l0QcdPAdjI5BzADa
gZTgcO6SmIMJcLER8NjqAEXuN9fD6Lc3Nx+Ylr96/fJ9i4h3s4Lu86M7anUv
X82q0ey92PCJYqROacT7Nocm25DdWahXqzysY5IlRuwtLmchomcVgcxw5R1G
hNceJTbWOdJbAiq8D6XlScV00ktkEanRc+lsAG3CndyY+YtokiqBoEYOKiSh
t1ACf4bDiq72NT/g3e7qp58AIV7LRSALMHEIOlIMwUAVBhGd7g7Lz9ZC6k+j
NmNkYCBUVSjPIoOgM28hbBcTFJRAP6CZA0ZgrNhqgx/6JNrjGoR5imIVKX7x
mpCLdHFRtdsToJFHzPNERTr4/XDryYqR1LO7I3+oQu4DO8QlIL0mEZYJNvy6
nWIDuuaFw9lCtNKJh1GnA1zx4jv+MqD6R2zjQTsZitfzuMlqwhTSkhFThu41
RsTEc0JzVIcrdWiUXnPX6YwAPHQS1m+CVsGXPJ3YFboXD4t49/7GvTVDY9Ej
I1qg2JJhuK3SEeHDSy4ucdE8RU97EL1RTwyzOpJ7nc+2SLWOE0fV2e3U54YB
S87jeLpMk1v2aoLkgFzC8f8ZpPWUDdKwjWL8AWZ4Kc+h/p7TWKICkfigRibj
63HiGoKBrnIzEM9P54OIui5TUlzNaJcfXu/Szwk1RcvFLapToFYvn7HLdVkM
RQZxuJJnnd8GY/JmAcQAQVHCA2j22QCAWooq/Wh8gjOr5QJXRWzHjcJgLAip
+FZU2CrKxlVoB/bZOYpiR4a+4Y1ho95t4u2pAwJ8Z8kmEc9mqcg4rthLRuDt
7EpYOduh0V9C3mq5NSJHu0YMIuiuxwYjqsRT7KkvRhUI+GoSV8RKjJgXwOPD
BoR/2Nt3xVA8P5MNum0uXehviB6LBugNRuDYajWneJZPhKIO/iOh2s7X8bjR
h1yz9aD/XL61Jm3ihTtOgE03hlYNDav2LGdbr4Iwp4LZbBtYSNAJoy3EdGzC
TVENY2Q/zNH+ISZD255srArvb8DzgxBp75Nyqt1iDlFwQ7w5TLRtxBqwZtCp
jXoqhBUQVZeOe5jxUGhbizjgxwYNt3MHX1qqQyJKw8Vt9wSC9MUPN3hcSDX2
ns7x43go0caGnbcnnbPM4IYOoNDKsvQq8DWJ398LKOg/EIF8iNy+echS31VT
0VWcFk05TZSzMnBRrEZ9axhNk7KOxV9OmE2Q28NgMv4ZSrSPl10qdY/2VS2L
JpuxNmnJwFbfSa9I7i+iSwfU6ZACzVOMeFmiK5RUp26VpefO7LbqkStE8bnC
iIXE2vDYy9FzrUhT3xvTBw8ioU5BEsuXB51US5xlamuPq4rwGpdL4aRbwk01
0nR7fGklgewaO2iFkTNHFBFWa4a7Y4erq7XhcnzPC2z3u04yjeYpinzD8DEY
kTWUKrkYDH4RXeYmmI94RFwu2E94mIwX46FYwChaLjpWzmLi/SoMujsewr8n
z46P2YqBf5wfww9bw4qIfIG/sGH7HFYHglqTVOGIrC3FdlG0jOh4DMOJ/Hz8
eX7Oc87jY/0J5qJ4GtUHoi5PkxPyx3FcLAisWWugqD1knTBUutAQQPEEo2cy
sTtg8kwvVYX9mgRdEsv/hNLuZg2P8jJPFLZmSw4842hiJhwygKdnj06Oj1no
8WKMhExX/WpUoIC5p088MyLye1NE3wPh77sp+Ix899MO8f8wUC5aMkEFv1Xz
VOxEt3FVd4UNiPjtSU50BxNRtXs3XNJBoGeJTbzsosujJm8qdB1M03LarJgb
VBIzWeBhE9qViXN+JHOr3YzuylXOpoV8BIsZzTF60EYrGi0J776PW0OLXOLi
Mqhp3J4aMQKbh2vPNlB0w+MAFLk0jDg4UuTmFd4RdiqRv1ItyRiacovpZuwL
WmFGl/jNzApnyS3GaeKWXqp3nVEwIg2BlXW59ILl87JYASMqZ3cMpQVQFLwS
bD5JPwM+VGq8xNd0MhsVWzVzDH1ikzn50BNX3RDnuSC4+Nd8TUlui2sRroqM
XbV2berjRQBVxbzGD0EM6F+ixovrfZYAgnUaRB/g8nBgOOA2IMYOgqB8kcUg
hDRrEivEJKRmiTaCWPwAgsEk0AGpi1ls7jZYE9rZ7DQcK2zxJc4o8EkpDSzx
7BRITU3hg9MSg9TEeCDv04Gf/vHkCQIE///Lk6F1jNC9wqiGO4z+Ct5ME5Ai
XP9GtUw5WQcJEI3J/gwS1yh0n8B3w26QqpI4qxxvWpneYrjcu/gdKZHzTi4i
+gE8xNrA1WdMOyAcCgcRNZkWF2gZUxP7GcSEMfXGQ6L5YG8Y2IrUuZMQYSgT
qMVNSc5CRH3GUpSsKXZkviFWKdFZ9oARycQDsTXIUL3bbTkDXXAl4P+ClH+1
KeEeKOGCpVhiVGzgY9mjMCbmECQsonSrXShfIQ/p5hscyhWJvY+lyC4jT58Q
2WGhDhSvXiZAMDYGi1USax5O7MTTKiclOhO6ipyIanQxTgmbEHk53FrEA7yt
PYsgXxNZ4DxJJKYkljb19+4xEcwfkgnw5U8J7BMkPFDzQM+wAnYXQDxuKYG3
4iQHPYA0Rd0z6UqOfRbu6IzyZDhFahQIhKxcELvfX44KQ2uXqnSyYC82WdRz
FzlJwyzSIMV3lkqXErcMu0DHgxWz6Q722iaGURBH3Ia5H5oPUxo+FPiZSQ+q
kuyWmQNdHONp7kr3ctcOM2QI1I0AWWKMYUv04WSjIQF5y1nRFg744pacrqGg
pZgaImeWU4ZefbKQc0gO4jtiFGirfIUxFkhFOpTZWvLfFoku0Jc0tjD0FLKy
sjUTcHxAtORKQu8/umptsARjsR4MTsaUMwSKa4lO0hHl5Am79dUZRfmmEhES
b7Mjm48xN7I9lpf6QvG4OmAtgWCInLFhS1Hk8CX4mvM6fwGiPnJRDtAaneAf
o9NHxk/icGXDeCjNKa6snZzWOebh4F0c7/FjHvD0MY/4+ElrSGLUJKShNGnt
wpxFFafRr0h5O9KBHxO/f/L48ZkZ+ykNjh/tPzymgDCPN3Oc6xw8Eoz56PT8
0fmTp6fnMhV+wZOZb/afcV40ZThljLIA4AjwHpKu8AyFSpVmRPH+0zyoevSl
aUSHfFNbJNBOUiefyXNCwBXC+P9oqu4ktdZkrnazXmcbxkc4hN/G2XwEF3Ka
krSlUDZ2Z3nsX1i+6kNUuSvkbS0aCjyXIFuAwtKfgi4MKVclUlLzxVgStD0e
CAo/UU8RW8nVislFM2ZX3sAcuBkukVTnORkinAninEmlM9FJdEdmr4ysn3bY
dM5yiB2Pt7jnzJOz+eTc+Yl1n9fNJOfIED20FvBtxLISowBB5CbdqMMHBFuG
b2BOIUdFAC4grMC68I1DOkO0xk7SWuIxMzK+4RcYfIFnu443gGszega9mFkS
l0dDK7Yhn0RIP02Oj2VdlxTpTxoEJeUtEz/8SlHS5LT1LVEzruPSEckD1Pcs
oAD7Xv8ebxDOLHjo1HvM3LCJY/g5xAoO0SkNcXa05y37RfQmiTnr8y9JWcg5
o2fbntBYniTpmJlGYBNiddBygIjMbCc0b96FfkQbO55nkhKYmEx2zW62azzO
BCDNPuPpRULu4J14H4RlVga0QoTR36oWN8fh1ZliZ582wQU0J4FwB/XdMnbn
O70zbCG6zhxbECKgurc+dbXz0cMvmdxIzgFS1far1799//2bl+7L34LYGN+K
So6xzU3NgZkZpSvAR0kunmAVd00CB9BW8sGkmCyNw6WSUd+vjCr2tmijLJDs
cbK0Ye82eiG+4xLakbcA3bXgBkkLxvg+fjR2DfB9RyIX2r3PaJBaAEE3z2B4
12pdb1ycao3HMTNlQvkpsVpD8frj0BKyScTqyxdY/zte/ktQ5KkMiFAz57tr
DpxLk0ocUvOmJE7nlE/AQC4LC7n6ZAGWSKxtAjrH56lRY4fPW8L0JH2mHdGo
NjobRrc1LcRExYyNM4rpFdO0tSYe9wR6DW1kDTyN9LWK52SQwQMg9Q7PADZT
IFiueSndkWO6kmGUiMmE75XVg51EaEc85TIhnzWHiMNEOZgurcnNqdmqYrRF
JjkVXRYdGxoejB5AL3eWBSOJVfb0PmDl5SzJd+bUIJqZTCfMsEOblBhrp5to
gQ7TiRMH1NauQnmQXa+vAy3U6tUAUyfX1Nh9xQbGueXIQqRaApKexbKGj+7i
ciahohQ5EmyYQqFKlFbYjp6jyYDzcbeiK1etgIWLXc2EAtE2nXikm4JNFLNk
gT5LFokw9TuagzZeGP8ejSBpveEYTuCfulX4ylJeA3k+JAZ1Z5QHCqgkOHJg
1XjwHu/8XYpOVA2yajlZjH9lR0SVQQl7fSXZfyglEJTDE8ZQCmVxFx7JFMCo
tMbkJwIYDUq27A361E1hntnld0ptWhijjObajahKUJmQPd4EQfWEhgliaZ7s
lNkXuX5eBjYZKYDhyJ5DsQSsTaooeg89CV3NhmIa7RN6yVmKMoml1UNk6g7n
UWuGcB4TgcmMR3iOsfIZnlMpd+GcqGCjtAE0aRnyMiVDEwW+g1wAOlJgVyLK
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
z+6jrMzVhvEPKCt7i8PO4wZtBv8HkONJz+MTAQA=

-->

</rfc>
