<?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.6.29 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mcnally-deterministic-cbor-05" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.1 -->
  <front>
    <title abbrev="dCBOR">Gordian dCBOR: A Deterministic CBOR Application Profile</title>
    <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-05"/>
    <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>
    <date year="2023" month="August" day="08"/>
    <area>Applications and Real-Time</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>CBOR (RFC 8949) defines "Deterministically Encoded CBOR" in its Section 4.2. The present document provides the application profile "dCBOR" that can be used to help achieve interoperable deterministic encoding.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <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>
    <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. This document specifies a set of requirements for the application profile "dCBOR" that <bcp14>MUST</bcp14> be implemented at the codec level. These requirements include but go beyond <xref target="RFC8949"/> §4.2.</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>
      </section>
    </section>
    <section anchor="application-profile">
      <name>Application Profile</name>
      <t>The dCBOR Application Profile specifies the use of Deterministic Encoding as defined in Section 4.2 of <xref target="RFC8949"/> together with some application-level rules specified in this section.</t>
      <t>The application-level rules specified here do not "fork" CBOR. A dCBOR implementation produces well-formed, deterministically encoded CBOR according to <xref target="RFC8949"/>, and existing generic CBOR decoders will therefore be able to decode it, including those that check for deterministic encoding. Similarly, generic 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 application profile 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>This application profile 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 the application profile is used. As a result, this application profile 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 number, such as arbitrary precision integers or 64-bit negative integers) 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="base-requirements">
        <name>Base Requirements</name>
        <t>dCBOR encoders <bcp14>MUST</bcp14> only emit CBOR conforming to the requirements "Core Deterministic Encoding Requirements" of <xref target="RFC8949"/> §4.2.1. To summarize,</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> encode variable-length integers using the shortest form possible.</li>
          <li>
            <bcp14>MUST</bcp14> encode floating-point values using the shortest form that preserves the value.</li>
          <li>
            <bcp14>MUST NOT</bcp14> encode indefinite-length arrays or maps.</li>
          <li>
            <bcp14>MUST</bcp14> sort map keys in bytewise lexicographic order of their deterministic encodings.</li>
        </ol>
        <t>In addition, dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="5"><li>
            <bcp14>MUST</bcp14> reject any variable length integers that are not encoded in the shortest form possible.</li>
        </ol>
        <ol spacing="normal" type="1" start="6"><li>
            <bcp14>MUST</bcp14> reject any floating-point values that are not encoded in the shortest form that preserves the value.</li>
        </ol>
        <ol spacing="normal" type="1" start="7"><li>
            <bcp14>MUST</bcp14> reject any indefinite-length arrays or maps.</li>
        </ol>
        <ol spacing="normal" type="1" start="8"><li>
            <bcp14>MUST</bcp14> reject any maps whose keys are not sorted in bytewise lexicographic order of their deterministic encodings.</li>
        </ol>
      </section>
      <section anchor="duplicate-map-keys">
        <name>Duplicate Map Keys</name>
        <t>Standard 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 that contains duplicate map 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>dCBOR codecs that support floating point numbers (CBOR major type 7):</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST</bcp14> support floating point <xref target="IEEE754"/> binary16 as the most-preferred encoding for floating point values, followed by binary32, then binary64.</li>
        </ol>
        <t>dCBOR encoders that support floating point numbers:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reduce floating point values with no fractional part to the shortest integer encoding that can accurately represent them.</li>
        </ol>
        <ol spacing="normal" type="1" start="3"><li>
            <bcp14>MUST</bcp14> reduce floating point values with a non-zero fractional part to the shortest floating point encoding that can accurately represent them.</li>
        </ol>
        <t>dCBOR decoders that support floating point numbers:</t>
        <ol spacing="normal" type="1" start="4"><li>
            <bcp14>MUST</bcp14> reject any encoded floating point values that are not encoded as the shortest encoding that can accurately represent them.</li>
        </ol>
        <t>The above rules still produce well-formed CBOR according to the standard, and all existing generic decoders will be able to read it. It does exclude a map such as the following from being validated as dCBOR, even though it would be allowed in standard CBOR because:</t>
        <ul spacing="normal">
          <li>
            <tt>10.0</tt> is an invalid numeric value in dCBOR, and</li>
          <li>using the unsigned integer value <tt>10</tt> more than once as a map key is not allowed.</li>
        </ul>
        <artwork><![CDATA[
{
   10: "ten",
   10.0: "floating ten"
}
]]></artwork>
        <section anchor="reduction-of-negative-zero">
          <name>Reduction of Negative Zero</name>
          <t><xref target="IEEE754"/> defines a negative zero value <tt>-0.0</tt>.</t>
          <t>dCBOR encoders that support floating point:</t>
          <ol spacing="normal" type="1"><li>
              <bcp14>MUST</bcp14> reduce all negative zero values to the integer value <tt>0</tt>.</li>
          </ol>
          <t>dCBOR decoders that support floating point:</t>
          <ol spacing="normal" type="1" start="2"><li>
              <bcp14>MUST</bcp14> reject any encoded negative zero values.</li>
          </ol>
          <t>Therefore with dCBOR, <tt>0.0</tt>, <tt>-0.0</tt>, and <tt>0</tt> all encode to the same canonical single-byte value <tt>0x00</tt>.</t>
        </section>
        <section anchor="reduction-of-nans-and-infinities">
          <name>Reduction of NaNs and Infinities</name>
          <t><xref target="IEEE754"/> defines the <tt>NaN</tt> (Not a Number) value <xref target="NAN"/>. This is usually divided into two types: <em>quiet NaNs</em> and <em>signalling NaNs</em>, and the sign bit is used to distinguish between these two types. The specification also includes a range of "payload" bits. These bit fields have no definite purpose and could be used to break determinism or exfiltrate data.</t>
          <t>dCBOR encoders that support floating point:</t>
          <ol spacing="normal" type="1"><li>
              <bcp14>MUST</bcp14> reduce all <tt>NaN</tt> values to the binary16 quiet <tt>NaN</tt> value having the canonical bit pattern <tt>0x7e00</tt>.</li>
            <li>
              <bcp14>MUST</bcp14> reduce all <tt>+INF</tt> values to the binary16 <tt>+INF</tt> having the canonical bit pattern <tt>0x7c00</tt>.</li>
            <li>
              <bcp14>MUST</bcp14> reduce all <tt>-INF</tt> values to the binary16 <tt>-INF</tt> having the canonical bit pattern <tt>0xfc00</tt>.</li>
          </ol>
          <t>dCBOR decoders that support floating point:</t>
          <ol spacing="normal" type="1" start="4"><li>
              <bcp14>MUST</bcp14> reject any encoded <tt>NaN</tt> values not having the canonical bit pattern <tt>0x7e00</tt>.</li>
          </ol>
          <ol spacing="normal" type="1" start="5"><li>
              <bcp14>MUST</bcp14> reject any encoded <tt>+INF</tt> values not having the canonical bit pattern <tt>0x7c00</tt>.</li>
          </ol>
          <ol spacing="normal" type="1" start="6"><li>
              <bcp14>MUST</bcp14> reject any encoded <tt>-INF</tt> values not having the canonical bit pattern <tt>0xfc00</tt>.</li>
          </ol>
        </section>
      </section>
      <section anchor="bit-negative-integers">
        <name>65-bit Negative Integers</name>
        <t>The largest negative integer that can be represented in 64-bit two's complement (<tt>STANDARD_NEGATIVE_INT_MAX</tt>) is -2<sup>63</sup> (<tt>0x8000000000000000</tt>).</t>
        <t>However, standard CBOR major type 1 can encode negative integers as low as <tt>CBOR_NEGATIVE_INT_MAX</tt>, which is -2<sup>64</sup> (two's complement: <tt>0x10000000000000000</tt>, CBOR: <tt>0x3BFFFFFFFFFFFFFFFF</tt>).</t>
        <t>Negative integers in the range [<tt>CBOR_NEGATIVE_INT_MAX</tt> ... <tt>STANDARD_NEGATIVE_INT_MAX</tt> - 1] require 65 bits of precision, and are thus not representable in typical machine-sized integers.</t>
        <t>Because of this incompatibility between standard CBOR and typical machine-size representations, dCBOR disallows encoding negative integer values in the range [<tt>CBOR_NEGATIVE_INT_MAX</tt> ... <tt>STANDARD_NEGATIVE_INT_MAX</tt> - 1].</t>
        <t>dCBOR encoders:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST NOT</bcp14> encode these values as CBOR major type 1.</li>
        </ol>
        <t>dCBOR decoders:</t>
        <ol spacing="normal" type="1" start="2"><li>
            <bcp14>MUST</bcp14> reject these encoded major type 1 CBOR values.</li>
        </ol>
      </section>
      <section anchor="simple-values">
        <name>Simple Values</name>
        <t>CBOR Major Type 7 includes the floating point values (<tt>0xf7</tt>, <tt>0xfa</tt>, <tt>0xfb</tt>) and also the "simple values" <tt>false</tt> (<tt>0xf4</tt>), <tt>true</tt> (<tt>0xf5</tt>), and <tt>null</tt> (<tt>0xf6</tt>).</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="all-requirements-are-narrowing">
        <name>All Requirements are Narrowing</name>
        <t>Any apparent conflict between the requirements above are resolved by understanding that all of the requirements in this document are <em>narrowing</em>, meaning that starting from the CBOR specification <xref target="RFC8949"/> each requirement herein narrows the set of valid dCBOR encodings.</t>
        <t>For example: due to the requirements in §2.4., there are no valid dCBOR major type 1 values that can encode negative integers requiring more than 64 bits of precision, hence reduction of negative floating point values with no fractional part to negative integers (§2.3.) is narrowed to the range of valid dCBOR major type 1 negative integer encodings. Therefore any negative floating point values with no fractional part that fall outside this range are encoded as floating point values (§2.2.).</t>
      </section>
    </section>
    <section anchor="reference-implementations">
      <name>Reference Implementations</name>
      <t>This section is informative.</t>
      <t>These are single-purpose dCBOR codecs that conform to these specifications:</t>
      <ul spacing="normal">
        <li>Swift implementation <xref target="SwiftDCBOR"/></li>
        <li>Rust implementation <xref target="RustDCBOR"/></li>
        <li>TypeScript implementation <xref target="TypescriptDCBOR"/></li>
      </ul>
    </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="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes no requests of IANA.</t>
    </section>
    <section anchor="other-approaches">
      <name>Other Approaches</name>
      <t>As of this writing the specification of deterministic CBOR beyond <xref target="RFC8949"/> is an active item before the CBOR working group. <xref target="BormannDCBOR"/> and <xref target="RundgrenDCBOR"/> are other approaches to deterministic CBOR.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <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="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE, "IEEE Standard for Floating-Point Arithmetic", IEEE Std 754-2019, DOI 10.1109/IEEESTD.2019.8766229</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>
        <name>Informative References</name>
        <reference anchor="NAN" target="https://en.wikipedia.org/wiki/NaN">
          <front>
            <title>NaN</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SwiftDCBOR" target="https://github.com/BlockchainCommons/BCSwiftDCBOR">
          <front>
            <title>Deterministic CBOR ("dCBOR") for Swift.</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RustDCBOR" target="https://github.com/BlockchainCommons/bc-dcbor-rust">
          <front>
            <title>Deterministic CBOR ("dCBOR") for Rust.</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="TypescriptDCBOR" target="https://github.com/BlockchainCommons/bc-dcbor-ts">
          <front>
            <title>Deterministic CBOR ("dCBOR") for Typescript.</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BormannDCBOR" target="https://www.ietf.org/archive/id/draft-bormann-cbor-dcbor-00.html">
          <front>
            <title>dCBOR – an Application Profile for Use with CBOR Deterministic Encoding</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RundgrenDCBOR" target="https://www.ietf.org/archive/id/draft-rundgren-deterministc-cbor-02.html">
          <front>
            <title>Deterministically Encoded CBOR (D-CBOR)</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors are grateful for the contributions of Carsten Bormann, Joe Hildebrand, and Anders Rundgren in the CBOR working group.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
HxCVs+2pMgAA

-->

</rfc>
