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

<t>This document defines a strict profile of CBOR Core (CBOR/c) intended for use with the special tag 42.
Like the CBOR Core it profiles, "CBOR/c-42" can also be used as an internet-scale serialization for JSON, and is optimized for objects that compose into a directed acyclical graph.
Since CBOR/c-42 objects link to one another by hash-based identifiers, deterministic encoding is mandated to verify dereferenced links and encode new ones.</t>
      <t>This document mainly targets CBOR tool developers and those downstream users who would like to precisely configure their tools.
While full support in CBOR tools would be ideal and is already possible in some highly configurable parsing libraries, ALDRs can help close the delta by sidestepping the biggest interoperability stumbling blocks; see Appendix C for details.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ipfs-tech.github.io/cborc42/draft-caballero-cbor-cborc42.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-caballero-cbor-cborc42/"/>.
      </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 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 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/c-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">bigint</td>
              <td align="left">Big 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 the bigint type <bcp14>MUST</bcp14> be used.
            </t>
            <ul spacing="normal">
              <li>
                <t>Appendix B.1 features a list of integer sample values and their expected encoding.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>RFC+: UNLIKE CBOR/c and standard CDE encoding, floating-point numbers <bcp14>MUST</bcp14> always be encoded using the longest <xref target="IEEE754"/> variant. Appendix B.2 features a list of floating-point sample values and their expected encoding.</t>
          </li>
          <li>
            <t>RFC+: NaN values with payloads (like f97e01), or having the most significant bit set ("signaling"), <bcp14>MUST</bcp14> be rejected. See also Appendix B.4 for invalid NaN variants.</t>
          </li>
          <li>
            <t>RCF+: UNLIKE CBOR/c and standard CDE encoding, map keys <bcp14>MUST</bcp14> be typed as strings; no other types are allowed as map keys.</t>
          </li>
          <li>
            <t>RFC: Map keys <bcp14>MUST</bcp14> be sorted in the bytewise lexicographic order of their deterministic encoding. Duplicate keys (i.e. keys with identical determinstic bytestring values) <bcp14>MUST</bcp14> be rejected; note that semantic equivalence is not tested. As per the "Canonical CBOR" section (3.9) in <xref target="RFC7049"/>, the following represents a properly sorted map:
{
"a": ... ,
"b": ... ,
"aa": ...
}</t>
          </li>
          <li>
            <t>RFC+: Since CBOR encodings according to this specification maintain uniqueness, there are no specific restrictions or tests needed in order to determine map key equivalence. As an (extreme) example, the floating-point numbers 0.0 and -0.0, and the integer number 0 could all get force-typed as three distinct strings (<tt>0.0</tt>, <tt>-0.0</tt>, and <tt>0</tt>) without colliding.</t>
          </li>
          <li>
            <t>RFC: Indefinite length objects <bcp14>MUST</bcp14> be rejected.</t>
          </li>
        </ul>
      </section>
      <section anchor="cbor-tool-requirements">
        <name>CBOR Tool Requirements</name>
        <t>As is the case with CBOR/c, CBOR/c-42 is also designed to allow hashing and signing in raw form.
Because of the reduced range of types and tags, many of the tooling requirements made of CBOR/c are not necessary with CBOR/c-42; what follows is an edited version of the requirements proposed by Rundgren's current draft.</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/c-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">integer</td>
                <td align="left">BigInt</td>
                <td align="left">Integer of arbitrary size</td>
                <td align="left">2</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">4</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">5</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">6</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">6</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>Note that a hypothetical getBigInt() <bcp14>MUST</bcp14> also accept CBOR int objects since int is used for integers that fit in CBOR major type 0 and 1 objects. See also Appendix B.1 and Appendix D.</t>
            </li>
            <li>
              <t>Some platforms do not natively support float32 and/or float16. In this case a hypothetical getFloat16() would need to use a bigger floating-point type for the return value. Note that a hypothetical getFloat16() <bcp14>MUST</bcp14> reject encountered Float32 and Float64 objects. See also Appendix C.</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/c-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>(Note that the preceding is a strict subset of the protocol primitives enumerated by CBOR/c.)</t>
          <t>If a call does not match the underlying CBOR type, the call <bcp14>MUST</bcp14> be rejected.</t>
          <t>Due to considerable variations between platforms, corresponding encoder API support does not appear to be meaningful to specify in detail: Java doesn't have built-in support for unsigned integers, whereas JavaScript requires the use of the JavaScript BigInt type for dealing with 64-bit integers, etc.</t>
        </section>
        <section anchor="media-type">
          <name>Media Type</name>
          <t>Protocols transmitting CBOR/c-42 over HTTP interfaces are <bcp14>RECOMMENDED</bcp14> to send all CBOR/c-42 data with a media type header of <tt>application/cbor</tt>.</t>
        </section>
        <section anchor="diagnostic-notation">
          <name>Diagnostic Notation</name>
          <t>Compliant CBOR/c implementations <bcp14>SHOULD</bcp14> include support for bi-directional diagnostic notation, to facilitate:</t>
          <ul spacing="normal">
            <li>
              <t>Generation of developer-friendly debugging and logging data</t>
            </li>
            <li>
              <t>Easy creation of test and configuration data</t>
            </li>
          </ul>
          <t>Note that decoders for diagnostic notation, <bcp14>MUST</bcp14> always produce deterministically encoded CBOR data, compliant with this specification. This includes automatic sorting of map keys as well.</t>
          <t>The supported notation is compliant with a subset of Section 8 of <xref target="RFC8949"/> (b32' and encoding indicators were left out), but adds a few items to make diagnostic notation slightly more adapted for parsing, like single-line comments:</t>
          <table>
            <thead>
              <tr>
                <th align="left">CBOR</th>
                <th align="left">Syntax</th>
                <th align="left">Comment</th>
                <th align="left">Notes</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">/ comment text /</td>
                <td align="left">Multi-line comment. Multi-line comments are treated as whitespace and may thus also be used between CBOR objects.</td>
                <td align="left">6</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left"># comment text</td>
                <td align="left">Single-line comment. Single-line comments are terminated by a newline character ('\n') or EOF. Single-line comments may also terminate lines holding regular CBOR items.</td>
                <td align="left">6</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">integer</td>
                <td align="left">{sign} { 0b|0o|0x} n</td>
                <td align="left">Arbitrary sized integers without fractional components or exponents. See also CBOR integer encoding. For input data in diagnostic notation, binary, octal, and hexadecimal notation is also supported by prepending numbers with 0b, 0o, and 0x respectively. The latter also permit arbitrary insertions of '_' characters between digits to enable grouping of data like 0b100_000000001.</td>
                <td align="left">1, 2</td>
              </tr>
              <tr>
                <td align="left">float</td>
                <td align="left">{sign} n.n { e±n }</td>
                <td align="left">Floating point values <bcp14>MUST</bcp14> include a decimal point and at least one fractional digit, whereas exponents are optional.</td>
                <td align="left">1, 2</td>
              </tr>
              <tr>
                <td align="left">float</td>
                <td align="left">NaN</td>
                <td align="left">Not a number.</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">float</td>
                <td align="left">{sign} Infinity</td>
                <td align="left">Infinity.</td>
                <td align="left">2</td>
              </tr>
              <tr>
                <td align="left">bstr</td>
                <td align="left">h'hex-data'</td>
                <td align="left">Byte data provided in hexadecimal notation. Each byte <bcp14>MUST</bcp14> be represented by two hexadecimal digits.</td>
                <td align="left">3</td>
              </tr>
              <tr>
                <td align="left">bstr</td>
                <td align="left">b64'base64-data'</td>
                <td align="left">Byte data provided in base64 or base64URL notation. Padding with '=' characters is optional.</td>
                <td align="left">3, 6</td>
              </tr>
              <tr>
                <td align="left">bstr</td>
                <td align="left">'text'</td>
                <td align="left">Byte data provided as UTF-8 encoded text.</td>
                <td align="left">4, 5, 6</td>
              </tr>
              <tr>
                <td align="left">bstr</td>
                <td align="left">&lt;&lt; object... &gt;&gt;</td>
                <td align="left">Construct holding zero or more comma-separated CBOR objects that are subsequently wrapped in a byte string.</td>
                <td align="left">6</td>
              </tr>
              <tr>
                <td align="left">tstr</td>
                <td align="left">"text"</td>
                <td align="left">UTF-8 encoded text string.</td>
                <td align="left">4, 5</td>
              </tr>
              <tr>
                <td align="left">bool</td>
                <td align="left">true | false</td>
                <td align="left">Boolean value.</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">null</td>
                <td align="left">null</td>
                <td align="left">Null value.</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">[]</td>
                <td align="left">[ object... ]</td>
                <td align="left">Array with zero or more comma-separated CBOR objects.</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">{}</td>
                <td align="left">{ key:value... }</td>
                <td align="left">Map with zero or more comma-separated key/value pairs. Key and value pairs are expressed as CBOR objects, separated by a ':' character.</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">#6.nnn</td>
                <td align="left">n ( object )</td>
                <td align="left">Tag holding a CBOR object.</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">#7.nnn</td>
                <td align="left">simple(n)</td>
                <td align="left">Simple value.</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">,</td>
                <td align="left">Separator character for CBOR sequences.</td>
                <td align="left">6</td>
                <td align="left"> </td>
              </tr>
            </tbody>
          </table>
          <t>The letter n in the Syntax column denotes one or more digits.
The optional {sign} <bcp14>MUST</bcp14> be a single hyphen ('-') character.
Input only: between the quotes, the whitespace characters (' ', '\t', '\r', '\n') are ignored.
Input only: the control characters '\t' and '\n' inside of string quotes become a part of the text. For normalizing line terminators, a single '\r' or the combination '\r\n' <bcp14>MUST</bcp14> (internally) be rewritten as '\n'. To avoid getting newline characters ('\n') included in multi-line text strings, a line continuation marker consisting of a backslash ('') immediately preceding the newline may be used.
Text strings may also include JavaScript compatible escape sequences (''', '"', '\', '\b', '\f', '\n', '\r', '\t', '\uhhhh').
Input only.
The <xref target="PLAYGROUND"/> is an excellent way of getting acquainted with CBOR and diagnostic notation.</t>
        </section>
        <section anchor="cbor-sequences">
          <name>CBOR Sequences</name>
          <t>Decoders compliant with this specification <bcp14>MUST</bcp14> support CBOR sequences <xref target="RFC8742"/>.</t>
          <t>For decoders of "true" (binary) CBOR, there are additional requirements:</t>
          <t>It <bcp14>MUST</bcp14> be possible to decode one CBOR object at a time.
The decoder <bcp14>MUST NOT</bcp14> make any assumptions about the nature of unread code (it might not even be CBOR).</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>It is assumed that CBOR/c-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 has 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="PLAYGROUND" target="https://cyberphone.github.io/CBOR.js/doc/playground.html">
          <front>
            <title>Online CBOR testing tool</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </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 277?>

<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/c-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/c-42 encoder and decoder, so this entire section is non-normative and provided informationally for the purposes of making less opaque the bytestrings marked by tag 42.
Some CBOR/c-42 parsers may want to introspect the tag 42 values, if only to know which dereference to other CBOR/c-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 worth attempting to parse 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, with the canonical registry governed by 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>
            <tr>
              <td align="left">18446744073709551616</td>
              <td align="left">c249010000000000000000</td>
              <td align="left">Smallest positive bigint</td>
            </tr>
            <tr>
              <td align="left">-18446744073709551617</td>
              <td align="left">c349010000000000000000</td>
              <td align="left">Smallest negative bigint</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section 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/c-42 Encoding</th>
              <th align="left">CBOR/c Encoding</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0.0</td>
              <td align="left">?</td>
              <td align="left">f90000</td>
              <td align="left">Zero</td>
            </tr>
            <tr>
              <td align="left">-0.0</td>
              <td align="left">?</td>
              <td align="left">f98000</td>
              <td align="left">Negative zero</td>
            </tr>
            <tr>
              <td align="left">Infinity</td>
              <td align="left">invalid</td>
              <td align="left">f97c00</td>
              <td align="left">Infinity</td>
            </tr>
            <tr>
              <td align="left">-Infinity</td>
              <td align="left">invalid</td>
              <td align="left">f9fc00</td>
              <td align="left">Negative infinity</td>
            </tr>
            <tr>
              <td align="left">NaN</td>
              <td align="left">invalid</td>
              <td align="left">f97e00</td>
              <td align="left">Not a number</td>
            </tr>
            <tr>
              <td align="left">5.960464477539063e-8</td>
              <td align="left">fb3e70000000000000</td>
              <td align="left">f90001</td>
              <td align="left">Smallest positive subnormal float16</td>
            </tr>
            <tr>
              <td align="left">0.00006097555160522461</td>
              <td align="left">fb3f0ff80000000000</td>
              <td align="left">f903ff</td>
              <td align="left">Largest positive subnormal float16</td>
            </tr>
            <tr>
              <td align="left">0.00006103515625</td>
              <td align="left">fb 3f10000000000000</td>
              <td align="left">f90400</td>
              <td align="left">Smallest positive float16</td>
            </tr>
            <tr>
              <td align="left">65504.0</td>
              <td align="left">fb 40effc0000000000</td>
              <td align="left">f97bff</td>
              <td align="left">Largest positive float16</td>
            </tr>
            <tr>
              <td align="left">1.401298464324817e-45</td>
              <td align="left">fb36a0000000000000</td>
              <td align="left">fa00000001</td>
              <td align="left">Smallest positive subnormal float32</td>
            </tr>
            <tr>
              <td align="left">1.1754942106924411e-38</td>
              <td align="left">fb380fffffc0000000</td>
              <td align="left">fa007fffff</td>
              <td align="left">Largest positive subnormal float32</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222875e-38</td>
              <td align="left">fb3810000000000000</td>
              <td align="left">fa00800000</td>
              <td align="left">Smallest positive float32</td>
            </tr>
            <tr>
              <td align="left">3.4028234663852886e+38</td>
              <td align="left">fb 47efffffe0000000</td>
              <td align="left">fa7f7fffff</td>
              <td align="left">Largest positive float32</td>
            </tr>
            <tr>
              <td align="left">5.0e-324</td>
              <td align="left">fb0000000000000001</td>
              <td align="left">fb0000000000000001</td>
              <td align="left">Smallest positive subnormal float64</td>
            </tr>
            <tr>
              <td align="left">2.225073858507201e-308</td>
              <td align="left">fb000fffffffffffff</td>
              <td align="left">fb000fffffffffffff</td>
              <td align="left">Largest positive subnormal float64</td>
            </tr>
            <tr>
              <td align="left">2.2250738585072014e-308</td>
              <td align="left">fb0010000000000000</td>
              <td align="left">fb0010000000000000</td>
              <td align="left">Smallest positive float64</td>
            </tr>
            <tr>
              <td align="left">1.7976931348623157e+308</td>
              <td align="left">fb7fefffffffffffff</td>
              <td align="left">fb7fefffffffffffff</td>
              <td align="left">Largest positive float64</td>
            </tr>
            <tr>
              <td align="left">-0.0000033333333333333333</td>
              <td align="left">fbbecbf647612f3696</td>
              <td align="left">fbbecbf647612f3696</td>
              <td align="left">Randomly selected number</td>
            </tr>
            <tr>
              <td align="left">10.559998512268066</td>
              <td align="left">fb40251eb820000000</td>
              <td align="left">fa4128f5c1</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">10.559998512268068</td>
              <td align="left">fb40251eb820000001</td>
              <td align="left">fb40251eb820000001</td>
              <td align="left">Next in succession</td>
            </tr>
            <tr>
              <td align="left">295147905179352830000.0</td>
              <td align="left">fb 4430000000000000</td>
              <td align="left">fa61800000</td>
              <td align="left">268 (diagnostic notation truncates precision)</td>
            </tr>
            <tr>
              <td align="left">2.0</td>
              <td align="left">fb4000000000000000</td>
              <td align="left">f94000</td>
              <td align="left">Number without a fractional part</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539063e-8</td>
              <td align="left">fbbe70000000000000</td>
              <td align="left">f98001</td>
              <td align="left">Smallest negative subnormal float16</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539062e-8</td>
              <td align="left">fbbe6fffffffffffff</td>
              <td align="left">fbbe6fffffffffffff</td>
              <td align="left">Adjacent smallest negative subnormal float16</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539064e-8</td>
              <td align="left">fbbe70000000000001</td>
              <td align="left">fbbe70000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">-5.960465188081798e-8</td>
              <td align="left">fbbe70000020000000</td>
              <td align="left">fab3800001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.0000609755516052246</td>
              <td align="left">fb3f0ff7ffffffffff</td>
              <td align="left">fb3f0ff7ffffffffff</td>
              <td align="left">Adjacent largest subnormal float16</td>
            </tr>
            <tr>
              <td align="left">0.000060975551605224616</td>
              <td align="left">fb3f0ff80000000001</td>
              <td align="left">fb3f0ff80000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.000060975555243203416</td>
              <td align="left">fb3f0ff8002000000</td>
              <td align="left">fa387fc001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.00006103515624999999</td>
              <td align="left">fb3f0fffffffffffff</td>
              <td align="left">fb3f0fffffffffffff</td>
              <td align="left">Adjacent smallest float16</td>
            </tr>
            <tr>
              <td align="left">0.00006103515625000001</td>
              <td align="left">fb3f10000000000001</td>
              <td align="left">fb3f10000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.00006103516352595761</td>
              <td align="left">fb3f10000020000000</td>
              <td align="left">fa38800001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">65503.99999999999</td>
              <td align="left">fb40effbffffffffff</td>
              <td align="left">fb40effbffffffffff</td>
              <td align="left">Adjacent largest float16</td>
            </tr>
            <tr>
              <td align="left">65504.00000000001</td>
              <td align="left">fb40effc0000000001</td>
              <td align="left">fb40effc0000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">65504.00390625</td>
              <td align="left">fb40effc0020000000</td>
              <td align="left">fa477fe001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">1.4012984643248169e-45</td>
              <td align="left">fb369fffffffffffff</td>
              <td align="left">fb369fffffffffffff</td>
              <td align="left">Adjacent smallest subnormal float32</td>
            </tr>
            <tr>
              <td align="left">1.4012984643248174e-45</td>
              <td align="left">fb36a0000000000001</td>
              <td align="left">fb36a0000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">1.175494210692441e-38</td>
              <td align="left">fb380fffffbfffffff</td>
              <td align="left">fb380fffffbfffffff</td>
              <td align="left">Adjacent largest subnormal float32</td>
            </tr>
            <tr>
              <td align="left">1.1754942106924412e-38</td>
              <td align="left">fb380fffffc0000001</td>
              <td align="left">fb380fffffc0000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222874e-38</td>
              <td align="left">fb380fffffffffffff</td>
              <td align="left">fb380fffffffffffff</td>
              <td align="left">Adjacent smallest float32</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222878e-38</td>
              <td align="left">fb3810000000000001</td>
              <td align="left">fb3810000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">3.4028234663852882e+38</td>
              <td align="left">fb47efffffdfffffff</td>
              <td align="left">fb47efffffdfffffff</td>
              <td align="left">Adjacent largest float32</td>
            </tr>
            <tr>
              <td align="left">3.402823466385289e+38</td>
              <td align="left">fb47efffffe0000001</td>
              <td align="left">fb47efffffe0000001</td>
              <td align="left">-"-</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="miscellaneous-items">
        <name>Miscellaneous Items</name>
        <table>
          <thead>
            <tr>
              <th align="left">Diagnostic Notation</th>
              <th align="left">CBOR Encoding</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">true</td>
              <td align="left">f5</td>
              <td align="left">Boolean true (allowed simple value)</td>
            </tr>
            <tr>
              <td align="left">null</td>
              <td align="left">f6</td>
              <td align="left">Null (allowed simple value)</td>
            </tr>
            <tr>
              <td align="left">simple(59)</td>
              <td align="left">f83b</td>
              <td align="left">Disallowed simple value</td>
            </tr>
            <tr>
              <td align="left">59</td>
              <td align="left">183b</td>
              <td align="left">unsigned integer</td>
            </tr>
            <tr>
              <td align="left">-59</td>
              <td align="left">383a</td>
              <td align="left">signed integer</td>
            </tr>
            <tr>
              <td align="left">0("2025-03-30T12:24:16Z")</td>
              <td align="left">c074323032352d30332d33</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">305431323a32343a31365a</td>
              <td align="left">Disallowed ISO date/time</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">[1, [2, 3], [4, 5]]</td>
              <td align="left">8301820203820405</td>
              <td align="left">Array combinations</td>
            </tr>
            <tr>
              <td align="left">{ "a": 0, "b": 1, "aa": 2}</td>
              <td align="left">a361610161620262616103</td>
              <td align="left">Map object</td>
            </tr>
            <tr>
              <td align="left">h'48656c6c6f2043424f5221'</td>
              <td align="left">4b48656c6c6f2043424f5221</td>
              <td align="left">Binary string</td>
            </tr>
            <tr>
              <td align="left">"🚀 science"</td>
              <td align="left">6cf09f9a8020736369656e6365</td>
              <td align="left">Text string with emoji</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="invalid-encodings">
        <name>Invalid Encodings</name>
        <table>
          <thead>
            <tr>
              <th align="left">CBOR Encoding</th>
              <th align="left">Diagnostic Notation</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">a2616201616100</td>
              <td align="left">{ "b": 1, "a": 0 }</td>
              <td align="left">Improper map key ordering</td>
            </tr>
            <tr>
              <td align="left">1900ff</td>
              <td align="left">255</td>
              <td align="left">Number with leading zero bytes</td>
            </tr>
            <tr>
              <td align="left">c34a00010000000000000000</td>
              <td align="left">-18446744073709551617</td>
              <td align="left">Number with leading zero bytes</td>
            </tr>
            <tr>
              <td align="left">Fa41280000</td>
              <td align="left">10.5</td>
              <td align="left">Not in shortest encoding</td>
            </tr>
            <tr>
              <td align="left">c243010000</td>
              <td align="left">65536</td>
              <td align="left">Incorrect value for bigint</td>
            </tr>
            <tr>
              <td align="left">fa7fc00000</td>
              <td align="left">NaN</td>
              <td align="left">Not in shortest encoding</td>
            </tr>
            <tr>
              <td align="left">f97e01</td>
              <td align="left">NaN</td>
              <td align="left">NaN with payload</td>
            </tr>
            <tr>
              <td align="left">f97e00</td>
              <td align="left">NaN</td>
              <td align="left">NaN disallowed even in shortest encoding</td>
            </tr>
            <tr>
              <td align="left">5f4101420203ff</td>
              <td align="left">(_ h'01', h'0203')</td>
              <td align="left">Indefinite length object</td>
            </tr>
            <tr>
              <td align="left">fc</td>
              <td align="left"> </td>
              <td align="left">Reserved</td>
            </tr>
            <tr>
              <td align="left">f818</td>
              <td align="left"> </td>
              <td align="left">Invalid simple value</td>
            </tr>
            <tr>
              <td align="left">5b0010000000000000</td>
              <td align="left"> </td>
              <td align="left">Extremely large bstr length indicator: 4503599627370496</td>
            </tr>
          </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 enformcement 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 Data 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/c-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>Paul Hoffman</t>
        </li>
        <li>
          <t>Dirk Kutscher</t>
        </li>
        <li>
          <t>Volker Mische</t>
        </li>
        <li>
          <t>Marcin Rataj</t>
        </li>
        <li>
          <t>Rod Vagg</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
iq+I7D/ykbrU9/fBavXVg/8P3G6H4fx1AAA=

-->

</rfc>
