<?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-17" 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-17"/>
    <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="2026" month="February" day="12"/>
    <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 is normative and specifies the exclusions and reductions that dCBOR applies to CBOR, thereby narrowing the set of data items allowed that are drawn from CBOR’s basic generic data model.</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>A CBOR data item is considered to conform to dCBOR only if every CBOR data item nested within it, recursively (including array elements, map keys and values, and the contents of tagged data items), also conforms to the narrowing rules in this section.</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 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>
        <t>For the purposes of this document, the dCBOR numeric model comprises only untagged integers and untagged floating point values in the CBOR basic generic data model (major types 0, 1, and 7 as defined in <xref target="RFC8949"/> and by the type <tt>number</tt> in <xref target="RFC8610"/>). Numeric Reduction and the duplicate-key considerations in this section apply only to such untagged numeric values, wherever they occur in a dCBOR data item. Tagged data items themselves are not part of the dCBOR numeric model: two tagged data items are equal in dCBOR only if both their tag numbers and their enclosed CBOR data items are equal, and no tagged data item is ever considered numerically equal to an untagged data item.</t>
      </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>The CDDL Standard Prelude as defined in <xref target="RFC8610"/> Appendix D defines:</t>
      <t><tt>
number = int / float
</tt></t>
      <t>This type encompasses the full space of CBOR numeric values representable by CBOR major types 0, 1, and 7. Therefore dCBOR applications can use <tt>number</tt> to specify fields with numeric values, and dCBOR's Numeric Reduction ensures that these values are encoded deterministically.</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> the equivalent 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, or a function that returns no value (<tt>void</tt>). dCBOR cannot by narrowing CBOR 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 generally-accepted 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 504?>

<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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
cKfrtrlSSwujlleze0DBesaHVcvxEovCNsqE7URboipHaq9Sve6EaQfT0iwy
0eiAuu1Y/VIqSi8rMTcePCpmGjpBJpqmLhq8wzRWPOyINlBHG6vZAW0fOQ3o
vU17YZfd2X0eWs3801bzkdN4809bDcrHHX/M3hw57lDPrMY3QhJHLAvJT5gG
VuNv+KqffxoU9xvu+gencbMenuLNIJTt/DIJIh/rvWs7T0Zt233S1m1xdwZx
LNDITAKSr4vYw7pQMAA9H9ONMC3qsdPY5LHpGSudAmyPE5DDxStU+L+UdmLG
Kmp9Uh8U1Cv1CWeNhltRnhVAkRSVRoKmCg4/PnZK4B7XVe251Xk/OgV+Hhcy
U3UuZ2mT2QfOmGhItzGGNQK5qfUCsB5Ve0x5yinTwB0EmUX5+UvvDfau47a5
lMAdSxK6nYKzvU3XXdNgV2rTbOs2KUKyBYwb83EGPs1XPFV5nSpuTYKc01lb
el4j+siTkhQaqZYpMlsM3ignbL3aVvDMnY3pe6qqsl2kQXy0OZ8fCYErwqj5
TEvJl4DiPJLfjfCH2Q9bqjdqqUGf8vZGQwXLgtkqRanwYN1TOvM7+0rKt7js
3IDn1EJJhdrMdGeixJ601JTFlHU5VYDV4vuAi9KK9tpY3bmIOPvRdKWOanbP
0FEa54kpRrAEi+jBPC1uKCg9O1NN5VJUymrbbWpLoSWYYR6SMcgWUVEpb/cC
vfyso56jReukFHLTChb6zhQVdCA5YH+X+zhJqELTm+JHKs7jZWHHsBJvck2D
6THFiZeZF2AD4qKhJQki7re9pRHYT7dBaLt5cgOTcrN0WzNLLSFqanwZ/5st
v20RB7XrQWY06WVbW+jbDp0grf14pWXlWGGHCatyZYHN3JRWFdJ1SNIqDffT
EzUsbnpqIJtb0b+kJjtRrPzQC5ZuGaIn9aCPsQj4MTLF4yk4lI8LmVZ3D8AD
Pf25Q6nb81Y9zW0379jJwrNoog7BUrsGvOil63YWt/MIM+yw5FQkk3xfpNcy
PG6dLtCwU0y48vw3HkdhHNX24H0EWF287VICJP430gbEEcOmZpIWyJvJG5du
8jVOso2xwVtKtGeqXkGMvqHaueIuBaZKeB12ZZnafsGFKK/UW4nfVRD0FQuO
nX9MNiH2t97thY/ywD7e96r1xc5t/0nuIiy/S/8qti62r5DaRczqWn9uXeHz
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

-->

</rfc>
