<?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.5 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mcnally-deterministic-cbor-11" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.1 -->
  <front>
    <title abbrev="dCBOR">dCBOR: A Deterministic CBOR Application Profile</title>
    <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-11"/>
    <author initials="W." surname="McNally" fullname="Wolf McNally">
      <organization>Blockchain Commons</organization>
      <address>
        <email>wolf@wolfmcnally.com</email>
      </address>
    </author>
    <author initials="C." surname="Allen" fullname="Christopher Allen">
      <organization>Blockchain Commons</organization>
      <address>
        <email>christophera@lifewithalacrity.com</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <author initials="L." surname="Lundblade" fullname="Laurence Lundblade">
      <organization>Security Theory LLC</organization>
      <address>
        <email>lgl@securitytheory.com</email>
      </address>
    </author>
    <date year="2024" month="August" day="07"/>
    <area>Applications and Real-Time</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 83?>

<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 CBOR Common Deterministic Encoding (CDE) Internet Draft builds on this by specifying a baseline for application profiles that wish to implement deterministic encoding with CBOR. The present document provides an application profile "dCBOR" that can be used to help achieve interoperable deterministic encoding based on CDE for a variety of applications wishing an even narrower and clearly defined set of choices.</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-mcnally-deterministic-cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/BlockchainCommons/WIPs-IETF-draft-deterministic-cbor"/>.</t>
    </note>
  </front>
  <middle>
    <?line 87?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>CBOR <xref target="RFC8949"/> has many advantages over other data serialization formats. One of its strengths is specifications and guidelines for serializing data deterministically, such that multiple agents serializing the same data automatically achieve consensus on the exact byte-level form of that serialized data. This is particularly useful when data must be compared for semantic equivalence by comparing the hash of its contents.</t>
      <t>Nonetheless, determinism is an opt-in feature of CBOR, and most existing CBOR codecs put the primary burden of correct deterministic serialization and validation of deterministic encoding during deserialization on the engineer. Furthermore, the specification leaves a number of important decisions around determinism up to the application developer. The CBOR Common Deterministic Encoding (CDE) Internet Draft <xref target="CDE"/> builds on the basic CBOR specification by providing a baseline for application profiles that wish to implement deterministic encoding with CBOR.</t>
      <t>This document narrows CDE further into a set of requirements for the application profile "dCBOR". These requirements include but go beyond CDE, including requiring that dCBOR decoders validate that encoded CDE conforms to the requirements of this document.</t>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</section>
    </section>
    <section anchor="application-profile">
      <name>Application Profile</name>
      <t>The dCBOR Application Profile specifies the use of Deterministic Encoding as defined in <xref target="CDE"/> and adds several exclusions and reductions specified in this section.</t>
      <t>Just as CDE does not "fork" CBOR, the rules specified here do not "fork" CDE: A dCBOR implementation produces well-formed, deterministically encoded CDE according to <xref target="CDE"/>, and existing CBOR or CDE decoders will therefore be able to decode it. Similarly, CBOR or CDE encoders will be able to produce valid dCBOR if handed dCBOR conforming data model level information from an application.</t>
      <t>Note that the separation between standard CBOR or CDE processing and the processing required by the dCBOR application profile is a conceptual one: Both dCBOR processing and standard CDE/CBOR processing may be combined into a unified dCBOR/CDE/CBOR codec. The requirements in this document apply to encoding or decoding of dCBOR data, regardless of whether the codec is a unified dCBOR/CDE/CBOR codec operating in dCBOR-compliant modes, or a single-purpose dCBOR codec. Both of these are generically referred to as "dCBOR codecs" in this document.</t>
      <t>This application profile is intended to be used in conjunction with an application, which typically will use a subset of CDE/CBOR, which in turn influences which subset of the application profile is used. As a result, this application profile places no direct requirement on what subset of CDE/CBOR is implemented. For instance, there is no requirement that dCBOR implementations support floating point numbers (or any other kind of non-basic integer type, such as arbitrary precision integers or complex numbers) when they are used with applications that do not use them. However, this document does place requirements on dCBOR implementations that support negative 64-bit integers and 64-bit or smaller floating point numbers.</t>
      <section anchor="common-deterministic-encoding-conformance">
        <name>Common Deterministic Encoding Conformance</name>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit CBOR conforming "CBOR Common Deterministic Encoding (CDE)" <xref target="CDE"/>, including mandated preferred encoding of integers and floating point numbers and the lexicographic ordering of map keys.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> validate that encoded CBOR conforms to the requirements of <xref target="CDE"/>.</li>
        </ol>
      </section>
      <section anchor="duplicate-map-keys">
        <name>Duplicate Map Keys</name>
        <t>CBOR <xref target="RFC8949"/> defines maps with duplicate keys as invalid, but leaves how to handle such cases to the implementor (§2.2, §3.1, §5.4, §5.6). <xref target="CDE"/> provides no additional mandates on this issue.</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST NOT</bcp14> emit CBOR maps that contain duplicate keys.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reject encoded maps with duplicate keys.</li>
        </ol>
      </section>
      <section anchor="numeric-reduction">
        <name>Numeric Reduction</name>
        <t>The purpose of determinism is to ensure that semantically equivalent data items are encoded into identical byte streams. Numeric reduction ensures that semantically equal numeric values (e.g. <tt>2</tt> and <tt>2.0</tt>) are encoded into identical byte streams (e.g. <tt>0x02</tt>) by encoding "Integral floating point values" (floating point values with a zero fractional part) as integers when possible.</t>
        <t>dCBOR implementations that support floating point numbers:</t>
        <ol spacing="normal" type="1"><li>
            <t><bcp14>MUST</bcp14> check whether floating point values to be encoded have the numerically equal value in <tt>DCBOR_INT</tt> = [-2<sup>63</sup>, 2<sup>64</sup>-1]. If that is the case, it <bcp14>MUST</bcp14> be converted to that numerically equal integer value before encoding it. (Preferred encoding will then ensure the shortest length encoding is used.) If a floating point value has a non-zero fractional part, or an exponent that takes it out of <tt>DCBOR_INT</tt>, the original floating point value is used for encoding. (Specifically, conversion to a CBOR bignum is never considered.)  </t>
            <t>
This also means that the three representations of a zero number in CBOR (<tt>0</tt>, <tt>0.0</tt>, <tt>-0.0</tt> in diagnostic notation) are all reduced to the basic integer <tt>0</tt> (with preferred encoding <tt>0x00</tt>).</t>
          </li>
        </ol>
        <aside>
          <t>Note that numeric reduction means that some maps that are valid CDE/CBOR cannot be reduced to valid dCBOR maps, as numeric reduction can result in multiple entries with the same keys ("duplicate keys"). For example, the following is a valid CBOR/CDE map:</t>
          <figure>
            <name>Valid CBOR data item with numeric map keys (also valid CDE)</name>
            <sourcecode type="cbor-diag"><![CDATA[
{
   10: "ten",
   10.0: "floating ten"
}
]]></sourcecode>
          </figure>
          <t>Applying numeric reduction to this map would yield the invalid map:</t>
          <figure>
            <name>Numeric reduction turns valid CBOR invalid</name>
            <sourcecode type="cbor-diag"><![CDATA[
{  / invalid: multiple entries with the same key /
   10: "ten",
   10: "floating ten"
}
]]></sourcecode>
          </figure>
          <t>In general, dCBOR applications need to avoid maps that have entries with keys that are semantically equivalent in dCBOR's numeric model.</t>
        </aside>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reduce all encoded NaN values to the quiet NaN value having the half-width CBOR representation <tt>0xf97e00</tt>.</li>
        </ol>
        <t>dCBOR decoders that support floating point numbers:</t>
        <ol spacing="normal" type="1" start="3"><li>
            <bcp14>MUST</bcp14> reject any encoded floating point values that are not encoded according to the above rules.</li>
        </ol>
      </section>
      <section anchor="simple-values">
        <name>Simple Values</name>
        <t>Only the three "simple" (major type 7) values <tt>false</tt> (0xf4), <tt>true</tt> (0xf5), and <tt>null</tt> (0xf6) and the floating point values are valid in dCBOR.</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST NOT</bcp14> encode major type 7 values other than <tt>false</tt>, <tt>true</tt>, <tt>null</tt>, and the floating point values.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reject any encoded major type 7 values other than <tt>false</tt>, <tt>true</tt>, <tt>null</tt>, and the floating point values.</li>
        </ol>
      </section>
      <section anchor="strings">
        <name>Strings</name>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit text strings that are in Unicode Normalization Form C (NFC) <xref target="UNICODE-NORM"/>.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> reject any encoded text strings that are not in NFC.</li>
        </ol>
      </section>
    </section>
    <section anchor="cddl-support-declarative-tag">
      <name>CDDL support, Declarative Tag</name>
      <t>Similar to the CDDL <xref target="RFC8610"/> support in CDE <xref target="CDE"/>, this specification adds two CDDL control operators that can be used to specify that the data items should be encoded in CBOR Common Deterministic Encoding (CDE), with the dCBOR application profile applied as well.</t>
      <t>The control operators <tt>.dcbor</tt> and <tt>.dcborseq</tt> are exactly like <tt>.cde</tt> and <tt>.cdeseq</tt> except that they also require the encoded data item(s) to conform to the dCBOR application profile.</t>
      <t>Tag 201 (<xref target="tag201"/>) is defined in this specification as a way to declare its tag
content to conform to the dCBOR application profile at the data model level.
As a result, when this data item is encoded using CDE rules, the encoded
result will conform to dCBOR also at the encoded data item level.
(In conjunction with this semantics, tag 201 may also be employed as a
boundary marker leading from an overall structure to specific
application data items; see <xref section="3" sectionFormat="of" target="GordianEnvelope"/> for an
example for this usage.)</t>
    </section>
    <section removeInRFC="true" anchor="implementation-status">
      <name>Implementation Status</name>
      <t>(Boilerplate as per <xref section="2.1" sectionFormat="of" target="RFC7942"/>:)</t>
      <t>This section records the status of known implementations of the
protocol defined by this specification at the time of posting of
this Internet-Draft, and is based on a proposal described in
<xref target="RFC7942"/>.  The description of implementations in this section is
intended to assist the IETF in its decision processes in
progressing drafts to RFCs.  Please note that the listing of any
individual implementation here does not imply endorsement by the
IETF.  Furthermore, no effort has been spent to verify the
information presented here that was supplied by IETF contributors.
This is not intended as, and must not be construed to be, a
catalog of available implementations or their features.  Readers
are advised to note that other implementations may exist.</t>
      <t>According to <xref target="RFC7942"/>, "this will allow reviewers and working
groups to assign due consideration to documents that have the
benefit of running code, which may serve as evidence of valuable
experimentation and feedback that have made the implemented
protocols more mature.  It is up to the individual working groups
to use this information as they see fit".
<?line -22?>
      </t>
      <section anchor="swift">
        <name>Swift</name>
        <ul spacing="normal">
          <li>Description: Single-purpose dCBOR reference implementation for Swift.</li>
          <li>Organization: Blockchain Commons</li>
          <li>Implementation Location: <xref target="BCSwiftDCBOR"/></li>
          <li>Primary Maintainer: Wolf McNally</li>
          <li>Languages: Swift</li>
          <li>Coverage: Complete</li>
          <li>Testing: Unit tests</li>
          <li>Licensing: BSD-2-Clause-Patent</li>
        </ul>
      </section>
      <section anchor="rust">
        <name>Rust</name>
        <ul spacing="normal">
          <li>Description: Single-purpose dCBOR reference implementation for Rust.</li>
          <li>Organization: Blockchain Commons</li>
          <li>Implementation Location: <xref target="BCRustDCBOR"/></li>
          <li>Primary Maintainer: Wolf McNally</li>
          <li>Languages: Rust</li>
          <li>Coverage: Complete</li>
          <li>Testing: Unit tests</li>
          <li>Licensing: BSD-2-Clause-Patent</li>
        </ul>
      </section>
      <section anchor="typescript">
        <name>TypeScript</name>
        <ul spacing="normal">
          <li>Description: Single-purpose dCBOR reference implementation for TypeScript.</li>
          <li>Organization: Blockchain Commons</li>
          <li>Implementation Location: <xref target="BCTypescriptDCBOR"/></li>
          <li>Primary Maintainer: Wolf McNally</li>
          <li>Languages: TypeScript (transpiles to JavaScript)</li>
          <li>Coverage: Complete</li>
          <li>Testing: Unit tests</li>
          <li>Licensing: BSD-2-Clause-Patent</li>
        </ul>
      </section>
      <section anchor="ruby">
        <name>Ruby</name>
        <ul spacing="normal">
          <li>Implementation Location: <xref target="cbor-dcbor"/></li>
          <li>Primary Maintainer: Carsten Bormann</li>
          <li>Languages: Ruby</li>
          <li>Coverage: Complete specification; complemented by CBOR encoder/decoder and command line interface from <xref target="cbor-diag"/> and deterministic encoding from <xref target="cbor-deterministic"/>. Checking of dCBOR - exclusions not yet implemented.</li>
          <li>Testing: Also available at https://cbor.me</li>
          <li>Licensing: Apache-2.0</li>
        </ul>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document inherits the security considerations of CBOR <xref target="RFC8949"/>.</t>
      <t>Vulnerabilities regarding dCBOR will revolve around whether an attacker can find value in producing semantically equivalent documents that are nonetheless serialized into non-identical byte streams. Such documents could be used to contain malicious payloads or exfiltrate sensitive data. The ability to create such documents could indicate the failure of a dCBOR decoder to correctly validate according to this document, or the failure of the developer to properly specify or implement application protocol requirements using dCBOR. Whether these possibilities present an identifiable attack surface is a question that developers should consider.</t>
    </section>
    <section anchor="tag201">
      <name>IANA Considerations</name>
      <t>RFC Editor: please replace RFCXXXX with the RFC number of this RFC and remove this note.</t>
      <t>IANA has registered the following CBOR tag in the "CBOR Tags" registry of <xref target="IANACBORTAGS"/>:</t>
      <table>
        <name>CBOR Tag for dCBOR</name>
        <thead>
          <tr>
            <th align="left">Tag</th>
            <th align="left">Data Item</th>
            <th align="left">Semantics</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">#201</td>
            <td align="left">(any)</td>
            <td align="left">enclosed dCBOR</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
      <t>This document requests IANA to register the contents of Table 1 into the registry "CDDL Control Operators" of <xref target="IANACDDL"/>:</t>
      <table>
        <name>CDDL Control Operators for dCBOR</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">.dcbor</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.dcborseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="appendix-a-dcbor-numeric-test-vectors">
      <name>Appendix A: dCBOR Numeric Test Vectors</name>
      <t>The following tables provide common and edge-case numeric test vectors for dCBOR encoders and decoders, and are intended to exercise the requirements of this specification.</t>
      <section anchor="dcbor-numeric-encodings">
        <name>dCBOR Numeric Encodings</name>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">dCBOR Encoding</th>
              <th align="left">Note</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">
                <tt>00</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">
                <tt>01</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">23</td>
              <td align="left">
                <tt>17</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">24</td>
              <td align="left">
                <tt>1818</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">255 (2<sup>8</sup> - 1)</td>
              <td align="left">
                <tt>18ff</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">65535 (2<sup>16</sup> - 1)</td>
              <td align="left">
                <tt>19ffff</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">65536 (2<sup>16</sup>)</td>
              <td align="left">
                <tt>1a00010000</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">4294967295 (2<sup>32</sup> - 1)</td>
              <td align="left">
                <tt>1affffffff</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">4294967296 (2<sup>32</sup>)</td>
              <td align="left">
                <tt>1b0000000100000000</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">18446744073709551615 (2<sup>64</sup> - 1)</td>
              <td align="left">
                <tt>1bffffffffffffffff</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">-1</td>
              <td align="left">
                <tt>20</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">-2</td>
              <td align="left">
                <tt>21</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">-127 (-2<sup>8</sup> - 1)</td>
              <td align="left">
                <tt>387e</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">-128 (-2<sup>7</sup>)</td>
              <td align="left">
                <tt>387f</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">-32768 (-2<sup>16</sup>)</td>
              <td align="left">
                <tt>397fff</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">-2147483648 (-2<sup>31</sup>)</td>
              <td align="left">
                <tt>3a7fffffff</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">-9223372036854775808  (-2<sup>63</sup>)</td>
              <td align="left">
                <tt>3b7fffffffffffffff</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">1.5</td>
              <td align="left">
                <tt>f93e00</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">2345678.25</td>
              <td align="left">
                <tt>fa4a0f2b39</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">1.2</td>
              <td align="left">
                <tt>fb3ff3333333333333</tt></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">42.0</td>
              <td align="left">
                <tt>182a</tt></td>
              <td align="left">Reduced.</td>
            </tr>
            <tr>
              <td align="left">2345678.0</td>
              <td align="left">
                <tt>1a0023cace</tt></td>
              <td align="left">Reduced.</td>
            </tr>
            <tr>
              <td align="left">-2345678.0</td>
              <td align="left">
                <tt>3a0023cacd</tt></td>
              <td align="left">Reduced.</td>
            </tr>
            <tr>
              <td align="left">-0.0</td>
              <td align="left">
                <tt>00</tt></td>
              <td align="left">Reduced.</td>
            </tr>
            <tr>
              <td align="left">5.960464477539063e-08</td>
              <td align="left">
                <tt>f90001</tt></td>
              <td align="left">Smallest half-precision subnormal.</td>
            </tr>
            <tr>
              <td align="left">1.401298464324817e-45</td>
              <td align="left">
                <tt>fa00000001</tt></td>
              <td align="left">Smallest single subnormal.</td>
            </tr>
            <tr>
              <td align="left">5e-324</td>
              <td align="left">
                <tt>fb0000000000000001</tt></td>
              <td align="left">Smallest double subnormal.</td>
            </tr>
            <tr>
              <td align="left">2.2250738585072014e-308</td>
              <td align="left">
                <tt>fb0010000000000000</tt></td>
              <td align="left">Smallest double normal.</td>
            </tr>
            <tr>
              <td align="left">6.103515625e-05</td>
              <td align="left">
                <tt>f90400</tt></td>
              <td align="left">Smallest half-precision normal.</td>
            </tr>
            <tr>
              <td align="left">65504.0</td>
              <td align="left">
                <tt>19ffe0</tt></td>
              <td align="left">Reduced. Largest possible half-precision.</td>
            </tr>
            <tr>
              <td align="left">33554430.0</td>
              <td align="left">
                <tt>1a01fffffe</tt></td>
              <td align="left">Reduced. Exponent 24 to test single exponent boundary.</td>
            </tr>
            <tr>
              <td align="left">-9223372036854774784.0</td>
              <td align="left">
                <tt>3b7ffffffffffffbff</tt></td>
              <td align="left">Reduced. Most negative double that converts to int64.</td>
            </tr>
            <tr>
              <td align="left">18446744073709550000.0</td>
              <td align="left">
                <tt>1bfffffffffffff800</tt></td>
              <td align="left">Reduced. Largest double that can convert to uint64, almost UINT64_MAX.</td>
            </tr>
            <tr>
              <td align="left">18446744073709552000.0</td>
              <td align="left">
                <tt>fa5f800000</tt></td>
              <td align="left">Just too large to convert to uint64, but converts to a single, just over UINT64_MAX.</td>
            </tr>
            <tr>
              <td align="left">-18446742974197924000.0</td>
              <td align="left">
                <tt>fadf7fffff</tt></td>
              <td align="left">Large negative that converts to float, but too large for int64.</td>
            </tr>
            <tr>
              <td align="left">3.4028234663852886e+38</td>
              <td align="left">
                <tt>fa7f7fffff</tt></td>
              <td align="left">Largest possible single.</td>
            </tr>
            <tr>
              <td align="left">3.402823466385289e+38</td>
              <td align="left">
                <tt>fb47efffffe0000001</tt></td>
              <td align="left">Slightly larger than largest possible single.</td>
            </tr>
            <tr>
              <td align="left">1.7976931348623157e+308</td>
              <td align="left">
                <tt>fb7fefffffffffffff</tt></td>
              <td align="left">Largest double.</td>
            </tr>
            <tr>
              <td align="left">Infinity (any size)</td>
              <td align="left">
                <tt>f97c00</tt></td>
              <td align="left">Canonicalized.</td>
            </tr>
            <tr>
              <td align="left">-Infinity (any size)</td>
              <td align="left">
                <tt>f9fc00</tt></td>
              <td align="left">Canonicalized.</td>
            </tr>
            <tr>
              <td align="left">NaN (any size, any payload)</td>
              <td align="left">
                <tt>f97e00</tt></td>
              <td align="left">Canonicalized.</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="invalid-dcbor-encodings">
        <name>Invalid dCBOR Encodings</name>
        <t>These are valid CBOR encodings that <bcp14>MUST</bcp14> be rejected as invalid by a dCBOR-compliant decoder.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">CBOR Encoding</th>
              <th align="left">Reason for Rejection</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">12.0</td>
              <td align="left">
                <tt>f94a00</tt></td>
              <td align="left">Can be reduced to 12.</td>
            </tr>
            <tr>
              <td align="left">1.5</td>
              <td align="left">
                <tt>fb3ff8000000000000</tt></td>
              <td align="left">Not preferred encoding.</td>
            </tr>
            <tr>
              <td align="left">-9223372036854775809 (-2<sup>63</sup> - 1)</td>
              <td align="left">
                <tt>3b8000000000000000</tt></td>
              <td align="left">65-bit negative integer value.</td>
            </tr>
            <tr>
              <td align="left">-18446744073709551616 (-2<sup>64</sup>)</td>
              <td align="left">
                <tt>3bffffffffffffffff</tt></td>
              <td align="left">65-bit negative integer value.</td>
            </tr>
            <tr>
              <td align="left">Infinity</td>
              <td align="left">
                <tt>fb7ff0000000000000</tt></td>
              <td align="left">Not preferred encoding.</td>
            </tr>
            <tr>
              <td align="left">Infinity</td>
              <td align="left">
                <tt>fa7f800000</tt></td>
              <td align="left">Not preferred encoding.</td>
            </tr>
            <tr>
              <td align="left">-Infinity</td>
              <td align="left">
                <tt>fbfff0000000000000</tt></td>
              <td align="left">Not preferred encoding.</td>
            </tr>
            <tr>
              <td align="left">-Infinity</td>
              <td align="left">
                <tt>faff800000</tt></td>
              <td align="left">Not preferred encoding.</td>
            </tr>
            <tr>
              <td align="left">NaN</td>
              <td align="left">
                <tt>fb7ff9100000000001</tt></td>
              <td align="left">Not canonical NaN.</td>
            </tr>
            <tr>
              <td align="left">NaN</td>
              <td align="left">
                <tt>faffc00001</tt></td>
              <td align="left">Not canonical NaN.</td>
            </tr>
            <tr>
              <td align="left">NaN</td>
              <td align="left">
                <tt>f97e01</tt></td>
              <td align="left">Not canonical NaN.</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="CDE">
          <front>
            <title>CBOR Common Deterministic Encoding (CDE)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="25" month="July" year="2024"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2, providing some flexibility for application specific
   decisions.  To facilitate Deterministic Encoding to be offered as a
   selectable feature of generic encoders, the present document defines
   a CBOR Common Deterministic Encoding (CDE) Profile that can be shared
   by a large set of applications with potentially diverging detailed
   requirements.  It also defines "Basic Serialization", which stops
   short of the potentially more onerous requirements that make CDE
   fully deterministic, while employing most of its reductions of the
   variability needing to be handled by decoders.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-05"/>
        </reference>
        <reference anchor="IANACDDL" target="https://www.iana.org/assignments/cddl">
          <front>
            <title>Concise Data Definition Language (CDDL)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANACBORTAGS" target="https://www.iana.org/assignments/cbor-tags">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="UNICODE-NORM" target="https://unicode.org/reports/tr15/">
          <front>
            <title>Unicode Normalization Forms</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="BCSwiftDCBOR" target="https://github.com/BlockchainCommons/BCSwiftDCBOR">
          <front>
            <title>Deterministic CBOR (dCBOR) for Swift.</title>
            <author initials="W." surname="McNally" fullname="Wolf McNally">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BCRustDCBOR" target="https://github.com/BlockchainCommons/bc-dcbor-rust">
          <front>
            <title>Deterministic CBOR (dCBOR) for Rust.</title>
            <author initials="W." surname="McNally" fullname="Wolf McNally">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BCTypescriptDCBOR" target="https://github.com/BlockchainCommons/bc-dcbor-ts">
          <front>
            <title>Deterministic CBOR (dCBOR) for Typescript.</title>
            <author initials="W." surname="McNally" fullname="Wolf McNally">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="GordianEnvelope">
          <front>
            <title>The Gordian Envelope Structured Data Format</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>
            <date day="31" month="March" year="2024"/>
            <abstract>
              <t>   Gordian Envelope specifies a structured format for hierarchical
   binary data focused on the ability to transmit it in a privacy-
   focused way, offering support for privacy as described in RFC 6973
   and human rights as described in RFC 8280.  Envelopes are designed to
   facilitate "smart documents" and have a number of unique features
   including: easy representation of a variety of semantic structures, a
   built-in Merkle-like digest tree, deterministic representation using
   CBOR, and the ability for the holder of a document to selectively
   elide specific parts of a document without invalidating the digest
   tree structure.  This document specifies the base Envelope format,
   which is designed to be extensible.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-envelope-07"/>
        </reference>
        <reference anchor="cbor-deterministic" target="https://github.com/cabo/cbor-deterministic">
          <front>
            <title>cbor-deterministic gem</title>
            <author initials="C." surname="Bormann" fullname="Carsten Bormann">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="cbor-diag" target="https://github.com/cabo/cbor-diag">
          <front>
            <title>CBOR diagnostic utilities</title>
            <author initials="C." surname="Bormann" fullname="Carsten Bormann">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="cbor-dcbor" target="https://github.com/cabo/cbor-dcbor">
          <front>
            <title>PoC of the McNally/Allen dCBOR application-level CBOR representation rules</title>
            <author initials="C." surname="Bormann" fullname="Carsten Bormann">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
      </references>
    </references>
    <?line 394?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors are grateful for the contributions of Joe Hildebrand and Anders Rundgren in the CBOR working group.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
