<?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-14" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.1 -->
  <front>
    <title abbrev="dCBOR">dCBOR: Deterministic CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-14"/>
    <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="2025" month="November" day="01"/>
    <area>Applications and Real-Time</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 86?>

<t>The purpose of determinism is to ensure that semantically equivalent data items are encoded into identical byte streams. CBOR (RFC 8949) defines "Deterministically Encoded CBOR" in its Section 4.2, but leaves some important choices up to the application developer. The present document specifies dCBOR, a set of narrowing rules for CBOR that can be used to help achieve interoperable deterministic encoding for a variety of applications desiring a narrow and clearly defined set of choices.</t>
    </abstract>
    <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 90?>

<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.</t>
      <t>This document narrows CBOR to a set of requirements called "dCBOR". These requirements include choices left open in CBOR, but also go beyond, including requiring that dCBOR decoders validate that encoded CBOR 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="narrowing-rules">
      <name>Narrowing Rules</name>
      <t>This section specifies the exclusions and reductions that dCBOR applies to CBOR.</t>
      <t>The rules specified here do not "fork" CBOR: A dCBOR implementation produces well-formed, deterministically encoded CBOR according to <xref target="RFC8949"/>, and existing CBOR decoders will therefore be able to decode it. Similarly, CBOR 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 processing and the processing required by the dCBOR rules is a conceptual one: Both dCBOR processing and standard CBOR processing may be combined into a unified dCBOR/CBOR codec. The requirements in this document apply to encoding or decoding of dCBOR data, regardless of whether the codec is a unified dCBOR/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>dCBOR is intended to be used in conjunction with an application, which typically will use a subset of CBOR, which in turn influences which subset of dCBOR that is used. As a result, dCBOR places no direct requirement on what subset of 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="definite-length-items">
        <name>Definite Length Items</name>
        <t>CBOR <xref target="RFC8949"/> allows both "definite-length" and "indefinite-length" items for byte strings, text strings, arrays, and maps (§3.2).</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit "definite-length" items for byte strings, text strings, arrays, and maps.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reject any encoded "indefinite-length" items for byte strings, text strings, arrays, and maps.</li>
        </ol>
      </section>
      <section anchor="preferred-serialization">
        <name>Preferred Serialization</name>
        <t>CBOR <xref target="RFC8949"/> allows multiple possible encodings for the same data item, and defines a "preferred serialization" in §4.1 to be used for deterministic encoding.</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit "preferred serialization".</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> validate that encoded CBOR conforms to "preferred serialization", and reject any encoded CBOR that does not conform.</li>
        </ol>
      </section>
      <section anchor="ordered-map-keys">
        <name>Ordered Map Keys</name>
        <t>The last bullet item of CBOR <xref target="RFC8949"/> §4.2.1 defines a "bytewise lexicographic order" for map keys to be used for deterministic encoding.</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit CBOR maps with keys in "bytewise lexicographic order".</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> validate that encoded CBOR maps have keys in "bytewise lexicographic order", and reject any encoded maps that do not conform.</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).</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 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 map:</t>
          <figure>
            <name>Valid CBOR data item with numeric map keys</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>CBOR <xref target="RFC8949"/> allows text strings to be any valid UTF-8 string (§3.1). However, Unicode character sequences can represent the same text string in different ways, leading to variability in the encoding of semantically equivalent data items. Unicode Normalization Form C (NFC) <xref target="UNICODE-NORM"/> is a commonly used normalization form that eliminates such variability.</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit text strings that are in NFC.</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>CDDL <xref target="RFC8610"/> is a widely used language for specifying CBOR data models. This specification adds two CDDL control operators that can be used to specify that the data items should be encoded in dCBOR.</t>
      <t>The control operators <tt>.dcbor</tt> and <tt>.dcborseq</tt> are exactly like <tt>.cbor</tt> and <tt>.cborseq</tt> as defined in <xref target="RFC8610"/> except that they also require the encoded data item(s) to conform to dCBOR.</t>
      <t>Tag 201 (<xref target="tag201"/>) is defined in this specification as a way to declare its tag content to conform to dCBOR at the data model level and the encoded data item level. (In conjunction with these 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>
    <section anchor="appendix-b-design-principles">
      <name>Appendix B: Design Principles</name>
      <t>This section is non-normative.</t>
      <t>dCBOR has a single overriding goal: to facilitate <em>determinism</em>.</t>
      <t>This means to ensure or facilitate, as much as possible, that semantically equivalent data items are encoded as identical byte streams.</t>
      <t>In general, this means reducing or eliminating <em>variability</em> in the encoding of data items. Variability arises where more than one valid encoding is possible for a given data item, and a protocol designer must make a choice as to which encoding to use. These choices can be arbitrary, and different protocol designers may make different arbitrary, and equally valid choices.</t>
      <t>One of the most common examples of this arises with typed numeric values, where a numeric field must be pre-assigned a type (e.g., signed or unsigned integer of 8, 16, 32, or 64 bits, floating point of 16, 32, or 64 bits, etc.) CBOR's basic numeric data model is typed, and requires that numeric values be encoded according to their type. This is a cognitive burden on protocol designers, and a source of variability, since there may be several ways to encode a given numeric value depending on the type assigned to it. Many developers would prefer to encode numeric values without worrying about types, and let the encoding format handle the details, including ensuring deterministic encoding.</t>
      <t>While dCBOR cannot automatically eliminate all variability in the design of deterministic protocols, it can provide a set of narrowing rules within its scope and level of abstraction that reduce the number of choices that protocol designers need to make.</t>
      <t>dCBOR makes no claim that these are the <em>only</em> or <em>best</em> possible narrowing rules for deterministic encoding for every application. But dCBOR does provide a set of well-defined, easy-to-understand, and easy-to-implement rules that can be deployed as a package to facilitate deterministic encoding for a wide variety of applications. Making these choices at the dCBOR level reduces cognitive burden for protocol designers, and decreases the risk of interoperability problems between different implementations.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Variability Source</th>
            <th align="left">dCBOR Rule</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Indefinite or definite length items</td>
            <td align="left">Only definite Length Items</td>
          </tr>
          <tr>
            <td align="left">Multiple possible encodings for same data item</td>
            <td align="left">Only preferred serialization</td>
          </tr>
          <tr>
            <td align="left">Different orders for map keys</td>
            <td align="left">Only ordered map Keys</td>
          </tr>
          <tr>
            <td align="left">Duplicate map keys</td>
            <td align="left">Duplicate Map Keys disallowed</td>
          </tr>
          <tr>
            <td align="left">Semantically equivalent numeric values (e.g., 0, 0.0, -0.0)</td>
            <td align="left">Only a single encoding for each distinct value</td>
          </tr>
          <tr>
            <td align="left">Choice of <tt>null</tt> or <tt>undefined</tt></td>
            <td align="left">Only <tt>null</tt></td>
          </tr>
          <tr>
            <td align="left">Simple values other than <tt>false</tt>, <tt>true</tt>, <tt>null</tt></td>
            <td align="left">Only <tt>false</tt>, <tt>true</tt>, <tt>null</tt></td>
          </tr>
          <tr>
            <td align="left">Nontrivial <tt>NaN</tt>s (sign, signaling, payloads)</td>
            <td align="left">Single <tt>NaN</tt></td>
          </tr>
          <tr>
            <td align="left">Equivalent strings with multiple Unicode representations</td>
            <td align="left">Only NFC text strings</td>
          </tr>
        </tbody>
      </table>
      <t>The sections below explain the rationale for some of these choices.</t>
      <section anchor="why-numeric-reduction">
        <name>Why Numeric Reduction?</name>
        <t>The numeric model of <xref target="RFC8949"/> provides three kinds of basic numeric types: unsigned integers (Major Type 0), negative integers (Major Type 1), and floating point numbers (shares major Type 7 with Simple Values). Not all applications require floating point values, and those that do not are unaffected by the presence of floating point numbers in the CBOR model. However, the RFC introduces the possibility of variability in certain places. For example, §3.4.2 defines Tag 1 as "Epoch-Based Date/Time":</t>
        <ul empty="true">
          <li>
            <t>Tag number 1 contains a numerical value counting the number of seconds from 1970-01-01T00:00Z in UTC time to the represented point in civil time.</t>
            <t>The tag content <bcp14>MUST</bcp14> be an unsigned or negative integer (major types 0 and 1) or a floating-point number (major type 7 with additional information 25, 26, or 27). Other contained types are invalid.</t>
          </li>
        </ul>
        <t>An inhabitant of Tag 1, as long as it represents an integral number of seconds since the epoch, could therefore be encoded as an integer <em>or</em> a floating point number. dCBOR's numeric reduction rule ensures that such values are always encoded as integers, eliminating variability in the encoding of such values.</t>
        <t>But this raises a larger policy question for determinism: If two numeric values are semantically equal, should they be encoded identically? dCBOR answers "yes" to this question, and numeric reduction is the mechanism by which this is achieved. This choice answers the determinism question in a way that is simple to understand and implement, and that works well for the vast majority of applications. The serialization is still typed, but the burden of choosing types is reduced for protocol designers, who can simply specify numeric fields without worrying about the details of how those numbers will be encoded.</t>
      </section>
      <section anchor="why-not-undefined">
        <name>Why Not <tt>undefined</tt>?</name>
        <t>How to represent an absent value is a perennial question in data modeling. In general it is useful to have a value that represents a placeholder for a position where a value <em>could</em> be present but is not. This could be used in a map to indicate that a key is bound but has no value, or in an array to indicate that a value at a particular index is absent. There are other sorts of absence as well, such as the absence of a key in a map. dCBOR cannot address all of these different notions of absence, but can and does address the lack of semantic clarity around the choice between <tt>null</tt> and <tt>undefined</tt> by choosing <tt>null</tt> as the sole representation of a placeholder for an absent value. <tt>null</tt> is widely used in data modeling, and has a clear and unambiguous meaning. In contrast, <tt>undefined</tt> is less commonly used, and its meaning can be ambiguous. By choosing <tt>null</tt>, dCBOR provides a single clear way to represent absent values, reducing variability.</t>
      </section>
      <section anchor="why-only-a-single-nan">
        <name>Why only a single <tt>NaN</tt>?</name>
        <t>How to represent the result of a computation like <tt>1.0 / 0.0</tt> is another perennial question in data modeling. The <xref target="IEEE754"/> floating point standard answers this question with the concept of "Not a Number" (<tt>NaN</tt>): a special value that represents an unrepresentable or undefined numerical result. However, the standard also specifies several bit fields within the <tt>NaN</tt> representation that can vary, including the sign bit, whether the <tt>NaN</tt> is "quiet" or "signaling", and a payload field. These formations are useful in certain computational contexts, but have no general meaning in data modeling.</t>
        <t>The problem of <tt>NaN</tt> is complicated by the fact that IEEE 754 specifies that all <tt>NaN</tt> values compare as "not equal" to all other numeric values, including themselves. This means that comparing any two <tt>NaN</tt> values, including identical ones, will always yield "not equal". The deeper problem this raises is that if you want to know what data a <tt>NaN</tt> might carry in its payload, you have to go to extraordinary lengths to extract that information, since you cannot simply compare two <tt>NaN</tt> values to determine whether they are the same.</t>
        <t>This not only raises deterministic variability issues (the array <tt>[1, NaN, 3]</tt> could be encoded in multiple ways depending on the <tt>NaN</tt> representation used), but also security issues as an attacker could use different <tt>NaN</tt> representations to exfiltrate data or hide malicious payloads, knowing that any comparison of <tt>NaN</tt> values will fail.</t>
        <t>Given that <tt>NaN</tt> has utility in general data modeling, but its specification complexities raise both determinism and security issues, dCBOR chooses to simplify the situation by requiring that all <tt>NaN</tt> values be encoded as the single quiet <tt>NaN</tt> value having the half-width CBOR representation <tt>0xf97e00</tt>.</t>
      </section>
      <section anchor="why-not-other-simple-values">
        <name>Why not other simple values?</name>
        <t><xref target="RFC8949"/> Major Type 7 defines a space of 256 code points for "simple values", and §3.3 defines four simple values and assigns them code points in the Major Type 7 space: <tt>false</tt> (20), <tt>true</tt> (21), <tt>null</tt> (22), and <tt>undefined</tt> (23). We have already discussed the choice of <tt>null</tt> over <tt>undefined</tt>. However, the remaining code points in this space are listed as either "unassigned" or "reserved" and delegates the registry of simple values to the IANA CBOR Simple Tags Registry <xref target="IANASIMPLEVALUES"/>, which lists no assigned values other than those four.</t>
        <t>The implication of this is that the semantics of these other simple values are officially undefined, and they cannot simply be used as application-defined values without risking interoperability issues. dCBOR therefore chooses to limit use of simple values to the three well-defined values <tt>false</tt>, <tt>true</tt>, and <tt>null</tt>, which are widely used in data modeling and have clear and unambiguous meanings.</t>
      </section>
      <section anchor="limiting-principles">
        <name>Limiting Principles</name>
        <t>A limiting principle of dCBOR is that it concerns itself with the most common data items used in CBOR applications. As a result, dCBOR does not place requirements on the encoding or decoding of CBOR data items that are less commonly used in practice, such as bignums, complex numbers, or other tagged data items. dCBOR implementations are not required to support these data items, but if they do, they must support them within the rules of dCBOR.</t>
        <t>Tags provide a useful "escape hatch" for applications that need to use data items not covered by dCBOR. For example, dCBOR applications can freely use Tag 2 or Tag 3 to encode bignums, which contain byte strings, and on which dCBOR places no restrictions beyond those that apply to all byte strings (definite length only). Similarly, the rare applications that need to convey nontrivial <tt>NaN</tt> values can use Tag 80, 81, or 82 as defined in the IANA CBOR Tags Registery <xref target="IANACBORTAGS"/>. These tags use byte strings to encode arrays of fixed-length IEEE 754 floating point values in big-endian byte order.</t>
      </section>
      <section anchor="why-not-define-an-api">
        <name>Why not define an API?</name>
        <t>Because dCBOR mandates strictness in both encoding and decoding, and because of mechanisms it introduces such as numeric reduction, the question arises as to whether this document should specify an API, or at least a set of best practices, for dCBOR codec APIs. The authors acknowledge that such guidance might be useful, but since the purpose of dCBOR is to provide a deterministic encoding format, and because APIs can vary widely between programming languages and environments, the authors have chosen to not widen the scope of this document. We direct the reader to the several existing dCBOR implementations for guidance on API design.</t>
      </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="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="IANASIMPLEVALUES" target="https://www.iana.org/assignments/cbor-simple-values">
          <front>
            <title>Concise Binary Object Representation (CBOR) Simple Values</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </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="30" month="September" year="2025"/>
            <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-10"/>
        </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 492?>

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

-->

</rfc>
