<?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-18" 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-18"/>
    <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="August" day="10"/>
    <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="11" month="February" year="2026"/>
            <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-11"/>
        </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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

-->

</rfc>
