<?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-03" 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-03"/>
    <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.</t>
        <t>To summarize, dCBOR codecs:</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>
        <t> 5. <bcp14>MUST</bcp14> validate and return errors for any encoded CBOR that is not conformant to any part of this specification.</t>
      </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 codecs:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST NOT</bcp14> emit CBOR that contains duplicate map keys.</li>
          <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> reduce floating point values with no fractional part to the shortest integer encoding that can accurately represent it.</li>
          <li>
            <bcp14>MUST</bcp14> reduce floating point values with a non-zero fractional part to the shortest floating point encoding that can accurately represent it.</li>
          <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>This practice still produces 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>. dCBOR codecs 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>
            <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> reject any other encoded <tt>NaN</tt> values.</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> and likewise with <tt>-INF</tt> to <tt>0xfc00</tt>.</li>
            <li>
              <bcp14>MUST</bcp14> reject any encoded <tt>INF</tt> or <tt>-INF</tt> values other than these.</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 (STANDARD_NEGATIVE_INT_MAX) is -2^63 (0x8000000000000000).</t>
        <t>However, standard CBOR major type 1 can encode negative integers as low as CBOR_NEGATIVE_INT_MAX, which is -2^64 (two's complement: 0x10000000000000000, CBOR: 0x3BFFFFFFFFFFFFFFFF).</t>
        <t>Negative integers in the range [CBOR_NEGATIVE_INT_MAX ... STANDARD_NEGATIVE_INT_MAX - 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 [CBOR_NEGATIVE_INT_MAX ... STANDARD_NEGATIVE_INT_MAX - 1]. dCBOR codecs:</t>
        <ol spacing="normal" type="1"><li>
            <bcp14>MUST NOT</bcp14> encode these values as CBOR major type 1.</li>
          <li>
            <bcp14>MUST</bcp14> reject these encoded major type 1 CBOR 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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
gCzybhm0ujV+Z009Yqr7QmjqqzKM6ZSXXJXm/jJz5Hkvv8slbWbukvCOFJqU
cNtqEkmdQFFo/xa/CVMWVk7tpIqUGpsoVYeTMkqvDiibc2tnCTJX3BxFts9H
uVSg/gW7EUrc2Sv52gq5+ZpK6YbeTvJ1PSXcDc2hTUo6ZOXknm9lYTrAtRxU
1ZkslfMSyEQH/ArXCW+zw+6l8eR6XtvQnZbq7uBAxOEjUKijmRl0G4+WcXlM
u0WTB+A0hacprxvm4xcIivtuaE3tYdvDySLxk7A7dpIyP5DTkq+bUTMCQkY+
lYNU7R41EGyMBQ+QnCdAM9mCJnM8m/4egcw8Zb5XycsncqSxyj852C+ns+kH
vDzSt6YefYI0uzStYwJXLPM0xQaBp1S1TvMalNcIiHoU1an/ds6WXde0dRwr
PRN1kQS4haEebSFdj5Ela/edHn++N8TS9uc1oKCZXuerFbpLBpVwqiWXA6Ft
mdz3FnOomY/3/Ns4WYcmWMrs8WEiowoT/KG3QFFreu/dsRl/2JfL9J6cnL4n
qE64KTAyOy8bhNBZjs6r+jaIpZ7GXItWolcJZs+uvf8HIRU3T5ApAAA=

-->

</rfc>
