<?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-04" 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-04"/>
    <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="06"/>
    <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>
    <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 and Anders Rundgren in the CBOR working group.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
