<?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.34 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-caballero-cbor-cbor42-02" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="CBOR42">The tag-42 profile of CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-caballero-cbor-cbor42-02"/>
    <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="2026" month="March" day="17"/>
    <area/>
    <workgroup>Decentralization of the Internet</workgroup>
    <keyword>serialization</keyword>
    <keyword>CBOR</keyword>
    <keyword>deterministic encoding</keyword>
    <keyword>decentralization</keyword>
    <keyword>sparkling distributed systems</keyword>
    <abstract>
      <?line 72?>

<t>This document defines a bespoke serialization of CBOR intended for use with the special tag 42 in various end-to-end protocols that came out of the IPFS community.
Much of its design dates to the first CBOR RFC and predates much of the terminology and the layered approach to determinism elaborated in later years.</t>
      <t>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/cbor42/draft-caballero-cbor-cbor42.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
        Decentralization of the Internet  mailing list (<eref target="mailto:din@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/din/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/din/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ipfs-tech/cbor42"/>.</t>
    </note>
  </front>
  <middle>
    <?line 80?>

<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 serialization, 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: 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 serialization, 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, and for an end-to-end protocol by which this graph grows.
These simple binary-hash 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 are forbidden to reduce ambiguity, and developers are encouraged to express many kinds of data at higher layers by using the small set of supported types (such as strings or bytestrings); see the Appendix <xref target="application-level-considerations">Application-Level Considerations</xref>.</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>
        </ul>
      </section>
    </section>
    <section anchor="specification">
      <name>Specification</name>
      <t>This section describes the CBOR-42 serialization and how it differs from a deterministic encoding defined in the draft BCP on <xref target="Determinism"/>.</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">untagged bstr</td>
              <td align="left">Byte string</td>
            </tr>
            <tr>
              <td align="left">tag 42 bstr</td>
              <td align="left">See Appendix A; no other tags allowed</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">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="cbor-42-serialization">
        <name>CBOR-42 Serialization</name>
        <t>CBOR-42 was designed for determinism (a decade before the generalized CDE deterministic serialization or dCBOR was finalized) and the protocols and applications that it was designed for all mandate its strict encoding.
The encoding scheme is most similar to the deterministic encoding, but with some major differences.
The following list contains a summary of these differences:</t>
        <ul spacing="normal">
          <li>
            <t>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 only by the int type or untagged bytestrings or strings, <bcp14>MUST</bcp14> use the int type if the value is between -2^64 and 2^64-1; otherwise, they can be encoded as bytestrings WITHOUT the bignum tag or as strings, and discrimation from other bytestrings or strings is expected to be handled at the application layer.
            </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>Unlike the preferred-plus or CDE serializations, 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>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>UNLIKE the preferred-plus or CDE serialzations, map keys <bcp14>MUST</bcp14> be typed as strings; no other types are allowed as map keys.</t>
          </li>
          <li>
            <t>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 (see <xref target="RFC8949"/> section 4.2.3; deterministic encoding uses the other ordering from section 4.2.1). Duplicate keys (i.e. keys with identical deterministic bytestring values) <bcp14>MUST</bcp14> be rejected. Note that semantic equivalence is not tested when detecting duplicate keys.
            </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:
{
"a": ... ,
"b": ... ,
"aa": ...
}</t>
              </li>
              <li>
                <t>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>
            </ul>
          </li>
          <li>
            <t>Indefinite length objects of any kind <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, CBOR-42 encoding <bcp14>MUST</bcp14> be maintained, including the less-common sorting of string-keyed maps.</t>
          </li>
          <li>
            <t>Invalid or unsupported CBOR constructs, as well as valid CBOR data not adhering to the CBOR-42 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 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 the deterministic serialization as defined in <xref target="RFC8949"/> and the draft BCP on <xref target="Determinism"/> 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>
        <reference anchor="Determinism" target="https://datatracker.ietf.org/doc/draft-ietf-cbor-serialization/">
          <front>
            <title>CBOR Serialization and Determinism</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 226?>

<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 orthogonal 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 through 3 or 1 through 5 in the list above 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-42 Encoding</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">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">f6</td>
              <td align="left">Null (allowed simple value)</td>
            </tr>
            <tr>
              <td align="left">simple(59)</td>
              <td align="left">n/a</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">183b</td>
              <td align="left">unsigned integer</td>
            </tr>
            <tr>
              <td align="left">-59</td>
              <td align="left">383a</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">"2025-03-30T12:24:16Z"</td>
              <td align="left">c074323032352d30332d33</td>
              <td align="left">application-level tagging assumed</td>
            </tr>
            <tr>
              <td align="left">305431323a32343a31365a</td>
              <td align="left">n/a</td>
              <td align="left">n/a</td>
              <td align="left">Disallowed ISO date/time</td>
            </tr>
            <tr>
              <td align="left">[1, [2, 3], [4, 5]]</td>
              <td align="left">8301820203820405</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">a361610161620262616103</td>
              <td align="left">Map object</td>
            </tr>
            <tr>
              <td align="left">h'48656c6c6f2043424f5221'</td>
              <td align="left">4b48656c6c6f2043424f5221</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">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="application-level-considerations">
      <name>Application-level considerations</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 mechanisms at the application layer (known in the CBOR WG discussions as "ALDR"s). These are outlined below.</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 encoder can be configured to preserve map order in input.</t>
        </li>
        <li>
          <t>Issues around <tt>float</tt> reduction are harder to triage at the application layer, although many CBOR-42 applications (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 application level to avoid having to handle them at the CBOR level. Some applications seeking interoperability with these float-free applications transcode floats to a "virtual type" at the application layer, e.g. by retyping floats as strings.</t>
        </li>
      </ol>
      <section anchor="bignums-and-bytestrings">
        <name>Bignums and Bytestrings</name>
        <t>Unlike in serializations that use major type 2 ("BIGNUMS"), integers larger than the integer basic type are not tagged as such when being encoded as bytestrings.
To avoid confusing large integers and other uses of the <tt>bytes</tt> major type, applications generally use some form of application-level metadata or schema system rather than the CBOR tag: in the case of older forms of IPFS like the UnixFS file system, there is an IPLD schema validation step between the application layer and the CBOR encoding; in the case of BlueSky and the AT Protocol, the equivalent schematization happens at the layer of "lexicons".</t>
      </section>
      <section anchor="datetimes">
        <name>Datetimes</name>
        <t>Similarly, CBOR-42 does not use the tag for either CBOR datetime format.</t>
      </section>
    </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>
