<?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.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-caballero-cbor-cbor42-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="CBOR42">The tag-42 profile of CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-caballero-cbor-cbor42-00"/>
    <author fullname="Juan Caballero">
      <organization>IPFS Foundation</organization>
      <address>
        <email>bumblefudge@learningproof.xyz</email>
      </address>
    </author>
    <author fullname="Robin Berjon">
      <organization>IPFS Foundation</organization>
      <address>
        <email>robin@berjon.com</email>
      </address>
    </author>
    <date year="2025" month="November" day="03"/>
    <area/>
    <workgroup>Concise Binary Object Representation Maintenance and Extensions</workgroup>
    <keyword>CBOR</keyword>
    <keyword>deterministic encoding</keyword>
    <keyword>sparkling distributed ledger</keyword>
    <abstract>
      <?line 67?>

<t>This document defines a very narrow profile of CBOR intended for use with the special tag 42.
Like the earlier internet-draft submitted under the name "CBOR Core," much of its design dates to the first CBOR RFC and predates much of the layered approach to determinism and profiling in later years.</t>
      <t>Also like "CBOR/c", CBOR-42 can be used as an internet-scale serialization for JSON, and is optimized for objects that compose into a directed acyclical graph.
Since CBOR-42 objects link to one another by hash-based identifiers tagged "42", deterministic encoding is mandated to verify dereferenced links and encode new ones.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ipfs-tech.github.io/cborc42/draft-caballero-cbor-cborc42.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-caballero-cbor-cbor42/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Concise Binary Object Representation Maintenance and Extensions  mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://www.ietf.org/mail-archive/web/cbor/current/maillist.html"/>.
        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/ipfs-tech/cborc42"/>.</t>
    </note>
  </front>
  <middle>
    <?line 75?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The developer ecosystem around the Interplanetary File System, a distributed system file and document handling, has long made structural usage of its own home-grown CBOR profile, dating from the early days of the CBOR working group and fine-tuned over the years in community/internal venues.
Configuring CBOR tooling in various languages to decode this data and encode new data conformantly has been a challenge, and a unified specification (updated to modern terminology, as the CBOR working group has iterated and evolved so much in the intervening years) is set out in this document.</t>
      <t>Note: unlike the CBOR/c specification, no opinion on best practices for hashing or signing mechanisms is expressed here, and will be addressed in separate documents, if at all.</t>
      <section anchor="design-goals">
        <name>Design Goals</name>
        <t>The primary goal of this specification is enabling application developers to configure CBOR tooling for this profile, and for CBOR tooling to support such configuration, in as language-agnostic a way as possible.
The historical design of this profile was to maximize determinism and simplicity for an internet-scale directed acyclical graph of CBOR documents linked to one another by binary hashes.
These simple content identifiers, defined in Appendix A, are always expressed as bytestrings of tag 42 (similar in design to <xref target="RFC6920"/> Named Information Hashes).
All other tags, and many major and minor types, are forbidden to reduce ambiguity, and developers are encouraged to express many kinds of data at higher layers by using the supported types (such as strings or bytestrings).</t>
      </section>
      <section anchor="requirements-language">
        <name>Requirements Language</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 anchor="common-definitions">
        <name>Common Definitions</name>
        <ul spacing="normal">
          <li>
            <t>This document uses the conventions defined in CDDL <xref target="RFC8610"/> for expressing the type of CBOR <xref target="RFC8949"/> data items.</t>
          </li>
          <li>
            <t>Examples showing CBOR data, are expressed in "diagnostic notation" as defined in Section 8 of <xref target="RFC8949"/>.</t>
          </li>
          <li>
            <t>The term "CBOR object" is equivalent to "CBOR data item" used in <xref target="RFC8949"/>.</t>
          </li>
          <li>
            <t>The term "CBOR Core" is in this document abbreviated to "CBOR/c".</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="specification">
      <name>Specification</name>
      <t>This section describes how CBOR-42 subsets CBOR and differs from a standard CDE encoding.</t>
      <section anchor="supported-cbor-objects">
        <name>Supported CBOR Objects</name>
        <table>
          <thead>
            <tr>
              <th align="left">CBOR</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">int</td>
              <td align="left">Integer</td>
            </tr>
            <tr>
              <td align="left">float</td>
              <td align="left">64-bit <xref target="IEEE754"/> numbers ONLY</td>
            </tr>
            <tr>
              <td align="left">tstr</td>
              <td align="left">Text string encoded as UTF-8 <xref target="RFC3629"/></td>
            </tr>
            <tr>
              <td align="left">bstr</td>
              <td align="left">Byte string</td>
            </tr>
            <tr>
              <td align="left">[]</td>
              <td align="left">Array</td>
            </tr>
            <tr>
              <td align="left">{}</td>
              <td align="left">Map</td>
            </tr>
            <tr>
              <td align="left">tag 42</td>
              <td align="left">See Appendix A; no other tags allowed</td>
            </tr>
            <tr>
              <td align="left">bool</td>
              <td align="left">Boolean true and false (major type 7)</td>
            </tr>
            <tr>
              <td align="left">null</td>
              <td align="left">Represents a null object (major type 7)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="deterministic-encoding-scheme-profile">
        <name>Deterministic Encoding Scheme Profile</name>
        <t>As in CBOR/c, deterministic encoding is mandatory. The encoding scheme adheres to Section 4.2 of <xref target="RFC8949"/>, but adds a few constraints (denoted below by RFC+), where this RFC offers choices. The following list contains a summary of the deterministic encoding rules:</t>
        <ul spacing="normal">
          <li>
            <t>RFC+: Floating-point and integer objects <bcp14>MUST</bcp14> be treated as distinct types regardless of their numeric value. This is compliant with Rule 2 in Section 4.2.2 of <xref target="RFC8949"/>.</t>
          </li>
          <li>
            <t>RFC: Integers, represented by the int and bigint types, <bcp14>MUST</bcp14> use the int type if the value is between -2^64 and 2^64-1; otherwise, as with timestamp data, they must be encoded at higher layers, whether as bytestrings or strings.
            </t>
            <ul spacing="normal">
              <li>
                <t>Appendix B.1 features a list of integer sample values and their expected encoding.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>RFC+: UNLIKE CBOR/c and standard CDE encoding, floating-point numbers <bcp14>MUST</bcp14> always be encoded using the longest <xref target="IEEE754"/> variant. Appendix B.2 features a list of floating-point sample values and their expected encoding.</t>
          </li>
          <li>
            <t>RFC+: NaN values with payloads (like f97e01), or having the most significant bit set ("signaling"), <bcp14>MUST</bcp14> be rejected. See also Appendix B.4 for invalid NaN variants.</t>
          </li>
          <li>
            <t>RCF+: UNLIKE CBOR/c and standard CDE encoding, map keys <bcp14>MUST</bcp14> be typed as strings; no other types are allowed as map keys.</t>
          </li>
          <li>
            <t>RFC: Map keys <bcp14>MUST</bcp14> be sorted in the bytewise lexicographic order of their deterministic encoding. Duplicate keys (i.e. keys with identical deterministic bytestring values) <bcp14>MUST</bcp14> be rejected; note that semantic equivalence is not tested. As per the "Canonical CBOR" section (3.9) in <xref target="RFC7049"/>, the following represents a properly sorted map:
{
"a": ... ,
"b": ... ,
"aa": ...
}</t>
          </li>
          <li>
            <t>RFC+: Since CBOR encodings according to this specification maintain uniqueness, there are no specific restrictions or tests needed in order to determine map key equivalence. As an (extreme) example, the floating-point numbers 0.0 and -0.0, and the integer number 0 could all get force-typed as three distinct strings (<tt>0.0</tt>, <tt>-0.0</tt>, and <tt>0</tt>) without colliding.</t>
          </li>
          <li>
            <t>RFC: Indefinite length objects <bcp14>MUST</bcp14> be rejected.</t>
          </li>
        </ul>
      </section>
      <section anchor="cbor-tool-requirements">
        <name>CBOR Tool Requirements</name>
        <t>CBOR-42 is designed to allow hashing and signing in raw form.</t>
        <t>To make "raw" signing safe and verification of such signatures practical, CBOR tooling capable of the following is required:</t>
        <ul spacing="normal">
          <li>
            <t>It <bcp14>MUST</bcp14> be possible to find out the type of a CBOR object, before it is accessed.</t>
          </li>
          <li>
            <t>It <bcp14>MUST</bcp14> be possible to add, delete, and update the contents of CBOR map and array objects, of decoded CBOR data.</t>
          </li>
          <li>
            <t>It <bcp14>MUST</bcp14> be possible to reserialize decoded CBOR data, be it updated or not.</t>
          </li>
          <li>
            <t>Irrespective of whether CBOR data is decoded, updated, or created programmatically, deterministic encoding <bcp14>MUST</bcp14> be maintained.</t>
          </li>
          <li>
            <t>Invalid or unsupported CBOR constructs, as well as CBOR data not adhering to the deterministic encoding scheme <bcp14>MUST</bcp14> be rejected. See also Appendix D and Appendix B.4.</t>
          </li>
        </ul>
        <section anchor="protocol-primitives">
          <name>Protocol Primitives</name>
          <t>To facilitate cross-platform protocol interoperability, implementers of CBOR-42 compatible tools <bcp14>SHOULD</bcp14> include decoder API support for the following primitives.</t>
          <table>
            <thead>
              <tr>
                <th align="left">CBOR</th>
                <th align="left">Primitive</th>
                <th align="left">Comment</th>
                <th align="left">Note</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">int</td>
                <td align="left">Int8</td>
                <td align="left">8-bit signed integer</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">uint</td>
                <td align="left">Uint8</td>
                <td align="left">8-bit unsigned integer</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">int</td>
                <td align="left">Int16</td>
                <td align="left">16-bit signed integer</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">uint</td>
                <td align="left">Uint16</td>
                <td align="left">16-bit unsigned integer</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">int</td>
                <td align="left">Int32</td>
                <td align="left">32-bit signed integer</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">uint</td>
                <td align="left">Uint32</td>
                <td align="left">32-bit unsigned integer</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">int</td>
                <td align="left">Int64</td>
                <td align="left">64-bit signed integer</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">uint</td>
                <td align="left">Uint64</td>
                <td align="left">64-bit unsigned integer</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">float</td>
                <td align="left">Float64</td>
                <td align="left">64-bit floating-point number</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">bool</td>
                <td align="left">Boolean</td>
                <td align="left">Boolean</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">null</td>
                <td align="left">Null</td>
                <td align="left">Null</td>
                <td align="left">2</td>
              </tr>
              <tr>
                <td align="left">#7.nnn</td>
                <td align="left">Simple</td>
                <td align="left">ONLY null, false, true</td>
                <td align="left">3</td>
              </tr>
              <tr>
                <td align="left">tstr</td>
                <td align="left">String</td>
                <td align="left">Text string</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">bstr</td>
                <td align="left">Bytes</td>
                <td align="left">Byte string</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">See note</td>
                <td align="left">EpochTime</td>
                <td align="left">Time object expressed as a number</td>
                <td align="left">4</td>
              </tr>
              <tr>
                <td align="left">See note</td>
                <td align="left">DateTime</td>
                <td align="left">Time object expressed as a text string</td>
                <td align="left">4</td>
              </tr>
            </tbody>
          </table>
          <ol spacing="normal" type="1"><li>
              <t>Range testing <bcp14>MUST</bcp14> be performed using the traditional ranges for unsigned respectively two-complement numbers. That is, a hypothetical getUint8() <bcp14>MUST</bcp14> reject numbers outside of 0 to 255, whereas a hypothetical getInt8(), <bcp14>MUST</bcp14> reject numbers outside of -128 to 127.</t>
            </li>
            <li>
              <t>Since a CBOR null typically represents the absence of a value, a decoder <bcp14>MUST</bcp14> provide a test-function, like isNull().</t>
            </li>
            <li>
              <t>Simple values in CBOR and CBOR/c include the ranges 0-23 and 32-255, all but three of which are invalid in CBOR-42; however, the capability to refer to boolean values (i.e. <tt>true</tt> and <tt>false</tt>) and <tt>null</tt> as major-type 7 simple values <bcp14>MUST</bcp14> be supported to guarantee interoperability with CBOR tooling generally.</t>
            </li>
            <li>
              <t>Since CBOR lacks a native-level time object, Section 3.4 of <xref target="RFC8949"/> introduces two variants of time objects using the CBOR tags 0 and 1, neither of which are supported by the CBOR/c-42 data model for historical interoperability reasons. To support time encoding stably, it is <bcp14>RECOMMENDED</bcp14> that EpochTime and/or DateTime types in input be force-typed as strings at the application level or at the ALDR level. Interoperability with other tooling may be difficult to achieve if support for these APIs is desired, and validating dates at higher layers may introduce new security issues at higher layers.</t>
            </li>
          </ol>
          <t>If a call does not match the underlying CBOR type, the call <bcp14>MUST</bcp14> be rejected.</t>
        </section>
        <section anchor="media-type">
          <name>Media Type</name>
          <t>Protocols transmitting CBOR-42 over HTTP interfaces are <bcp14>RECOMMENDED</bcp14> to send all CBOR-42 data with a media type header of <tt>application/cbor</tt>.</t>
        </section>
        <section anchor="cbor-sequences">
          <name>CBOR Sequences</name>
          <t>Concatenating or streaming CBOR objects is strongly discouraged except in contexts where the <tt>application/cbor-seq</tt> media type can be used to set decoder expectations appropriately.
See <xref target="RFC8742"/> for guidance on streaming best practices.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>It is assumed that CBOR-42 has no novel security issues compared to CBOR Deterministic Encoding as defined in <xref target="RFC8949"/> but the authors would appreciate any hypotheses or evidence to the contrary.</t>
      <t>It should be noted that there has been to date little implementer feedback on the ALDR suggestions outlined in the appendices.
As such, these should be considered as an understudied security surface for the application layer to consider.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <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="RFC8742">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes the Concise Binary Object Representation (CBOR) Sequence format and associated media type "application/cbor-seq". A CBOR Sequence consists of any number of encoded CBOR data items, simply concatenated in sequence.</t>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation. This specification defines and registers "+cbor-seq" as a structured syntax suffix for CBOR Sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8742"/>
          <seriesInfo name="DOI" value="10.17487/RFC8742"/>
        </reference>
        <reference anchor="RFC7049">
          <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="October" year="2013"/>
            <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>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="IEEE754">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization/>
            </author>
            <date month="July" year="2019"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/ieeestd.2019.8766229"/>
          <seriesInfo name="ISBN" value="[&quot;9781504459242&quot;]"/>
          <refcontent>IEEE</refcontent>
        </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 anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values. This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="RFC6256">
          <front>
            <title>Using Self-Delimiting Numeric Values in Protocols</title>
            <author fullname="W. Eddy" initials="W." surname="Eddy"/>
            <author fullname="E. Davies" initials="E." surname="Davies"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Self-Delimiting Numeric Values (SDNVs) have recently been introduced as a field type in proposed Delay-Tolerant Networking protocols. SDNVs encode an arbitrary-length non-negative integer or arbitrary- length bitstring with minimum overhead. They are intended to provide protocol flexibility without sacrificing economy and to assist in future-proofing protocols under development. This document describes formats and algorithms for SDNV encoding and decoding, along with notes on implementation and usage. This document is a product of the Delay-Tolerant Networking Research Group and has been reviewed by that group. No objections to its publication as an RFC were raised. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6256"/>
          <seriesInfo name="DOI" value="10.17487/RFC6256"/>
        </reference>
        <reference anchor="RFC6920">
          <front>
            <title>Naming Things with Hashes</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="D. Kutscher" initials="D." surname="Kutscher"/>
            <author fullname="C. Dannewitz" initials="C." surname="Dannewitz"/>
            <author fullname="B. Ohlman" initials="B." surname="Ohlman"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document defines a set of ways to identify a thing (a digital object in this case) using the output from a hash function. It specifies a new URI scheme for this purpose, a way to map these to HTTP URLs, and binary and human-speakable formats for these names. The various formats are designed to support, but not require, a strong link to the referenced object, such that the referenced object may be authenticated to the same degree as the reference to it. The reason for this work is to standardise current uses of hash outputs in URLs and to support new information-centric applications and other uses of hash outputs in protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6920"/>
          <seriesInfo name="DOI" value="10.17487/RFC6920"/>
        </reference>
        <reference anchor="MULTIFORMATS" target="https://github.com/multiformats/multicodec/">
          <front>
            <title>Multiformats Community Registry</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="DASL.ING" target="https://dasl.ing/cid.html">
          <front>
            <title>DASL Content Identifiers</title>
            <author initials="R." surname="Berjon" fullname="Robin Berjon">
              <organization/>
            </author>
            <author initials="J." surname="Caballero" fullname="Juan Caballero">
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="protobuf" target="https://www.ietf.org/archive/id/draft-rfernando-protocol-buffers-00.txt">
          <front>
            <title>Encoding rules and MIME type for Protocol Buffers</title>
            <author>
              <organization/>
            </author>
            <date year="2012"/>
          </front>
        </reference>
        <reference anchor="ECMASCRIPT" target="https://www.ecma-international.org/publications/standards/Ecma-262.htm">
          <front>
            <title>ECMAScript® 2024 Language Specification</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 219?>

<section anchor="binary-content-identifiers">
      <name>Binary Content Identifiers</name>
      <t>A simple hash-based "content identifier" is used to link documents in the graph for which CBOR-42 was designed, and tag 42 was registered specifically for those link identifiers in the IANA registry, "Concise Binary Object Representation (CBOR) Tags" created by <eref target="https://datatracker.ietf.org/doc/html/rfc8949#section-9.2">Section 9.2</eref> of <xref target="RFC8949"/>.</t>
      <t>Being able to navigate or generate new links in this graph are strictly unrelated concerns and of course optional for a CBOR-42 encoder and decoder, so this entire section is provided informationally for the purposes of making less opaque the bytestrings marked by tag 42.
Some CBOR-42 parsers may want to introspect the tag 42 values, if only to know which dereference to other CBOR-42 (or vanilla CBOR) documents.</t>
      <t>Note: this describes tag-42 values from the perspective of the CBOR documents in which they are embedded; a simpler, "application developer"-oriented overview of content identifiers can be found at <xref target="DASL.ING"/>.</t>
      <t>The format consists of a few sigils prepended to a hash of the linked document; there are many possible values for these sigils but these are like CBOR tags, extension points rather than required features of the system.
All the sigils and the hash are of variable length, encoded as Self-Delimiting Numeric Values (<xref target="RFC6256"/>).
The sequence of segments is as follows:</t>
      <ol spacing="normal" type="1"><li>
          <t>Mandatory padding byte <tt>0x00</tt>. This is required for interoperability with non-CBOR CID systems and for historical reasons (see Legacy Support section below).</t>
        </li>
        <li>
          <t>Version byte: <tt>0x01</tt> is the only value to expect in a general-purpose tool.  <tt>0x00</tt> refers to a legacy form explained below, with <tt>0x02</tt> and <tt>0x03</tt> reserved for potential future use.</t>
        </li>
        <li>
          <t>A contextualizing sigil roughly mapping to content types taken from a community registry called <xref target="MULTIFORMATS"/>. The only values that all CBOR/c-42 decoders need to recognize are:
          </t>
          <ol spacing="normal" type="1"><li>
              <t><tt>0x71</tt> - CBOR/c-42</t>
            </li>
            <li>
              <t><tt>0x51</tt> - Any other form of CBOR</t>
            </li>
            <li>
              <t><tt>0x55</tt> - Raw, unstructured binary</t>
            </li>
          </ol>
        </li>
        <li>
          <t>A hash-function sigil, drawn from the same registry. Likewise, the vast majority of values here are optional extensions; the required hash functions to be aware of are:
          </t>
          <ol spacing="normal" type="1"><li>
              <t><tt>0x12</tt> - SHA-256</t>
            </li>
          </ol>
        </li>
        <li>
          <t>A hash-length (as SDNV).</t>
        </li>
        <li>
          <t>The hash (all remaining bytes).</t>
        </li>
      </ol>
      <section anchor="legacy-support">
        <name>Legacy Support</name>
        <t>Any tag 42 value that does NOT begin with <tt>0x00</tt> can be considered malformed, and any attempt to recuperate legacy links or variations from such a value is entirely optional.</t>
        <t>The most common form of legacy data from deprecated encodings is the historical v0 form IPFS content identifiers, which were always 34 bytes long and consisted only of segments 4 (<tt>0x12</tt>), 5 (<tt>0x20</tt>, i.e. 32 bytes) and 6 above (a 32-byte SHA256 hash).
Prepending <tt>0x00</tt> (padding byte), <tt>0x01</tt> (CID version), <tt>0x70</tt> (DAG-profiled protobuf) turns these into valid "v1" content identifiers, although they still dereference to protobuf objects rather than CBOR objects.
For guidance on protobuf deserialization, see protobuf.dev or the relevant <xref target="protobuf"/> draft RFC.</t>
        <t>Likewise, some specialized applications that can strictly assume segments 1-3 or 1-5 will be invariant systemwide have been observed to use "truncated" content identifiers, prepending the invariant prefixes only in transformations at point of egress for interoperability purposes.
This is not best practice but can also serve as some explanation for the padding byte.</t>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <section anchor="integers">
        <name>Integers</name>
        <table>
          <thead>
            <tr>
              <th align="left">Diagnostic Notation</th>
              <th align="left">CBOR Encoding</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">00</td>
              <td align="left">Smallest positive implicit int</td>
            </tr>
            <tr>
              <td align="left">-1</td>
              <td align="left">20</td>
              <td align="left">Smallest negative implicit int</td>
            </tr>
            <tr>
              <td align="left">23</td>
              <td align="left">17</td>
              <td align="left">Largest positive implicit int</td>
            </tr>
            <tr>
              <td align="left">-24</td>
              <td align="left">37</td>
              <td align="left">Largest negative implicit int</td>
            </tr>
            <tr>
              <td align="left">24</td>
              <td align="left">1818</td>
              <td align="left">Smallest positive one-byte int</td>
            </tr>
            <tr>
              <td align="left">-25</td>
              <td align="left">3818</td>
              <td align="left">Smallest negative one-byte int</td>
            </tr>
            <tr>
              <td align="left">255</td>
              <td align="left">18ff</td>
              <td align="left">Largest positive one-byte int</td>
            </tr>
            <tr>
              <td align="left">-256</td>
              <td align="left">38ff</td>
              <td align="left">Largest negative one-byte int</td>
            </tr>
            <tr>
              <td align="left">256</td>
              <td align="left">190100</td>
              <td align="left">Smallest positive two-byte int</td>
            </tr>
            <tr>
              <td align="left">-257</td>
              <td align="left">390100</td>
              <td align="left">Smallest negative two-byte int</td>
            </tr>
            <tr>
              <td align="left">65535</td>
              <td align="left">19ffff</td>
              <td align="left">Largest positive two-byte int</td>
            </tr>
            <tr>
              <td align="left">-65536</td>
              <td align="left">39ffff</td>
              <td align="left">Largest negative two-byte int</td>
            </tr>
            <tr>
              <td align="left">65536</td>
              <td align="left">1a00010000</td>
              <td align="left">Smallest positive four-byte int</td>
            </tr>
            <tr>
              <td align="left">-65537</td>
              <td align="left">3a00010000</td>
              <td align="left">Smallest negative four-byte int</td>
            </tr>
            <tr>
              <td align="left">4294967295</td>
              <td align="left">1affffffff</td>
              <td align="left">Largest positive four-byte int</td>
            </tr>
            <tr>
              <td align="left">-4294967296</td>
              <td align="left">3affffffff</td>
              <td align="left">Largest negative four-byte int</td>
            </tr>
            <tr>
              <td align="left">4294967296</td>
              <td align="left">1b0000000100000000</td>
              <td align="left">Smallest positive eight-byte int</td>
            </tr>
            <tr>
              <td align="left">-4294967297</td>
              <td align="left">3b0000000100000000</td>
              <td align="left">Smallest negative eight-byte int</td>
            </tr>
            <tr>
              <td align="left">18446744073709551615</td>
              <td align="left">1bffffffffffffffff</td>
              <td align="left">Largest positive eight-byte int</td>
            </tr>
            <tr>
              <td align="left">-18446744073709551616</td>
              <td align="left">3bffffffffffffffff</td>
              <td align="left">Largest negative eight-byte int</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="floating-point-numbers">
        <name>Floating Point Numbers</name>
        <t>The textual representation of the values is based on the serialization method for the Number data type, defined by <xref target="ECMASCRIPT"/> with one change: to comply with diagnostic notation (section 8 of <xref target="RFC8949"/>), all values are expressed as floating-point numbers. The rationale for using <xref target="ECMASCRIPT"/> serialization is because it is supposed to generate the shortest and most correct representation of <xref target="IEEE754"/> numbers.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Diagnostic Notation</th>
              <th align="left">CBOR-42 Encoding</th>
              <th align="left">CBOR Encoding</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0.0</td>
              <td align="left">f90000</td>
              <td align="left">f90000</td>
              <td align="left">Zero</td>
            </tr>
            <tr>
              <td align="left">-0.0</td>
              <td align="left">f98000</td>
              <td align="left">f98000</td>
              <td align="left">Negative zero</td>
            </tr>
            <tr>
              <td align="left">Infinity</td>
              <td align="left">invalid</td>
              <td align="left">f97c00</td>
              <td align="left">Infinity</td>
            </tr>
            <tr>
              <td align="left">-Infinity</td>
              <td align="left">invalid</td>
              <td align="left">f9fc00</td>
              <td align="left">Negative infinity</td>
            </tr>
            <tr>
              <td align="left">NaN</td>
              <td align="left">invalid</td>
              <td align="left">f97e00</td>
              <td align="left">Not a number</td>
            </tr>
            <tr>
              <td align="left">5.960464477539063e-8</td>
              <td align="left">fb3e70000000000000</td>
              <td align="left">f90001</td>
              <td align="left">Smallest positive subnormal float16</td>
            </tr>
            <tr>
              <td align="left">0.00006097555160522461</td>
              <td align="left">fb3f0ff80000000000</td>
              <td align="left">f903ff</td>
              <td align="left">Largest positive subnormal float16</td>
            </tr>
            <tr>
              <td align="left">0.00006103515625</td>
              <td align="left">fb 3f10000000000000</td>
              <td align="left">f90400</td>
              <td align="left">Smallest positive float16</td>
            </tr>
            <tr>
              <td align="left">65504.0</td>
              <td align="left">fb 40effc0000000000</td>
              <td align="left">f97bff</td>
              <td align="left">Largest positive float16</td>
            </tr>
            <tr>
              <td align="left">1.401298464324817e-45</td>
              <td align="left">fb36a0000000000000</td>
              <td align="left">fa00000001</td>
              <td align="left">Smallest positive subnormal float32</td>
            </tr>
            <tr>
              <td align="left">1.1754942106924411e-38</td>
              <td align="left">fb380fffffc0000000</td>
              <td align="left">fa007fffff</td>
              <td align="left">Largest positive subnormal float32</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222875e-38</td>
              <td align="left">fb3810000000000000</td>
              <td align="left">fa00800000</td>
              <td align="left">Smallest positive float32</td>
            </tr>
            <tr>
              <td align="left">3.4028234663852886e+38</td>
              <td align="left">fb 47efffffe0000000</td>
              <td align="left">fa7f7fffff</td>
              <td align="left">Largest positive float32</td>
            </tr>
            <tr>
              <td align="left">5.0e-324</td>
              <td align="left">fb0000000000000001</td>
              <td align="left">fb0000000000000001</td>
              <td align="left">Smallest positive subnormal float64</td>
            </tr>
            <tr>
              <td align="left">2.225073858507201e-308</td>
              <td align="left">fb000fffffffffffff</td>
              <td align="left">fb000fffffffffffff</td>
              <td align="left">Largest positive subnormal float64</td>
            </tr>
            <tr>
              <td align="left">2.2250738585072014e-308</td>
              <td align="left">fb0010000000000000</td>
              <td align="left">fb0010000000000000</td>
              <td align="left">Smallest positive float64</td>
            </tr>
            <tr>
              <td align="left">1.7976931348623157e+308</td>
              <td align="left">fb7fefffffffffffff</td>
              <td align="left">fb7fefffffffffffff</td>
              <td align="left">Largest positive float64</td>
            </tr>
            <tr>
              <td align="left">-0.0000033333333333333333</td>
              <td align="left">fbbecbf647612f3696</td>
              <td align="left">fbbecbf647612f3696</td>
              <td align="left">Randomly selected number</td>
            </tr>
            <tr>
              <td align="left">10.559998512268066</td>
              <td align="left">fb40251eb820000000</td>
              <td align="left">fa4128f5c1</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">10.559998512268068</td>
              <td align="left">fb40251eb820000001</td>
              <td align="left">fb40251eb820000001</td>
              <td align="left">Next in succession</td>
            </tr>
            <tr>
              <td align="left">295147905179352830000.0</td>
              <td align="left">fb 4430000000000000</td>
              <td align="left">fa61800000</td>
              <td align="left">268 (diagnostic notation truncates precision)</td>
            </tr>
            <tr>
              <td align="left">2.0</td>
              <td align="left">fb4000000000000000</td>
              <td align="left">f94000</td>
              <td align="left">Number without a fractional part</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539063e-8</td>
              <td align="left">fbbe70000000000000</td>
              <td align="left">f98001</td>
              <td align="left">Smallest negative subnormal float16</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539062e-8</td>
              <td align="left">fbbe6fffffffffffff</td>
              <td align="left">fbbe6fffffffffffff</td>
              <td align="left">Adjacent smallest negative subnormal float16</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539064e-8</td>
              <td align="left">fbbe70000000000001</td>
              <td align="left">fbbe70000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">-5.960465188081798e-8</td>
              <td align="left">fbbe70000020000000</td>
              <td align="left">fab3800001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.0000609755516052246</td>
              <td align="left">fb3f0ff7ffffffffff</td>
              <td align="left">fb3f0ff7ffffffffff</td>
              <td align="left">Adjacent largest subnormal float16</td>
            </tr>
            <tr>
              <td align="left">0.000060975551605224616</td>
              <td align="left">fb3f0ff80000000001</td>
              <td align="left">fb3f0ff80000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.000060975555243203416</td>
              <td align="left">fb3f0ff8002000000</td>
              <td align="left">fa387fc001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.00006103515624999999</td>
              <td align="left">fb3f0fffffffffffff</td>
              <td align="left">fb3f0fffffffffffff</td>
              <td align="left">Adjacent smallest float16</td>
            </tr>
            <tr>
              <td align="left">0.00006103515625000001</td>
              <td align="left">fb3f10000000000001</td>
              <td align="left">fb3f10000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.00006103516352595761</td>
              <td align="left">fb3f10000020000000</td>
              <td align="left">fa38800001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">65503.99999999999</td>
              <td align="left">fb40effbffffffffff</td>
              <td align="left">fb40effbffffffffff</td>
              <td align="left">Adjacent largest float16</td>
            </tr>
            <tr>
              <td align="left">65504.00000000001</td>
              <td align="left">fb40effc0000000001</td>
              <td align="left">fb40effc0000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">65504.00390625</td>
              <td align="left">fb40effc0020000000</td>
              <td align="left">fa477fe001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">1.4012984643248169e-45</td>
              <td align="left">fb369fffffffffffff</td>
              <td align="left">fb369fffffffffffff</td>
              <td align="left">Adjacent smallest subnormal float32</td>
            </tr>
            <tr>
              <td align="left">1.4012984643248174e-45</td>
              <td align="left">fb36a0000000000001</td>
              <td align="left">fb36a0000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">1.175494210692441e-38</td>
              <td align="left">fb380fffffbfffffff</td>
              <td align="left">fb380fffffbfffffff</td>
              <td align="left">Adjacent largest subnormal float32</td>
            </tr>
            <tr>
              <td align="left">1.1754942106924412e-38</td>
              <td align="left">fb380fffffc0000001</td>
              <td align="left">fb380fffffc0000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222874e-38</td>
              <td align="left">fb380fffffffffffff</td>
              <td align="left">fb380fffffffffffff</td>
              <td align="left">Adjacent smallest float32</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222878e-38</td>
              <td align="left">fb3810000000000001</td>
              <td align="left">fb3810000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">3.4028234663852882e+38</td>
              <td align="left">fb47efffffdfffffff</td>
              <td align="left">fb47efffffdfffffff</td>
              <td align="left">Adjacent largest float32</td>
            </tr>
            <tr>
              <td align="left">3.402823466385289e+38</td>
              <td align="left">fb47efffffe0000001</td>
              <td align="left">fb47efffffe0000001</td>
              <td align="left">-"-</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="miscellaneous-items">
        <name>Miscellaneous Items</name>
        <table>
          <thead>
            <tr>
              <th align="left">Diagnostic Notation</th>
              <th align="left">CBOR Encoding</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">true</td>
              <td align="left">f5</td>
              <td align="left">Boolean true (allowed simple value)</td>
            </tr>
            <tr>
              <td align="left">null</td>
              <td align="left">f6</td>
              <td align="left">Null (allowed simple value)</td>
            </tr>
            <tr>
              <td align="left">simple(59)</td>
              <td align="left">f83b</td>
              <td align="left">Disallowed simple value</td>
            </tr>
            <tr>
              <td align="left">59</td>
              <td align="left">183b</td>
              <td align="left">unsigned integer</td>
            </tr>
            <tr>
              <td align="left">-59</td>
              <td align="left">383a</td>
              <td align="left">signed integer</td>
            </tr>
            <tr>
              <td align="left">0("2025-03-30T12:24:16Z")</td>
              <td align="left">c074323032352d30332d33</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">305431323a32343a31365a</td>
              <td align="left">Disallowed ISO date/time</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">[1, [2, 3], [4, 5]]</td>
              <td align="left">8301820203820405</td>
              <td align="left">Array combinations</td>
            </tr>
            <tr>
              <td align="left">{ "a": 0, "b": 1, "aa": 2}</td>
              <td align="left">a361610161620262616103</td>
              <td align="left">Map object</td>
            </tr>
            <tr>
              <td align="left">h'48656c6c6f2043424f5221'</td>
              <td align="left">4b48656c6c6f2043424f5221</td>
              <td align="left">Binary string</td>
            </tr>
            <tr>
              <td align="left">"🚀 science"</td>
              <td align="left">6cf09f9a8020736369656e6365</td>
              <td align="left">Text string with emoji</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="invalid-encodings">
        <name>Invalid Encodings</name>
        <table>
          <thead>
            <tr>
              <th align="left">CBOR Encoding</th>
              <th align="left">Diagnostic Notation</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">a2616201616100</td>
              <td align="left">{ "b": 1, "a": 0 }</td>
              <td align="left">Improper map key ordering</td>
            </tr>
            <tr>
              <td align="left">1900ff</td>
              <td align="left">255</td>
              <td align="left">Number with leading zero bytes</td>
            </tr>
            <tr>
              <td align="left">c34a00010000000000000000</td>
              <td align="left">-18446744073709551617</td>
              <td align="left">Number with leading zero bytes</td>
            </tr>
            <tr>
              <td align="left">Fa41280000</td>
              <td align="left">10.5</td>
              <td align="left">Not in shortest encoding</td>
            </tr>
            <tr>
              <td align="left">c243010000</td>
              <td align="left">65536</td>
              <td align="left">Incorrect value for bigint</td>
            </tr>
            <tr>
              <td align="left">fa7fc00000</td>
              <td align="left">NaN</td>
              <td align="left">Not in shortest encoding</td>
            </tr>
            <tr>
              <td align="left">f97e01</td>
              <td align="left">NaN</td>
              <td align="left">NaN with payload</td>
            </tr>
            <tr>
              <td align="left">f97e00</td>
              <td align="left">NaN</td>
              <td align="left">NaN disallowed even in shortest encoding</td>
            </tr>
            <tr>
              <td align="left">5f4101420203ff</td>
              <td align="left">(_ h'01', h'0203')</td>
              <td align="left">Indefinite length object</td>
            </tr>
            <tr>
              <td align="left">fc</td>
              <td align="left"> </td>
              <td align="left">Reserved</td>
            </tr>
            <tr>
              <td align="left">f818</td>
              <td align="left"> </td>
              <td align="left">Invalid simple value</td>
            </tr>
            <tr>
              <td align="left">5b0010000000000000</td>
              <td align="left"> </td>
              <td align="left">Extremely large bstr length indicator: 4503599627370496</td>
            </tr>
            <tr>
              <td align="left">18446744073709551616</td>
              <td align="left">c249010000000000000000</td>
              <td align="left">Smallest positive bigint</td>
            </tr>
            <tr>
              <td align="left">-18446744073709551617</td>
              <td align="left">c349010000000000000000</td>
              <td align="left">Smallest negative bigint</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="configuration-and-aldrs">
      <name>Configuration and ALDRs</name>
      <t>Someone familiar with the long history of deterministic or canonical CBOR will note that the above specification mixes and matches properties from that history of profiling.
This creates three major issues for CBOR parsers that are not highly configurable:</t>
      <ol spacing="normal" type="1"><li>
          <t>The drastically reduced set of types and tags, as well as the requirement that map keys be typed as strings, usually require enforcement at the application layer, i.e. as "ALDR"s.</t>
        </li>
        <li>
          <t>Configuring a generic library to <em>encode</em> CBOR according to this profile's map-sorting requirement, when that library does not support <xref target="RFC7049"/> Canonical-CBOR sort mode (sometimes called "legacy" or "lengthfirst"), can be a substantial burden, and may require implementing that sorting algorithm at the application layer if the parser allows preserving map order in input.</t>
        </li>
        <li>
          <t>Issues around <tt>float</tt> reduction are harder to triage at the application layer, although many ALDRs and applications that use this encoding (such as that of the Bluesky social network and the data model of its underlying "Authenticated Transfer Protocol") completely sidestep the issue by simply disallowing floats at the CBOR level, or transcoding floats to a "virtual type" at the application layer, e.g. by retyping floats as strings.</t>
        </li>
      </ol>
    </section>
    <section anchor="decoding-strictness">
      <name>Decoding Strictness</name>
      <t>When decoding CBOR data encoded without observing the rules defined above, it recommended that validity rules around allowed types and tags, integer reduction, float reduction, and map sorting follow the looser norms set out in <xref target="RFC8949"/>.
A CBOR-42 application or encoder has no obligation to support re-encoding of such non-profile data according to these looser rules, however, and roundtrip-translation is unlikely to be guaranteed as this was a non-goal of the original design.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank for their guidance over a long period on this and related projects:</t>
      <ul spacing="normal">
        <li>
          <t>Carsten Bormann</t>
        </li>
        <li>
          <t>David Buchanan</t>
        </li>
        <li>
          <t>Cole Capilongo</t>
        </li>
        <li>
          <t>Paul Hoffman</t>
        </li>
        <li>
          <t>Dirk Kutscher</t>
        </li>
        <li>
          <t>Volker Mische</t>
        </li>
        <li>
          <t>Wolf McNally</t>
        </li>
        <li>
          <t>Bryan Newbold</t>
        </li>
        <li>
          <t>Marcin Rataj</t>
        </li>
        <li>
          <t>Anders Rundgren</t>
        </li>
        <li>
          <t>Rod Vagg</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
