<?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.39 (Ruby 3.2.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bormann-cbor-dcbor-01" category="exp" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.5 -->
  <front>
    <title abbrev="CBOR Profiles">Common CBOR Deterministic Encoding and Application Profiles</title>
    <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-dcbor-01"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2023" month="August" day="09"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <abstract>
      <?line 92?>

<t>CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
its Section 4.2, providing some flexibility for application specific
decisions.
To facilitate Deterministic Encoding to be offered as a selectable
feature of generic encoders, the present document discusses a
Common CBOR Deterministic Encoding Profile that can be shared by a
large set of applications with potentially diverging detailed
requirements.
The concept of Application Profiles is layered on top of the
Common CBOR Deterministic Encoding Profile and can address those
more application specific requirements.
The document defines the application profile "Gordian dCBOR" as an
example of an application profile built on the Common CBOR
Deterministic Encoding Profile.</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-bormann-cbor-dcbor/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Concise Binary Object Representation Maintenance and Extensions (CBOR) Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cabo/det"/>.</t>
    </note>
  </front>
  <middle>
    <?line 112?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
its Section 4.2, providing some flexibility for application specific
decisions.
To facilitate Deterministic Encoding to be offered as a selectable
feature of generic encoders, the present document discusses a
Common CBOR Deterministic Encoding Profile that can be shared by a
large set of applications with potentially diverging detailed
requirements.
The concept of Application Profiles is layered on top of the
Common CBOR Deterministic Encoding Profile and can address those
more application specific requirements.
The document defines the application profile "Gordian dCBOR" as an
example of an application profile built on the Common CBOR
Deterministic Encoding Profile.</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="dep">
      <name>Common CBOR Deterministic Encoding Profile</name>
      <t><xref section="4.2.1" sectionFormat="of" target="STD94"/> defines <em>Core Deterministic Encoding
Requirements</em> for CBOR.
It mandates to keep with what are only recommendations for Preferred
Encoding for regular CBOR encoders.
It adds mandates for definite-length encoding and for a
map ordering based on lexicographic ordering of the
(deterministically) encoded map keys.</t>
      <t>Note that this specific set of requirements is elective -- in
principle, other variants of deterministic encoding can be defined
(and have been, being phased out slowly, as detailed in <xref section="4.2.3" sectionFormat="of" target="STD94"/>), or (as many applications of CBOR do today) deterministic
encoding is not used at all.</t>
      <t>The core requirements are designed, however, to provide
well-understood and easy to implement rules while maximizing coverage,
i.e., the subset of CBOR data items that are fully specified by these
rules, and also placing minimal burden on implementations.</t>
      <t><xref section="4.2.2" sectionFormat="of" target="STD94"/> picks up on the interaction of extensibility
(CBOR tags) and deterministic encoding.
CBOR itself uses some tags to increase the range of its basic
generic data types, e.g., tag 2/3 extend the range of basic major
types 0/1 in a seamless way.
<xref section="4.2.2" sectionFormat="of" target="STD94"/> recommends handling this transition the same
way as with the transition between different integer representation
lengths in the basic generic data model, i.e., by mandating the
Preferred Encoding (<xref section="3.4.3" sectionFormat="of" target="STD94"/>).</t>
      <ol spacing="normal" type="1" group="1"><li>The Common CBOR Deterministic Encoding Profile turns this
recommendation into a mandate: Integers that can be represented by
basic major type 0 and 1 are encoded using the deterministic
encoding defined for them, and integers outside this range are
encoded using the preferred serialization (<xref section="3.4.3" sectionFormat="of" target="STD94"/>) of tag 2 and 3 (i.e., no leading zeros).</li>
      </ol>
      <t>Most tags capture more specific application semantics and therefore
may be harder to define a deterministic encoding for.
While the deterministic encoding of their tag internals is often
covered by the <em>Core Deterministic Encoding Requirements</em>, the mapping
of diverging platform application data types on the tag contents may
be hard to do in a deterministic way; see <xref section="3.2" sectionFormat="of" target="I-D.bormann-cbor-det"/> for
more explanation as well as examples.
As the Common CBOR Deterministic Encoding Profile would continually
need to address additional issues raised by the registration of new
tags, this specification RECOMMENDS that new tag registrations address
deterministic encoding in the context of this Profile.</t>
      <t>A particularly difficult field to obtain deterministic encoding for is
floating point numbers, partially because they themselves are often
obtained from processes that are not deterministic between platforms.
See <xref section="3.2.2" sectionFormat="of" target="I-D.bormann-cbor-det"/> for more details.
<xref section="4.2.2" sectionFormat="of" target="STD94"/> presents a number of choices, which need to
be made to obtain a Common CBOR Deterministic Encoding Profile.
Specifically (in the order of the bullet list at the end of <xref section="4.2.2" sectionFormat="of" target="STD94"/>):</t>
      <ol spacing="normal" type="1" group="1"><li>Besides the mandated use of preferred encoding, there is no further
specific action for the different zero values, e.g., an encoder
that is asked by an application to represent a negative floating
point zero will generate 0xf98000.</li>
        <li>There is no attempt to mix integers and floating point numbers,
i.e., all floating point values are encoded as the preferred
floating-point representation that accurately represents the value,
independent of whether the floating point value is, mathematically,
an integral value (choice 2 of the second bullet).</li>
        <li>There is no special handling of NaN values, except that the
preferred encoding rules also apply to NaNs with payloads, using
the canonical encoding of NaNs as defined in <xref target="IEEE754"/>.
Typically, most applications that employ NaNs in their storage and
communication interfaces will only use the NaN with payload 0,
which encodes as 0xf97e00.</li>
        <li>There is no special handling of subnormal values.</li>
        <li>The Common CBOR Deterministic Encoding Profile does not presume
equivalence of floating point values with other representation
(e.g., tag 4/5) with basic floating point values.</li>
      </ol>
      <t>The main intent here is to preserve the basic generic data model, so
application profiles can make their own decisions.  For an example of
that, see <xref target="dcbor-num"/>.</t>
      <t>While <xref target="I-D.rundgren-deterministic-cbor"/> is a relatively terse document that is not always easy
to interpret, to this author its intent appears to be aligned with
that of the Common CBOR Deterministic Encoding Profile defined here.</t>
    </section>
    <section anchor="application-profiles">
      <name>Application Profiles</name>
      <t>The dCBOR Application Profile specifies the use of Deterministic
Encoding as defined in <xref section="4.2" sectionFormat="of" target="STD94"/> (see also <xref target="I-D.bormann-cbor-det"/> for more
information) together with some application-level rules.
As an example, the rules for Gordian dCBOR <xref target="I-D.mcnally-deterministic-cbor"/> are specified
in this section.</t>
      <t>The application-level rules specified by an Application Profile are
based on the same Common CBOR Deterministic Encoding Profile; they do
not "fork" CBOR.</t>
      <t>An Application Profile implementation produces well-formed,
deterministically encoded CBOR according to <xref target="STD94"/>, 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 CBOR
that can be processed by Application Profile implementations, if
handed Application Profile conforming data model level information
from an application.</t>
      <t>Please note that the separation between standard CBOR processing and
the processing required by the Application Profile is a conceptual
one: Both Application Profile processing and standard CBOR processing
can be combined into a special dCBOR/CBOR encoder/decoder.</t>
      <t>An Application Profile is intended to be used in conjunction with an
application, which typically will use a subset of the CBOR generic
data model, which in turn
influences which subset of the application profile is used.
As a result, an Application Profile places no direct requirement on what
subset of CBOR is implemented.
For instance, while the dCBOR application profile defines rules for
the processing of floating point values, 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.</t>
      <section anchor="dcbor">
        <name>Gordian dCBOR</name>
        <t>Gordian dCBOR <xref target="I-D.mcnally-deterministic-cbor"/> provides an application profile that
requires encoders to produce valid CBOR in deterministic encoding as
defined in the Common CBOR Deterministic Encoding Profile.
Gordian dCBOR also requires dCBOR decoders to reject CBOR data items
that were not deterministically encoded.</t>
        <t>Beyond the Common CBOR Deterministic Encoding Profile, dCBOR imposes
certain limitations on the CBOR basic generic data model.
Some items that can be represented in the CBOR basic generic data
model are entirely outlawed by this application profile.
Other items are represented by what are considered equivalent data
items by the dCBOR equivalence model, so a recipient application might
receive data that may not be the same data in the CBOR equivalence
model as the ones the generating application produced.</t>
        <t>These restrictions mainly are about numeric values, which are therefore
the subject of the main subsection of this section.</t>
        <section anchor="removing-simple-values">
          <name>Removing Simple Values</name>
          <t>Only the three simple values <tt>false</tt> (0xf4), <tt>true</tt> (0xf5), and <tt>null</tt>
(0xf6) are allowed at the application level; the remaining 253 values
must be rejected.</t>
        </section>
        <section anchor="removing-integer-values">
          <name>Removing Integer Values</name>
          <t>Only the integer values in range [<tt>-2</tt><sup><tt>63</tt></sup>,
<tt>2</tt><sup><tt>64</tt></sup><tt>-1</tt>] can be expressed in dCBOR.
Note that the range is asymmetric, with only 2<sup>63</sup> negative
values, but 2<sup>64</sup> unsigned (non-negative) values, creating an
(approximately) 64.6 bit integer.</t>
          <t>This maps to a choice between a platform 64-bit two's complement
signed integer (often called int64) and a 64-bit unsigned integer (uint64).
(Specific applications will, of course, further restrict valid ranges of
integers, based on their position and semantics in the CBOR data item.)</t>
        </section>
        <section anchor="dcbor-num">
          <name>Numeric Reduction of Floating-Point Values</name>
          <t>dCBOR implementations that do support floating point numbers <bcp14>MUST</bcp14>
perform the following two reductions of numeric values when
constructing CBOR data items:</t>
          <ol spacing="normal" type="1"><li>
              <t>When representing integral floating point values (floating point
values with a zero fractional part), check whether the
mathematically identical value can be represented as a dCBOR integer value.
If that is the case, convert the integral floating point
to that mathematically identical integer value before encoding it.
(Deterministic Encoding will then ensure the shortest length encoding
is used.)
This means that if a floating point value has a non-zero fractional part, or an
exponent that takes it out of the range of basic integers, the
original floating point value is used for encoding.
(Specifically, conversion to a bignum is never considered.)  </t>
              <t>
This also means that the three representations of a zero number in CBOR
(0, 0.0, -0.0 in diagnostic notation) are all reduced to the basic
integer 0 (with preferred encoding 0x00).  </t>
              <t>
Note that this reduction can turn valid maps into invalid ones, as it
can create duplicate keys, e.g., for:  </t>
              <sourcecode type="cbor-diag"><![CDATA[
{
   10: "integer ten",
   10.0: "floating ten"
}
]]></sourcecode>
              <t>
This means that, at the application level, the application <bcp14>MUST</bcp14>
prevent the creation of maps that would turn invalid in dCBOR
processing.</t>
            </li>
            <li>In addition, represent all <tt>NaN</tt> values by using the quiet <tt>NaN</tt>
value having the half-width CBOR representation <tt>0xf97e00</tt> before
encoding.</li>
          </ol>
          <t>dCBOR-based applications <bcp14>MUST</bcp14> accept these "reduced" numbers in place
of the original value, e.g., a dCBOR-based application that expects a
floating point value needs to accept a basic integer value in its
place (and, if needed, convert it to a floating point value for its
own further processing).</t>
          <t>dCBOR-based applications <bcp14>MUST NOT</bcp14> accept numbers that have not been
reduced as specified in this section, except maybe by making the
unreduced numbers available for their diagnostic value when there has
been an explicit request to do so.
This is similar to a checking flag mentioned in Section 5.1 (API
Considerations) of <xref target="I-D.bormann-cbor-det"/> being set by default.</t>
        </section>
      </section>
      <section anchor="extensibility">
        <name>Extensibility</name>
        <t><xref target="I-D.mcnally-deterministic-cbor"/> does not discuss extensibility.
A meaningful way to handle extensibility in this application profile
would be to lift value range restrictions, keeping the
profile-specific equivalence rules show here intact and possibly
adding equivalences as needed for newly allowed values.
This requires further discussion.</t>
      </section>
    </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="gordian-dcbor-application-profile">
        <name>Gordian dCBOR Application Profile</name>
        <section anchor="typescript">
          <name>TypeScript</name>
          <ul spacing="normal">
            <li>Implementation Location: <xref target="bc-dcbor-ts"/></li>
            <li>Primary Maintainer:</li>
            <li>Languages: TypeScript (transpiles to JavaScript)</li>
            <li>Coverage:</li>
            <li>Testing:</li>
            <li>Licensing:</li>
          </ul>
        </section>
        <section anchor="swift">
          <name>Swift</name>
          <ul spacing="normal">
            <li>Implementation Location: <xref target="BCSwiftDCBOR"/></li>
            <li>Primary Maintainer:</li>
            <li>Languages: Swift</li>
            <li>Coverage:</li>
            <li>Testing:</li>
            <li>Licensing: BSD-2-Clause-Patent</li>
          </ul>
        </section>
        <section anchor="rust">
          <name>Rust</name>
          <ul spacing="normal">
            <li>Implementation Location: <xref target="bc-dcbor-rust"/></li>
            <li>Primary Maintainer:</li>
            <li>Languages: Rust</li>
            <li>Coverage:</li>
            <li>Testing:</li>
            <li>Licensing: Custom</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"/>.
Based on a previous version of dCBOR that had fewer value
restrictions, to be updated.</li>
            <li>Testing:</li>
            <li>Licensing: Apache-2.0</li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="STD94">
          <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 Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </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="I-D.bormann-cbor-det">
          <front>
            <title>CBOR: On Deterministic Encoding</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="23" month="July" year="2023"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2.  The present document provides additional
   information about use cases, deployment considerations, and
   implementation choices for Deterministic Encoding.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-00"/>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>Gordian dCBOR: A Deterministic CBOR Application Profile</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="8" month="August" year="2023"/>
            <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.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/BlockchainCommons/WIPs-IETF-draft-deterministic-
   cbor.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-05"/>
        </reference>
        <reference anchor="bc-dcbor-ts" target="https://github.com/BlockchainCommons/bc-dcbor-ts">
          <front>
            <title>Blockchain Commons Deterministic CBOR ("dCBOR") for TypeScript</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BCSwiftDCBOR" target="https://github.com/BlockchainCommons/BCSwiftDCBOR">
          <front>
            <title>Blockchain Commons Deterministic CBOR ("dCBOR") for Swift</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="bc-dcbor-rust" target="https://github.com/BlockchainCommons/bc-dcbor-rust">
          <front>
            <title>Blockchain Commons Deterministic CBOR ("dCBOR") for Rust</title>
            <author>
              <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="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-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="I-D.rundgren-deterministic-cbor">
          <front>
            <title>Deterministically Encoded CBOR (D-CBOR)</title>
            <author fullname="Anders Rundgren" initials="A." surname="Rundgren">
              <organization>Independent</organization>
            </author>
            <date day="8" month="August" year="2023"/>
            <abstract>
              <t>   This document describes a deterministic encoding scheme for CBOR
   intended for usage in high-end computing platforms like mobile
   phones, Web browsers, and Web servers.  In addition to enhancing
   interoperability, deterministic encoding can also support
   cryptographic operations like signing CBOR data items.  Using this
   specification, the latter can achieved without wrapping such data in
   byte strings or depend on non-standard canonicalization procedures.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-rundgren-deterministic-cbor-00"/>
        </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 471?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t><xref target="dcbor"/> of this document is based on the work of Wolf McNally and Christopher
Allen as documented in <xref target="I-D.mcnally-deterministic-cbor"/> and discussed in 2023 in the CBOR
working group.</t>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="W." surname="McNally" fullname="Wolf McNally">
        <organization>Blockchain Commons</organization>
        <address>
          <email>wolf@wolfmcnally.com</email>
        </address>
      </contact>
      <contact initials="C." surname="Allen" fullname="Christopher Allen">
        <organization>Blockchain Commons</organization>
        <address>
          <email>christophera@lifewithalacrity.com</email>
        </address>
      </contact>
      <contact initials="A." surname="Rundgren" fullname="Anders Rundgren">
        <organization>Independent</organization>
        <address>
          <postal>
            <city>Montpellier</city>
            <country>France</country>
          </postal>
          <email>anders.rundgren.net@gmail.com</email>
          <uri>https://www.linkedin.com/in/andersrundgren/</uri>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA61c63YbR3L+30/RgX6EdACQBClZgi9rXqRd5kiiQsrx2djO
sjHTANoczGDnQhDWoZ8lP/IkyYvlq6ruuYCgZDmbc1YGZ/pSXV311VfVPRkM
Bup2rA+VKl2Z2LE+zRaLLNWnJxeX+syWNl+41BWli/TLNMpil860SWN9vFwm
LjKlQ9t3eTZ1iS2UmUxyi9G4c/00zqLULDB0nJtpOZhk+cKk6SDCj0HM/yam
tEWpMJydZfl6rO3dUhVlbs1irM9fvn+lVIx3YxVlaWHToirGuswrqwyajHWv
JUzB0l1akwzeu4XtqVWW38zyrFqKWOrGrvEoHit1a9MKY2rtX/dOszRyhdUn
LjX5Wl9MfrFRibGWucWspSz2jXFpaVOTRpanenmHvwqeeYcm2O1hxIVxCQak
xX3nbDkdZvmMns9cOa8m9MZMsr3Ylj2lTFXOs5zkGOB/WrsUqzsd6hPREz8T
/Z2avMBknTcYeKy/T92tzQtX/u9/l/oktws0ev8f59yA1GjLsX6XFeXURHN9
eLh/dLTP7yJXQtnSQR5kMeY5G4yeHz594Z9UaUlb8mdLk6754XKepWj3L0cv
Bkejg8Ho4Png2eGL0QG/tLJ4WuF35a+Olq5o48rcTaqSVzoIK/ohS6b6TfTW
JMk6LMek7ldWNSRLsugmmkPj3iyL9gwrdP6O/lnAvjDAMMoWrbFP5znsNlvO
ba6Pk8Smnz1B1Ixgvkvc1K6wfSYxUQ69bcx2nMbYAX1ZpfEs3zrXOVosLf5J
y5by30AxS5skzuZdfb/KycTa4hieYpj7KYapLb+b0SsRBf9X5W6s52W5LMZ7
e6vVapi49MbCZ6nFnkv3ZIgwwp5SKZlSCesh+7t6f/biaMwjDbB6GC///mas
L1+dPn9xRBZx/vLlyy+f+lalyWdkW2FKZy08N8lyO6SftPV78P4K5lXuPf/y
2bPRSKzKYw0Npq9KSGXyWE+zXL9KMoiTzgbvMriZPoam5wsL9OFujatAQjF9
GoL/ZoDQU5MUorTC5s4WLp1m0l6H2eKxxgIGo/2DF/7F2cX5WB/sDw8O9l/s
USsoYkjvh0FmpWiglqrOB2fDLpBBD0Fz+O2beMuktw2Qcge04n5Z7mZoPIk8
FJbFuK2h3kML3UBlxtqdn3ox/fipt8tqfL9e2iuY6bLsbd0owSG2imYCP/5e
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
67V5AEMAAA==

-->

</rfc>
