<?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-01" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.1 -->
  <front>
    <title abbrev="dCBOR">Gordian dCBOR: Deterministic CBOR Implementation Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-01"/>
    <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="May" day="04"/>
    <area>Applications and Real-Time</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>CBOR 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. Nonetheless, determinism is an opt-in feature of the specification, 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 norms and practices for CBOR codec implementors intended to support deterministic CBOR ("dCBOR") at the codec API level.</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>The goal of determinism in data encoding is that multiple agents serializing the same data will automatically achieve consensus on the byte-level form of that serialized data. Many data serialization formats give developers wide latitude on the serialized form, for example:</t>
      <ul spacing="normal">
        <li>The use of whitespace in JSON, which may be omitted or used to taste.</li>
        <li>The key-value pairs of map/dictionary structures are usually considered unordered. Therefore their order of serialization is taken to be semantically insignificant and so varies depending on the implementation.</li>
        <li>Standards for the binary encoding of floating point numeric values often include bit patterns that are functionally equivalent, such as <tt>0.0</tt> and <tt>-0.0</tt> or <tt>NaN</tt> and <tt>signalling NaN</tt>.</li>
        <li>The number of bytes used to encode an integer or floating point value; e.g., in well-formed CBOR there are four valid ways to encode the integer <tt>1</tt> and three valid ways to encode the floating point value <tt>1.0</tt> giving a total of seven valid ways to encode the semantic concept <tt>1.0</tt>. In JSON the problem is even worse, given that <tt>1</tt>, <tt>1.</tt>, <tt>1.0</tt>, <tt>1.00</tt>, <tt>1.000</tt>, etc. are equivalent representations of the same value.</li>
      </ul>
      <t>Each of these choices made differently by separate agents yield different binary serializations that cannot be compared based on their hash values, and which therefore must be separately parsed and validated semantically field-by-field to decide whether they are identical. Such fast comparison for identicality using hashes is important in certain classes of application, where the hash is published or incorporated into other documents, hence "freezing" the form of the document. Where the hash is known or fixed, it is impossible to substitute a different document for the original that differs by even a single bit.</t>
      <t>The CBOR standard addresses this problem in <xref target="RFC8949"/> §4.2, by narrowing the scope of choices available for encoding various values, but does not specify a set of norms and practices for CBOR codec implementors who value the benefits of deterministic CBOR, hereinafter called "dCBOR".</t>
      <t>This document's goal is to specify such a set of norms and practices for dCBOR codec implementors.</t>
      <t>It is important to stress that dCBOR is <em>not</em> a new dialect of CBOR, and that all dCBOR is well-formed CBOR that can be read by existing CBOR codecs.</t>
      <t>This document is segmented into four sections. They include norms and practices that:</t>
      <ul spacing="normal">
        <li>
          <bcp14>MUST</bcp14> be implemented in the codec (Serialization level),</li>
        <li>
          <bcp14>MUST</bcp14> be implemented by developers of specifications dependent on dCBOR (Application level).</li>
        <li>are acknowledged to fall under the purview of this document, but which are not yet specified (Future work).</li>
        <li>are <bcp14>RECOMMENDED</bcp14> for dCBOR codec implementors (Recommendations).</li>
      </ul>
    </section>
    <section anchor="terminology">
      <name>Terminology</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>
      <t>This specification makes use of the following terminology:</t>
      <dl>
        <dt>byte</dt>
        <dd>
          <t>Used in its now-customary sense as a synonym for "octet".</t>
        </dd>
        <dt>codec</dt>
        <dd>
          <t>"coder-decoder", a software suite that both encodes (serializes) and decodes (deserializes) a data format.</t>
        </dd>
        <dt>dCBOR</dt>
        <dd>
          <t>"deterministic CBOR" encoded in conformance with the CBOR specification in this document.</t>
        </dd>
        <dt>insert/extract</dt>
        <dd>
          <t>To convert platform-native or application-centric data structures to/from an in-memory symbolic representation of CBOR.</t>
        </dd>
        <dt>serialize/deserialize</dt>
        <dd>
          <t>To convert an in-memory symbolic representation of CBOR to/from a byte stream.</t>
        </dd>
      </dl>
    </section>
    <section anchor="serialization-level">
      <name>Serialization Level</name>
      <t>This section defines requirements and practices falling in the purview of the dCBOR codec.</t>
      <section anchor="base-requirements">
        <name>Base Requirements</name>
        <t>dCBOR encoders <bcp14>MUST</bcp14> only emit CBOR conforming to the requirements of <xref target="RFC8949"/> §4.2.1. To summarize:</t>
        <ul spacing="normal">
          <li>Variable-length integers <bcp14>MUST</bcp14> be as short as possible.</li>
          <li>Floating-point values <bcp14>MUST</bcp14> use the shortest form that preseves the value.</li>
          <li>Indefinite-length arrays and maps <bcp14>MUST NOT</bcp14> be used.</li>
          <li>Map keys <bcp14>MUST</bcp14> be sorted in bytewise lexicographic order of their deterministic encodings.</li>
        </ul>
        <t>dCBOR codecs <bcp14>MUST</bcp14> validate and return errors for any CBOR that is not conformant.</t>
      </section>
      <section anchor="reduction-of-floating-point-values-to-integers">
        <name>Reduction of Floating Point Values to Integers</name>
        <t>While there is no requirement that dCBOR codecs implement support for floating point numbers, dCBOR codecs that do support them <bcp14>MUST</bcp14> reduce floating point values with no fractional part to the smallest integer value that can accurately represent it. If a numeric value has a fractional part or an exponent that takes it out of the range of representable integers, then it <bcp14>SHALL</bcp14> be encoded as a floating point value.</t>
        <t>This practice still produces well-formed CBOR according to the standard, and all existing implementations will be able to read it. It does exclude a map such as the following from being validated as dCBOR, as it would have a duplicate key:</t>
        <artwork><![CDATA[
{
   10: "ten",
   10.0: "floating ten"
}
]]></artwork>
      </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. However, the specification also includes a range of "payload" bits. These bit fields have no definite purpose and could be used to break CBOR determinism.</t>
        <t>dCBOR encoders that support floating point <bcp14>MUST</bcp14> reduce all <tt>NaN</tt> values to the half-width quiet <tt>NaN</tt> value having the canonical bit pattern <tt>0x7e00</tt>.</t>
        <t>Similarly, encoders that support floating point <bcp14>MUST</bcp14> reduce all <tt>+INF</tt> values to the half-width <tt>+INF</tt> having the canonical bit pattern <tt>0x7c00</tt> and likewise with <tt>-INF</tt> to <tt>0xfc00</tt>.</t>
      </section>
      <section anchor="reduction-of-bignums-to-integers">
        <name>Reduction of BigNums to Integers</name>
        <t>While there is no requirement that dCBOR codecs implement support for BigNums ≥ 2^64 (tags 2 and 3), codecs that do support them <bcp14>MUST</bcp14> use regular integer encodings where integers can represent the value.</t>
      </section>
      <section anchor="cbornegativeintmax-disallowed">
        <name>CBOR_NEGATIVE_INT_MAX disallowed</name>
        <t>The largest negative integer that can be represented in 64 bits two's complement (STANDARD_NEGATIVE_INT_MAX) is -2^63 (0x8000000000000000).</t>
        <t>However, the largest negative integer that can be represented in CBOR (CBOR_NEGATIVE_INT_MAX) is -2^64 (0x10000000000000000), which requires 65 bits. The CBOR encoding for CBOR_NEGATIVE_INT_MAX is 0x3BFFFFFFFFFFFFFFFF.</t>
        <t>Because of this incompatibility between the CBOR and standard representations, dCBOR disallows CBOR_NEGATIVE_INT_MAX: conformant encoders <bcp14>MUST</bcp14> never encode this sequence and conformant decoders <bcp14>MUST</bcp14> reject CBOR_NEGATIVE_INT_MAX as not well-formed.</t>
        <t>Implementations that support BIGNUM are able to encode and decode this value as BIGNUM.</t>
      </section>
    </section>
    <section anchor="application-level">
      <name>Application Level</name>
      <section anchor="optionaldefault-values">
        <name>Optional/Default Values</name>
        <t>Protocols that depend on dCBOR <bcp14>MUST</bcp14> specify the optionality and semantics of field values. In key-value paired structures like CBOR maps, protocols <bcp14>MUST</bcp14> specify whether the field:</t>
        <ul spacing="normal">
          <li>
            <bcp14>REQUIRED</bcp14> and the value <bcp14>MUST NOT</bcp14> be <tt>null</tt>.</li>
          <li>
            <bcp14>OPTIONAL</bcp14> but if present the value <bcp14>MUST NOT</bcp14> be <tt>null</tt>.</li>
          <li>
            <bcp14>REQUIRED</bcp14> and the value <bcp14>MAY</bcp14> be <tt>null</tt>.</li>
          <li>
            <bcp14>OPTIONAL</bcp14> and the value <bcp14>MAY</bcp14> be <tt>null</tt>.</li>
        </ul>
        <t>In the last case, the protocol specifier <bcp14>MUST</bcp14> state the semantic difference between the field being not present at all, and being present but having a <tt>null</tt> value. For example, in a map representing user preferences:</t>
        <ul spacing="normal">
          <li>The absence of the field means the user needs to be asked for their preference,</li>
          <li>The presence of the field with a <tt>null</tt> value means the user has been asked, but specified that they accept the current default.</li>
          <li>If the field is present and the value is non-<tt>null</tt>, the user would have affirmatively specified a preference.</li>
        </ul>
        <t>The rationale for this specificity is to remove semantic ambiguity and eliminate the choice over whether to encode a key-value pair where the value is <tt>null</tt> or omit it entirely.</t>
      </section>
      <section anchor="tagging-items">
        <name>Tagging Items</name>
        <t>Protocols that depend on dCBOR <bcp14>MUST</bcp14> specify the circumstances under which a data item <bcp14>MUST</bcp14> or <bcp14>MUST NOT</bcp14> be tagged.</t>
        <t>The codec API <bcp14>SHOULD</bcp14> afford conveniences such as protocol conformances that allow the association of a tag with a particular data type. The encoder <bcp14>MUST</bcp14> use such an associated tag when serializing, and the decoder <bcp14>MUST</bcp14> expect the associated tag when extracting a structure of that type.</t>
      </section>
    </section>
    <section anchor="future-work">
      <name>Future Work</name>
      <t>The following issues are currently left for future work:</t>
      <ul spacing="normal">
        <li>How to deal with subnormal floating point values <xref target="SUBNORMAL"/>.</li>
      </ul>
    </section>
    <section anchor="api-level-recommendations">
      <name>API-Level Recommendations</name>
      <t>This section is informative.</t>
      <t>Many existing CBOR implementations give little or no guidance at the API level as to whether the CBOR being read conforms to the CBOR specification for deterministic encoding <xref target="RFC8949"/> §4.2, for example by emitting errors or warnings at deserialization time. Conversely, many existing implementations do not carry any burden of ensuring that CBOR is serialized in conformance with the CBOR determinstic encoding specification, again putting that burden on developers.</t>
      <t>The authors of this document believe that for applications where dCBOR correctness as specified in this document is important, the codec itself should carry as much of this burden as possible. This is important both to minimize cognitive load during development, and help ensure interoperability between implementations.</t>
      <section anchor="general-practices-for-dcbor-codecs">
        <name>General Practices for dCBOR Codecs</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that dCBOR codecs:</t>
        <ul spacing="normal">
          <li>Make it easy to emit compliant dCBOR.</li>
          <li>Make it hard to emit non-compliant dCBOR.</li>
          <li>Make it an error to read non-compliant dCBOR.</li>
        </ul>
      </section>
      <section anchor="api-handling-of-maps">
        <name>API Handling of Maps</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that dCBOR APIs provide a dCBOR <tt>Map</tt> structure or similar that models the dCBOR canonical key encoding and order:</t>
        <ul spacing="normal">
          <li>Supports insertion of unencoded key-value pairs.</li>
          <li>Supports iteration through entries in dCBOR canonical key order.</li>
          <li>Supports treating keys as duplicate that have identical dCBOR encodings, e.g., <tt>10</tt> and <tt>10.0</tt>.</li>
        </ul>
        <t>The dCBOR decoder <bcp14>SHOULD</bcp14> return an error if it encounters misordered or duplicate map keys.</t>
      </section>
      <section anchor="api-handling-of-numeric-values">
        <name>API Handling of Numeric Values</name>
        <t>The authors do make the following recommendations:</t>
        <ul spacing="normal">
          <li>The encoder API <bcp14>SHOULD</bcp14> accept any supported numeric type for insertion into the CBOR stream and decide the dCBOR-conformant form for its encoding.</li>
          <li>
            <t>The API <bcp14>SHOULD</bcp14> allow any supported numeric type to be extracted, and return errors when the actual type encountered is not representable in the requested type. For example,
            </t>
            <ul spacing="normal">
              <li>If the encoded value is "1.5" then requesting extraction of the value as floating point will succeed but requesting extraction as an integer will fail.</li>
              <li>Similarly, if the value has a large exponent and therefore can be represented as either a floating point value or a BigNum, then attempting to extract it as a machine integer will fail.</li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="validation-errors">
        <name>Validation Errors</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that a dCBOR decoder return errors when it encounters any of these conditions in the input stream:</t>
        <ul spacing="normal">
          <li>
            <tt>underrun</tt>: early end of stream</li>
          <li>
            <tt>badHeaderValue</tt>: unsupported CBOR major/minor item header</li>
          <li>
            <tt>nonCanonicalNumeric</tt>: An integer, floating-point value, or BigNum was encoded in non-canonical form</li>
          <li>
            <tt>invalidString</tt>: An invalid UTF-8 string was encountered</li>
          <li>
            <tt>unusedData</tt>: Unused data encountered past the expected end of the input stream</li>
          <li>
            <tt>misorderedMapKey</tt>: A map has keys not in canonical order</li>
          <li>
            <tt>duplicateMapKey</tt>: A map has a duplicate key</li>
        </ul>
      </section>
    </section>
    <section anchor="reference-implementations">
      <name>Reference Implementations</name>
      <t>This section is informative.</t>
      <t>The current reference implementations that conform to these specifications are:</t>
      <ul spacing="normal">
        <li>Swift implementation <xref target="SwiftDCBOR"/></li>
        <li>Rust implementation <xref target="RustDCBOR"/></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 either:</t>
      <ul spacing="normal">
        <li>producing semantically different documents that are serialized using identical byte streams, or</li>
        <li>producing semantically equivalent documents that are nonetheless serialized into non-identical byte streams</li>
      </ul>
      <t>The first consideration is unlikely due to the Law of Identity (A is A). The second consideration 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-level requirements for dCBOR. Whether these possibilities present an identifiable attack surface is an open question that developers should consider.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes no requests of IANA.</t>
      <t>We considered requesting a new media type <xref target="RFC6838"/> for deterministic CBOR, e.g., <tt>application/d+cbor</tt>, but chose not to pursue this as all dCBOR is well-formed CBOR. Therefore, existing CBOR codecs can read dCBOR, and many existing codecs can also write dCBOR if the encoding rules are observed. Protocols that adopt dCBOR will simply have more stringent requirments for the CBOR they emit and ingest.</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">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <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="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed">
              <organization/>
            </author>
            <author fullname="J. Klensin" initials="J." surname="Klensin">
              <organization/>
            </author>
            <author fullname="T. Hansen" initials="T." surname="Hansen">
              <organization/>
            </author>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols.  This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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="SUBNORMAL" target="https://en.wikipedia.org/wiki/Subnormal_number">
          <front>
            <title>Subnormal number</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <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>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
5ell92bkaPB/xpPLVzw7AAA=

-->

</rfc>
