<?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-15" 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-15"/>
    <author initials="W." surname="McNally" fullname="Wolf McNally">
      <organization>Blockchain Commons</organization>
      <address>
        <email>wolf@wolfmcnally.com</email>
      </address>
    </author>
    <author initials="C." surname="Allen" fullname="Christopher Allen">
      <organization>Blockchain Commons</organization>
      <address>
        <email>christophera@lifewithalacrity.com</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <author initials="L." surname="Lundblade" fullname="Laurence Lundblade">
      <organization>Security Theory LLC</organization>
      <address>
        <email>lgl@securitytheory.com</email>
      </address>
    </author>
    <date year="2025" month="November" day="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 specifies the exclusions and reductions that dCBOR applies to CBOR.</t>
      <t>The rules specified here do not "fork" CBOR: A dCBOR implementation produces well-formed, deterministically encoded CBOR according to <xref target="RFC8949"/>, and existing CBOR decoders will therefore be able to decode it. Similarly, CBOR encoders will be able to produce valid dCBOR if handed dCBOR-conforming data model level information from an application.</t>
      <t>Note that the separation between standard CBOR processing and the processing required by the dCBOR rules is a conceptual one: Both dCBOR processing and standard CBOR processing may be combined into a unified dCBOR/CBOR codec. The requirements in this document apply to encoding or decoding of dCBOR data, regardless of whether the codec is a unified dCBOR/CBOR codec operating in dCBOR-compliant modes, or a single-purpose dCBOR codec. Both of these are generically referred to as "dCBOR codecs" in this document.</t>
      <t>dCBOR is intended to be used in conjunction with an application, which typically will use a subset of CBOR, which in turn influences which subset of dCBOR that is used. As a result, dCBOR places no direct requirement on what subset of CBOR is implemented. For instance, there is no requirement that dCBOR implementations support floating point numbers (or any other kind of non-basic integer type, such as arbitrary precision integers or complex numbers) when they are used with applications that do not use them. However, this document does place requirements on dCBOR implementations that support negative 64-bit integers and 64-bit or smaller floating point numbers.</t>
      <section anchor="definite-length-items">
        <name>Definite Length Items</name>
        <t>CBOR <xref target="RFC8949"/> allows both "definite-length" and "indefinite-length" items for byte strings, text strings, arrays, and maps (§3.2).</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit "definite-length" items for byte strings, text strings, arrays, and maps.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reject any encoded "indefinite-length" items for byte strings, text strings, arrays, and maps.</li>
        </ol>
      </section>
      <section anchor="preferred-serialization">
        <name>Preferred Serialization</name>
        <t>CBOR <xref target="RFC8949"/> allows multiple possible encodings for the same data item, and defines a "preferred serialization" in §4.1 to be used for deterministic encoding.</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit "preferred serialization".</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> validate that encoded CBOR conforms to "preferred serialization", and reject any encoded CBOR that does not conform.</li>
        </ol>
      </section>
      <section anchor="ordered-map-keys">
        <name>Ordered Map Keys</name>
        <t>The last bullet item of CBOR <xref target="RFC8949"/> §4.2.1 defines a "bytewise lexicographic order" for map keys to be used for deterministic encoding.</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit CBOR maps with keys in "bytewise lexicographic order".</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> validate that encoded CBOR maps have keys in "bytewise lexicographic order", and reject any encoded maps that do not conform.</li>
        </ol>
      </section>
      <section anchor="duplicate-map-keys">
        <name>Duplicate Map Keys</name>
        <t>CBOR <xref target="RFC8949"/> defines maps with duplicate keys as invalid, but leaves how to handle such cases to the implementor (§2.2, §3.1, §5.4, §5.6).</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST NOT</bcp14> emit CBOR maps that contain duplicate keys.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reject encoded maps with duplicate keys.</li>
        </ol>
      </section>
      <section anchor="numeric-reduction">
        <name>Numeric Reduction</name>
        <t>The purpose of determinism is to ensure that semantically equivalent data items are encoded into identical byte streams. Numeric Reduction ensures that semantically equal numeric values (e.g. <tt>2</tt> and <tt>2.0</tt>) are encoded into identical byte streams (e.g. <tt>0x02</tt>) by encoding "Integral floating point values" (floating point values with a zero fractional part) as integers when possible.</t>
        <t>dCBOR implementations that support floating point numbers:</t>
        <ol spacing="normal" type="1"><li>
            <t><bcp14>MUST</bcp14> check whether floating point values to be encoded have the numerically equal value in <tt>DCBOR_INT</tt> = [-2<sup>63</sup>, 2<sup>64</sup>-1]. If that is the case, it <bcp14>MUST</bcp14> be converted to that numerically equal integer value before encoding it. (Preferred encoding will then ensure the shortest length encoding is used.) If a floating point value has a non-zero fractional part, or an exponent that takes it out of <tt>DCBOR_INT</tt>, the original floating point value is used for encoding. (Specifically, conversion to a CBOR bignum is never considered.)  </t>
            <t>
This also means that the three representations of a zero number in CBOR (<tt>0</tt>, <tt>0.0</tt>, <tt>-0.0</tt> in diagnostic notation) are all reduced to the basic integer <tt>0</tt> (with preferred encoding <tt>0x00</tt>).</t>
          </li>
        </ol>
        <aside>
          <t>Note that Numeric Reduction means that some maps that are valid CBOR cannot be reduced to valid dCBOR maps, as Numeric Reduction can result in multiple entries with the same keys ("duplicate keys"). For example, the following is a valid CBOR map:</t>
          <figure>
            <name>Valid CBOR data item with numeric map keys</name>
            <sourcecode type="cbor-diag"><![CDATA[
{
   10: "ten",
   10.0: "floating ten"
}
]]></sourcecode>
          </figure>
          <t>Applying Numeric Reduction to this map would yield the invalid map:</t>
          <figure>
            <name>Numeric Reduction turns valid CBOR invalid</name>
            <sourcecode type="cbor-diag"><![CDATA[
{  / invalid: multiple entries with the same key /
   10: "ten",
   10: "floating ten"
}
]]></sourcecode>
          </figure>
          <t>In general, dCBOR applications need to avoid maps that have entries with keys that are semantically equivalent in dCBOR's numeric model.</t>
        </aside>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reduce all encoded NaN values to the quiet NaN value having the half-width CBOR representation <tt>0xf97e00</tt>.</li>
        </ol>
        <t>dCBOR decoders that support floating point numbers:</t>
        <ol spacing="normal" type="1" start="3"><li>
            <bcp14>MUST</bcp14> reject any encoded floating point values that are not encoded according to the above rules.</li>
        </ol>
      </section>
      <section anchor="simple-values">
        <name>Simple Values</name>
        <t>Only the three "simple" (major type 7) values <tt>false</tt> (0xf4), <tt>true</tt> (0xf5), and <tt>null</tt> (0xf6) and the floating point values are valid in dCBOR.</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST NOT</bcp14> encode major type 7 values other than <tt>false</tt>, <tt>true</tt>, <tt>null</tt>, and the floating point values.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reject any encoded major type 7 values other than <tt>false</tt>, <tt>true</tt>, <tt>null</tt>, and the floating point values.</li>
        </ol>
      </section>
      <section anchor="strings">
        <name>Strings</name>
        <t>CBOR <xref target="RFC8949"/> allows text strings to be any valid UTF-8 string (§3.1). However, Unicode character sequences can represent the same text string in different ways, leading to variability in the encoding of semantically equivalent data items. Unicode Normalization Form C (NFC) <xref target="UNICODE-NORM"/> is a commonly used normalization form that eliminates such variability.</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> only emit text strings that are in NFC.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> reject any encoded text strings that are not in NFC.</li>
        </ol>
      </section>
    </section>
    <section anchor="cddl-support-declarative-tag">
      <name>CDDL support, Declarative Tag</name>
      <t>CDDL <xref target="RFC8610"/> is a widely used language for specifying CBOR data models. This specification adds two CDDL control operators that can be used to specify that the data items should be encoded in dCBOR.</t>
      <t>The control operators <tt>.dcbor</tt> and <tt>.dcborseq</tt> are exactly like <tt>.cbor</tt> and <tt>.cborseq</tt> as defined in <xref target="RFC8610"/> except that they also require the encoded data item(s) to conform to dCBOR.</t>
      <t>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 500?>

<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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
hIXit63a/wOIClyWG4sAAA==

-->

</rfc>
