<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 2.7.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-serialization-01" 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-01"/>
    <author initials="L." surname="Lundblade" fullname="Laurence Lundblade">
      <organization>Security Theory LLC</organization>
      <address>
        <email>lgl@securitytheory.com</email>
      </address>
    </author>
    <date year="2025" month="December" day="05"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <keyword>cbor</keyword>
    <abstract>
      <?line 96?>

<t>This document defines two CBOR serializations: "ordinary serialization" and "deterministic serialization."
It also introduces the term "general serialization" to name the full, variable set of serialization options defined in <xref target="STD94"/>.
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 105?>

<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>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.
Ordinary serialization is defined here is largely the same preferred serialization without indefinite-lengths, so it is largely interchangeable with what is commonly implemented.</t>
    </section>
    <section anchor="general-serialization">
      <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>Any length floating point regardless of value (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>
      <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.
It is similar for other CBOR-based protocols like <xref target="RFC9052"/>.
See also <xref target="OrdinarySerialization"/>.</t>
      <t>Note also that there is no shortest-length requirement for floating-point encoding in general serialization.
Thus, IEEE 754 NaNs (See <xref target="NaN"/>) may be encoded with a desired size, regardless of their payload — a principle sometimes stated as “touch not the NaNs.”</t>
      <t>Finally, note also that general serialization is inherently non-deterministic because some CBOR data items can be serialized in multiple ways.</t>
    </section>
    <section anchor="OrdinarySerialization">
      <name>Ordinary Serialization</name>
      <t>This section defines a serialization named "ordinary serialization."</t>
      <section anchor="OrdinaryEncoding">
        <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="OrdinaryDecoding">
        <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 SHOULD be ignored.</t>
              </li>
              <li>
                <t>An empty string SHOULD be accepted and treated as the value zero.</t>
              </li>
            </ul>
          </li>
        </ol>
      </section>
      <section anchor="when-to-use-ordinary-serialization">
        <name>When to use ordinary serialization</name>
        <t>The purpose of ordinary 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>Ordinary 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 ordinary serialization the best choice for most CBOR protocols.
To some degree it is a de facto standard for common CBOR protocols.</t>
        <t>However, it is not suitable if determinism is needed because the order of items in a map is allowed to vary.
See <xref target="WhenDeterministic"/>.</t>
        <t>It may also not be suitable in some cases where special functionality is needed like the following:</t>
        <ul spacing="normal">
          <li>
            <t>Streaming of of strings, arrays and maps in constrained environments where the length is not known</t>
          </li>
          <li>
            <t>Non-trival NaNs need to be supported</t>
          </li>
          <li>
            <t>Hardware environments where integers are encoded/decoded directly from/to hardware registers and shortest-length CBOR arguments would be burdensome</t>
          </li>
        </ul>
        <t>In those cases, a special/custom serialization can be defined.</t>
        <t>But, for the vast majority of use cases, ordinary serialization provides interoperaibility, small encoded size and low implementation costs.</t>
      </section>
      <section anchor="RelationToPreferred">
        <name>Relation To Preferred Serialization</name>
        <t>Ordinary 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>
        </ul>
        <t>These differences are not of significance in real-world implementations, so ordinary serialization is already largely supported.</t>
        <t>In <xref section="3" sectionFormat="of" target="STD94"/> it 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 until many 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 ordinary 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="OrdinarySerialization"/> and <xref target="NaN"/> for details on and 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 ordinary serialization (<xref target="OrdinarySerialization"/>), 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 ordinary serialization defined in <xref target="OrdinaryEncoding"/> 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"/>.</t>
          </li>
        </ol>
      </section>
      <section anchor="DeterministicDecoding">
        <name>Decoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Decoders MUST meet the decoder requirements for <xref target="OrdinaryDecoding"/>.
That is, deterministic encoding imposes no requirements over and above the requirements for decoding ordinary serialization.</t>
          </li>
        </ol>
      </section>
      <section anchor="WhenDeterministic">
        <name>When to use Deterministic Serialization</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 the data was produced using deterministic serialization.
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>
        <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 along 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>The only difference between ordinary and deterministic serialization is map key sorting.
Sorting can be expensive in very constrained environments.
This is the only reason these two are not combined into one.</t>
        <t>Deterministically encoded data is always decodable, even by receivers that do not specifically support deterministic encoding.
Deterministic encoding can be helpful for debugging and such.
In environments where map sorting is not costly, it is acceptable and beneficial to always use it.
In such an environment, a CBOR encoder may produce deterministic encoding by default and may even omit support for ordinary encoding entirely.
But note that determinstic is never a substitue for general serialization where uses cases may require indefinite lengths, separate big numbers from integers in the data model, need non-trivial NaNs or other.</t>
      </section>
    </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">.ord</td>
            <td align="left">Use ordinary serialization for a data item</td>
          </tr>
          <tr>
            <td align="left">.ordseq</td>
            <td align="left">Use ordinary serialization for a CBOR sequence</td>
          </tr>
          <tr>
            <td align="left">.det</td>
            <td align="left">Use deterministic serialization for a data item</td>
          </tr>
          <tr>
            <td align="left">.detseq</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 ordinary 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 .det 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">.ord</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.ordseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.det</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.detseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
    </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>
      </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>
      </references>
    </references>
    <?line 362?>

<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"> </td>
            <td align="left">CDDL</td>
            <td align="left">CBOR</td>
          </tr>
          <tr>
            <td align="left">Implementation Representation</td>
            <td align="left"> </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><cref anchor="rfced">RFC Editor:</cref> Please remove above sentence before publication</t>
      <t>In addition to <xref target="DeterministicSerialization"/> and <xref target="Tags"/>, 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 dCBOR.</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="Tags">
      <name>Deterministic Encoding for Popular Tags</name>
      <t>The definitions of the following tags in <xref target="RFC8610"/> allow variation in the data mode, thus it is useful to define a deterministic encoding for them should a particular deterministic protocol need one.
The tags defined in <xref target="RFC8610"/> but not mentioned here have no variability in their data model.</t>
      <section anchor="date-strings-tag-0">
        <name>Date Strings, Tag 0</name>
        <t>TODO -- complete this work and remove this comment before publication</t>
      </section>
      <section anchor="epoch-date-tag-1">
        <name>Epoch Date, Tag 1</name>
        <section anchor="encoder-requirements">
          <name>Encoder Requirements</name>
          <t>If the encoder supports floating-point dates, it MUST use the integer representation unless one of the following applies: (1) the date is outside the range representable by a 64-bit integer of major type 0 or 1, or (2) the date has a non-zero fraction of a second. In either case, the floating-point representation MUST be used.</t>
        </section>
        <section anchor="decoder-requirements">
          <name>Decoder Requirements</name>
          <t>If the decoder supports floating-point dates, it MUST be able to decode both the integer and the floating-point representations.</t>
        </section>
      </section>
      <section anchor="big-numbers-tags-2-and-3">
        <name>Big Numbers, Tags 2 and 3</name>
        <t>See <xref target="OrdinarySerialization"/>.</t>
      </section>
      <section anchor="big-floats-and-decimal-fractions-tags-4-and-5">
        <name>Big Floats and Decimal Fractions, Tags 4 and 5</name>
        <section anchor="encoder-requirements-1">
          <name>Encoder Requirements</name>
          <t>The mantissa MUST be encoded in the preferred serialization form specified in Section 3.4.3 of RFC 8949.</t>
          <t>The mantissa MUST NOT contain trailing zeros.
For example, the decimal fraction with value 10 must be encoded with a mantissa of 1 and an exponent of 1.
For big floats, the mantissa must not include any trailing zero bits if encoded as a type 0 or 1 integer, and no trailing zero bytes if encoded as a big number</t>
        </section>
        <section anchor="decoder-requirements-1">
          <name>Decoder Requirements</name>
          <t>Both the integer and big number forms of the mantissa MUST be decoded.</t>
        </section>
      </section>
    </section>
    <section anchor="NaN">
      <name>IEEE 754 NaN</name>
      <t>This section provides background information on <xref target="IEEE754"/> NaN (Not a Number) and its use in CBOR.</t>
      <section anchor="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, Pyhton 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>Ordinary 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-std94">
        <name>Clarification of <xref target="STD94"/></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>Orindary and deterministic serialization defined in this document diverge from the preferred serialization requirement in <xref target="STD94"/> for shortest-length encoding of NaNs:</t>
        <ul spacing="normal">
          <li>
            <t>Ordinary serialization: Non-trivial NaNs are not allowed.
While ordinary serialization largely aligns with preferred serialization, it does not in the case of non-trivial NaNs.</t>
          </li>
          <li>
            <t>Deterministic serialization: Because deterministic serialization inherits from ordinary serialization, it also does not allow non-trivial NaNs.
This is the single aspect of deterministic serialization that is different from <xref section="4.2.1" sectionFormat="of" target="STD94"/>.</t>
          </li>
        </ul>
        <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>Implementing preferred serialization for non-trivial NaNs is complex and error-prone; many CBOR implementations don't support it or don't support it 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 ordinary 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 ordinary and deterministic serialization, they are theoretically supported by <xref target="STD94"/>.
General serialization does support them.</t>
        <t>New protocol designs can — and generally should—avoid non — 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="serialization-checking">
      <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 ordinary 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"/>.</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="examples-and-test-vectors">
      <name>Examples and Test Vectors</name>
      <t>TODO -- complete work and remove this comment before publication</t>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="R." surname="Mahy" fullname="Rohan Mahy">
        <organization>Rohan Mahy Consulting Services</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>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7V96ZIb15XmfzxFBhkxzbIBsKpISibVdqu4yKaDIhmsktXd
nm73BXABpJjIhHOpIkzJoYfoPx3R/W/eZN5ETzLnfOfcLTNRosMxFQqxKpe7
nHv2LWez2eT6SfZgMmnztrBPsmdP37zLLm2dmyL/i2nzqsxMucqe29bWu7zM
m93ELBa1vR57dLKqlqXZ0TCr2qzbWW7b9Wy5qOpZEz82K0xrm3ayNO2TrGlX
k8mKLjyZLKuysWXTNU+ytu7spGlra3ZPspcvrr6a5Psal5v2/PT08en5xNDN
J1l252K/L/IlBm6w1nfWFLOrfGfvTG6q+v2mrrq9rHby3h7o0upJxouaXNuy
o2kz+okf4r/bw5528S29npeb7Ld8F9d3Ji/k7S95c/Oq3uC6qZfbJ9mdbdvu
myf37/NjfCm/tnP33H2+cH9RVzeNvc8j3L8jU+fttlvQywDUzeb+rbC7M6Ef
07Xbqn4ymWV5ScB6Nc9edeVqUZiVpSHlBF6Zrrbl0ia3aBlP6MiWXZ23h+xq
a6v6kL169YxuWdlasSm+bPSBFvfny2pHc9LhtHW+6FqZWCZ5V21NmX1ttgcZ
3JS6zPhW9oxOpitahiShy3W+tE2YsObnAKQvN3wF07nxf1/Z7Hd5sbKLmk42
vLSla9999yUts2EQl7b1r3xbFevs6+VrUxTDRT0tquX75dbkJS1qt6N1hTFv
6MUv+X87wmF6OVnIM1M3rS2zp1W9M+Vg3G9KWgatpf2//6fNntZ2R49e/evL
MPjSLKov27/kQBg36EW5opeyd3RAGzqr8LTBjXmtN3h/I8D5g1nlu+y3VUkb
qqvr8Po13yi7ZZFvtvGLk5JX39JSGenfffXs/Ozs8ZMJ/X559fzxQ1DCTGmD
fv31E37mV48fPp7I47/67OyUbq9WBV94+eLFi88fyVtZa+qNJWp2BJBbaz/s
i6pm/LcW+E/MoSPAtPd/9flnn52fP5YXhe3wYNllSxs39SpbV3X2VVEZRpnZ
2yov2+yCEHK7s22+FHpTCuDfZ4LWPAT+BjPJ1qZoLP5m+rFNXq4reT5zsxEf
oA3Mzk/PHuuN529ePsnOTudnZ6eP7/NTBJg535+7NfPGL15fzBkKBDoeNYIp
oPTg8TkhzLdXE73w+OHZgyf+j9NHfPfN5Qt35fPTh3II2bOri7fnukbHjouc
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
D2rr79L8lgAA

-->

</rfc>
