<?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-01" 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-01"/>
    <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="05"/>
    <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-latest.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 strings and <bcp14>MUST</bcp14> be sorted "length-first", which (because they are strings) can always be achieved by sorting in bytewise lexicographic order. Duplicate keys (i.e. keys with identical deterministic bytestring values) <bcp14>MUST</bcp14> be rejected. Note that semantic equivalence is not tested.
            </t>
            <ul spacing="normal">
              <li>
                <t>Since map keys must be strings, the following represents a properly sorted map, whether sorted according to the "Canonical CBOR" algorithm (section (3.9) in <xref target="RFC7049"/>) OR the "deterministically encoded" algorithm (section (4.2.3) in <xref target="RFC8949"/>):
{
"a": ... ,
"b": ... ,
"aa": ...
}</t>
              </li>
            </ul>
          </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 220?>

<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">fb0000000000000000</td>
              <td align="left">fb0000000000000000</td>
              <td align="left">Zero</td>
            </tr>
            <tr>
              <td align="left">-0.0</td>
              <td align="left">fb8000000000000000</td>
              <td align="left">fb8000000000000000</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">fb3f10000000000000</td>
              <td align="left">f90400</td>
              <td align="left">Smallest positive float16</td>
            </tr>
            <tr>
              <td align="left">65504.0</td>
              <td align="left">fb40effc0000000000</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">fb47efffffe0000000</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">fb4430000000000000</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">Only 64-bit floats</td>
            </tr>
            <tr>
              <td align="left">c243010000</td>
              <td align="left">65536</td>
              <td align="left">bigints not allowed</td>
            </tr>
            <tr>
              <td align="left">c249010000000000000000</td>
              <td align="left">18446744073709551616</td>
              <td align="left">bigints not allowed</td>
            </tr>
            <tr>
              <td align="left">c349010000000000000000</td>
              <td align="left">-18446744073709551617</td>
              <td align="left">bigints not allowed</td>
            </tr>
            <tr>
              <td align="left">fa7fc00000</td>
              <td align="left">NaN</td>
              <td align="left">NaNs not allowed</td>
            </tr>
            <tr>
              <td align="left">f97e01</td>
              <td align="left">NaN</td>
              <td align="left">NaNs not allowed</td>
            </tr>
            <tr>
              <td align="left">f97e00</td>
              <td align="left">NaN</td>
              <td align="left">NaNs not allowed</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>
          </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>
