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

<t>CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
its Section 4.2.  The present document provides additional information
about use cases, deployment considerations, and implementation choices
for Deterministic Encoding.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-bormann-cbor-det/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Concise Binary Object Representation Maintenance and Extensions (CBOR) Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cbor-wg/draft-ietf-cbor-cde"/>.</t>
    </note>
  </front>
  <middle>
    <?line 97?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Concise Binary Object Representation (CBOR, <xref target="STD94"/> as documented
in RFC 8949) 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.</t>
      <t>In many cases, CBOR allows some information to be encoded in several
variants, which provide different amounts of space and thus lengths in
Bytes.
The encoder is generally free to choose the length that
is most practical for it (with the constraint, of course, that the
data need to fit).
For most encoders, it is natural to always choose the shortest form
available (essentially avoiding leading zeros).
Section <xref target="RFC8949" section="4.1" sectionFormat="bare">Preferred Serialization</xref> of RFC 8949 <xref target="STD94"/> names this practice
and provides additional guidance for CBOR implementations; another
term in use is "Preferred Encoding".</t>
      <t>Section <xref target="RFC8949" section="4.2" sectionFormat="bare">Deterministically Encoded CBOR</xref> of RFC 8949 <xref target="STD94"/> goes beyond
the Preferred Serialization practice by providing rules for
<em>Deterministic Encoding</em>.
The objective of Deterministic Encoding is to, deterministically,
always produce the same encoding for data items that are equivalent at
the data model level.
To achieve this, Preferred Serialization is mandated, an encoding choice
intended for incremental encoding
(indefinite length encoding) is disabled, and additional effort is
expended for encoding key/value pairs in maps (the order of which
does not matter semantically) in a deterministic order.</t>
      <t>Given that additional effort needs to be expended and/or implementation
choices are taken away, neither Preferred Serialization nor
Deterministic Encoding are mandatory in CBOR.
(Contrast this with UTF-8 (Section <xref target="RFC3629" section="3" sectionFormat="bare"/> of RFC 3629 <xref target="STD63"/>), which is always treating as
"invalid" any encoding variants that are longer than necessary.)</t>
      <t>Deterministic Encoding is defined in Section <xref target="RFC8949" section="4.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> (note
that Section <xref target="RFC8949" section="4.2.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> defines a variant that was needed at
the time for backward compatibility and will not be discussed further
in this document).
The present document elaborates on this normative definition by
providing additional information about use cases, deployment
considerations, and implementation choices for Deterministic Encoding;
it is an informational document that however may still be cited where a
single reference for the background of Deterministic Encoding is convenient.
This document is intended to be used in conjunction with CBOR Common
Deterministic Encoding (CDE, <xref target="I-D.ietf-cbor-cde"/>), a normative specification for a
deterministic encoding profile that was developed in order to allow
generic CBOR implementations to provide common support for a variety
of applications of deterministic encoding.</t>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The definitions of <xref target="STD94"/> apply.
Readers are expected to be familiar with CBOR, and particularly so with
Sections <xref target="RFC8949" section="4.1" sectionFormat="bare"/> and <xref target="RFC8949" section="4.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
        <t>The following terms introduced in the text of <xref target="STD94"/> receive their own
separate definitions here:</t>
        <dl>
          <dt>Preferred Serialization:</dt>
          <dd>
            <t>a set of choices made during Serialization (Encoding) that generally
leads to shortest-form encodings where a choice of encoding lengths
is available, without expending additional effort on converting
between different kinds of data item.
See Section <xref target="RFC8949" section="4.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> and the terms defined in that section.
The Preferred Encoding rules for data items in the Basic Generic
Data Model may be augmented by rules for specific Tags, see for
instance Section <xref target="RFC8949" section="3.4.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
          </dd>
          <dt>Preferred Encoding:</dt>
          <dd>
            <t>Preferred Serialization</t>
          </dd>
          <dt>Deterministic Encoding:</dt>
          <dd>
            <t>An encoding process that employs Preferred Serialization and makes
additional decisions to always (deterministically) lead to the
exact same encoding for equivalent inputs at the data model level.
Similar to Preferred Serialization, the equivalence model as defined
for the Basic Generic Data Model may be augmented by equivalence
rules defined for specific Tags (see also Section <xref target="RFC8949" section="2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).</t>
          </dd>
        </dl>
        <t>In this document, CBOR data items at the data model level are
represented in the CBOR diagnostic notation (Section <xref target="RFC8949" section="8" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> as extended by <xref section="G" sectionFormat="of" target="RFC8610"/>,
further elaborated in <xref target="I-D.ietf-cbor-edn-literals"/>), abbreviated with "EDN" (extended
diagnostic notation).</t>
        <t>While this document is informative, it does use certain keywords to
indicate practical requirements for interoperability.
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 <xref target="BCP14"/> (<xref target="RFC2119"/>) (<xref target="RFC8174"/>) when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</section>
    </section>
    <section anchor="use-cases-for-deterministic-encoding">
      <name>Use Cases for Deterministic Encoding</name>
      <t>Before discussing further details of Deterministic Encoding, we would
like to point out three areas of use cases, which differ enough in the
resulting objectives that it is worth to have terminology for them.</t>
      <section anchor="diagnostics">
        <name>Diagnostics</name>
        <t>In many cases, diagnostic procedures benefit from having available a
single, easily comparable representation of some data:</t>
        <ul spacing="normal">
          <li>
            <t>Comparing outputs of a test or validation suite during development  </t>
            <ul spacing="normal">
              <li>
                <t>CI (Continuous Integration) may capture Deterministically Encoded copies of process output,
of data in flight or data at rest, of specific test output etc.
Being able to compare them over time or between systems without
differences occurring as false positives can help indicate the presence or absence of
certain problems.</t>
              </li>
              <li>
                <t>Test vectors and other kinds of tests often represent some input
and desired output of a transformation.
By making sure the output is deterministically
encoded, a simple bytewise comparison can find out whether the
transformation was performed successfully.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Improving the presentation of diagnostic information to humans  </t>
            <t>
By minimizing inconsequential differences between representations of
similar data, humans may be faster in finding information they are
interested in.  In particular inconsistent map ordering can easily
hide information that would have been useful for diagnostic purposes.
Transformation to human-readable forms may be easier and more useful
if there is
only one form of representation for the interchanged data.</t>
          </li>
        </ul>
      </section>
      <section anchor="caching">
        <name>Caching</name>
        <t>Many systems cache (memoize) results of a request so they can reply
with the cached result when the same request comes in again and the
context of the reply has not changed.</t>
        <t>If two requests that are semantically the same also have the same
representation, the representation (or its hash) can serve as an
efficient cache key.  If the request is already encoded
deterministically, this is by definition the case; alternatively, the
recipient can re-encode a request with Deterministic Encoding.</t>
        <t>Were the Deterministic Encoding to fail, this could lead to cache failures, which
could be benign, but also could be specifically evoked by an active
attacker to degrade a system.</t>
        <t>As usual for deterministically encoded data, not all forms of
application equivalence imply equivalence at the data model level, so
some equivalence processing (<em>deterministic representation</em>) may be
required at the application level as well,
to achieve equivalent representations and thus a good cache hit rate.</t>
      </section>
      <section anchor="security-signing-inputs">
        <name>Security: Signing Inputs</name>
        <t>Security Frameworks such as COSE and JOSE sign or MAC (authenticate with a
Message Authentication Code, MAC) information in
the form in which it
has actually been interchanged, making representation variants
less relevant.</t>
        <t>(Note that Section <xref target="RFC9052" section="9" sectionFormat="bare"/> of RFC 9052 <xref target="STD96"/> defines deterministic encoding
rules for its own derivation of signing inputs from interchange data
and additional cryptographic parameters; these are a compatible subset
of the Core Deterministic Encoding Requirements specified in Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> and thus of CDE.)</t>
        <t>However, in some cases, the signing input for a signature or a MAC may
need to be derived from data at rest and/or specific transformations of
the data that was interchanged.  Such a transformation is fraught with
perils at the application level that may be exploited by attackers;
this problem is outside the scope of the present document.
Deterministic Encoding may remove one potential source of variability
that might make signatures or MACs useless between systems.</t>
      </section>
    </section>
    <section anchor="support-by-generic-encoders-and-decoders">
      <name>Support by Generic Encoders and Decoders</name>
      <t>CBOR implementations can be specific to a particular application, or
they can be <em>Generic</em>.  There is a strong incentive to be able to use
a Generic encoder/decoder across the spectrum of CBOR applications;
CBOR applications that require specific support from an
encoder/decoder can considerably reduce the wide implementation
support CBOR enjoys from existing generic implementations.  So, as a
general best practice, we want to minimize the number of ways an
application may need to influence a generic coder/decoder by options,
flags, switches, etc.</t>
      <section anchor="basic-support">
        <name>Basic Support</name>
        <t>There is some expectation that, barring any particular constraints
that would make this more difficult than normally, a CBOR encoder will
use Preferred Encoding, in particular generic encoders.
Deterministic Encoding, however, will need to be switched on explicitly in
most implementations.
Note that Preferred Encoding, while using the shortest form available
for the specific data item to be encoded, doesn't have that shortness
as the overriding objective: Conversions of a data item into a
different one to achieve shorted encoding are not part of the
processing labeled "Preferred Encoding".
(This is particularly relevant for CBOR's different numeric systems;
see <xref target="numeric"/> below.)</t>
        <t>Some applications will also want to check that an encoded input actually
satisfies the requirements for Deterministic Encoding.
By the definition of Deterministic Encoding, this can be done after
decoding a data item by
deterministically encoding the just decoded data item and comparing
the result with the decoding input.
However, specific support for checking immediately in the decoding
process can be more efficient.</t>
        <t>As a result, support for Deterministic Encoding in generic encoder
implementations is <bcp14>RECOMMENDED</bcp14> to be provided by a flag to switch on
(or separate function that enables) Deterministic Encoding.
Similarly, generic decoders are <bcp14>RECOMMENDED</bcp14> to have a flag to switch
on/separate function to enable checking for Deterministic Encoding,
whether that is efficiently
implemented during decoding or less efficiently by comparing
a re-encoding.</t>
      </section>
      <section anchor="tags">
        <name>Application Requirements and Tags</name>
        <t>The definition of Deterministic Encoding can become more complicated
with the addition of Tags (Section <xref target="RFC8949" section="3.4" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/><xref target="IANA.cbor-tags"/>).
Not all tags come with a strong equivalence model.
Worse, the equivalence model may be more
application specific than for basic Deterministic Encoding.</t>
        <section anchor="example-with-tags-0-and-1-datetime">
          <name>Example with Tags 0 and 1 (Date/Time)</name>
          <t>For instance, are the following Tag 0 timestamps (expressed in CBOR
diagnostic notation) equivalent?</t>
          <!-- 23 Oct 2013 14:52:23 -0700 -->

<artwork><![CDATA[
0("2013-10-23T21:52:23Z")
0("2013-10-23T21:52:23+00:00")
0("2013-10-23T14:52:23-07:00")
]]></artwork>
          <t>They all denote the same instance in time, so if that is the relevant application
semantics, they should all be represented as
<tt>0("2013-10-23T21:52:23Z")</tt> in Deterministic Encoding as that is the
shortest form.
However, they carry additional semantics that may be incidental or
intentional (the e-mail message from which this date/time example was taken originated
from California, which then was at a time zone the time offset of
which is expressed by the <tt>-07:00</tt>).
Whether the first two are exactly equivalent or not is the subject of
<xref section="2" sectionFormat="of" target="RFC9557"/>.</t>
          <t>If the additional semantics conveyed by the <tt>time-offset</tt> (<xref section="5.6" sectionFormat="of" target="RFC3339"/>) is not relevant to the application, an
application-specific rule may be needed to convert text-based
timestamps into the "Z" form before encoding.
Some applications may also process this timestamp as <tt>1(1382565143)</tt>,
losing the additional semantics as well, and using a quite different form.
Is that maybe an even better Deterministic Encoding?
(Note that <tt>0("2016-12-31T23:59:60Z")</tt> does not have an equivalent
form with Tag 1, so the application can either decide to never use
such a date/time, or to exceptionally encode the rare leap second with Tag 0.)</t>
        </section>
        <section anchor="numeric">
          <name>Example with Major Types 0, 1, and 7, and Tags 2 and 3</name>
          <aside>
            <t>In some of the following examples, we will use the number
65 536 000 000 (or its floating-point form, 65536000000.0, in
diagnostic notation), as it has
both binary and non-binary (decimal) factors: it is equal to
<tt>2</tt><sup>16</sup>⋅<tt>10</tt><sup>6</sup> (and thus to
<tt>2</tt><sup>22</sup>⋅<tt>5</tt><sup>6</sup>).</t>
          </aside>
          <t>CBOR has four different sets of numeric representations:</t>
          <ul spacing="normal">
            <li>
              <t>Major types 0 and 1.  </t>
              <t>
These provide for a variable-length representation of 64-bit
unsigned integer numbers (major type 0) or negative numbers (major
type 1) and, by combining these, of 65-bit signed integer numbers.
The various lengths are intended to be semantically without meaning; the
Preferred Encoding always chooses the shortest one.</t>
            </li>
            <li>
              <t>Tags 2 and 3 ("bignums")  </t>
              <t>
These provide for a variable-length representation of arbitrarily
large unsigned (Tag 2) or negative (Tag 3) integer numbers.
According to Section <xref target="RFC8949" section="3.4.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>,
the Preferred Encoding of an integer that fits into major type 0 or
1 is just that, i.e., the boundary between regular integers and
bignums is intentionally thin.  This means that, in Preferred
Encoding, the value space of integral numbers is cleanly split into
basic integers (64-bit unsigned integers or 64-bit negative
integers) and bignums (Tag 2/3 integers that fit into neither of the
two 64-bit forms).  </t>
              <t>
As a result, an application may want to place any distinctions it
needs in the area of integer numbers not on the representation as a
regular integer or a bignum, but on the value: e.g., an application
could provide a 64-bit signed integer range separate from a bignum-based
arbitrary size integer range that is outside 64-bit signed space, and
would map half of the 65-bit space into the arbitrary size range.  </t>
              <t>
Note that, accordingly, Preferred Encoding as defined in Section <xref target="RFC8949" section="3.4.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> selects the shortest encoding in major type 0/1
space if that is available and the shortest encoding (no leading
zero bytes) in Tag 2/3 space only if the former is not available.
This means that the integer number 65 536 000 000 in preferred
representation is encoded as (9 bytes)  </t>
              <sourcecode type="cbor-pretty"><![CDATA[
1b 00 00 00 0f 42 40 00 00
]]></sourcecode>
              <t>
and not as (7 bytes)  </t>
              <sourcecode type="cbor-pretty"><![CDATA[
c2 45 0f 42 40 00 00
]]></sourcecode>
              <t>
(<tt>2(h'0f 42 40 00 00')</tt> in diagnostic notation), even though
the latter is shorter by two bytes.</t>
            </li>
            <li>
              <t>Major type 7  </t>
              <t>
CBOR directly provides the <xref target="IEEE754"/> types binary16, binary32, and
binary64, colloquially known as half-precision, single-precision,
and double-precision floating point.  Note that other <xref target="IEEE754"/>
binary floating types are indirectly supported via Tag 4, as well as
decimal fractions via Tag 5.  </t>
              <t>
The set of values that binary32 and binary64 can represent are
proper supersets of the value sets of the binary16 and binary32,
respectively.  These sets have CDDL names of float16, float32, and
float64 (<xref section="3.3" sectionFormat="of" target="RFC8610"/>).
Again, preferred encoding chooses the smallest of the encodings;
e.g., an application float64 such as 1.5 will be represented in a
binary16 (0xf93e00) because that representation is the shortest floating
point that provides the range and precision needed for this value.
(Bulk encoding of floating point values, where the need for detection of this
situation might cause a performance limitation, is handled by
tagged arrays <xref target="RFC8746"/>.)  </t>
              <t>
While the three major type 7 floating point representations are
semantically equivalent among each other in the same way as the major type 0/1
integer representations are to each other, implementers have
indicated that between these
two groups, numbers need to be kept separated into integers and
floating point numbers at the generic data model level.  </t>
              <t>
This means that the integer number 65 536 000 000 in preferred
representation is encoded as (9 bytes)  </t>
              <artwork><![CDATA[
1b 00 00 00 0f 42 40 00 00
]]></artwork>
              <t>
and not as (5 bytes)  </t>
              <artwork><![CDATA[
fa 51 74 24 00
]]></artwork>
              <t>
which would be considered to be the semantically separate floating point value
65536000000.0 (CBOR diagnostic notation).</t>
            </li>
            <li>
              <t>Tag 4 and 5 (decimal fractions, "bigfloats")  </t>
              <t>
Instead of adopting further formats such as decimal64 or binary128 from
<xref target="IEEE754"/>, CBOR defines two generalized tags that can be used for extended
precision representation: Tag 5 for general binary floating point
numbers ("bigfloats") and Tag 4 for general decimal floating point
(decimal fractions).
 Section <xref target="RFC8949" section="3.4.4" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> also states that "Bigfloats may also be used by constrained
applications that need some basic binary floating-point capability
without the need for supporting IEEE 754", while decimal fractions
"are most useful if an application needs the exact representation of
a decimal fraction such as 1.1 because there is no exact
representation for many decimal fractions in binary floating-point
representations", as might occur when representing literal JSON
<xref target="STD90"/> instead of I-JSON-interpreted JSON <xref target="RFC7493"/>.  </t>
              <t>
Neither bigfloats nor decimal fractions provide rules for preferred
encoding, except implicitly by providing a choice between basic
integer and bignum representation for the mantissa value that will
in turn
be governed by the preferred encoding rules for integers.
Beyond that, the assumption is that these Tags create separate
number spaces, and that any deterministic representation of numbers
via these tags is shaped by application rules for the use of Tag 4
and 5.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="specification-considerations">
      <name>Specification Considerations</name>
      <t>In many specifications, asserting that interchange is based on
deterministically encoded data items (and specifying what has to
happen if that is not the case) is all that is needed.</t>
      <section anchor="media-type-considerations">
        <name>Media Type Considerations</name>
        <t>Some specifications define a media type for their interchange formats.
This definition is a good place to reiterate that a deterministically
encoded data item is required for instances of that media type.</t>
        <t>A question arises whether a Structured Syntax Suffix (SSS, <xref target="RFC6838"/>)
should be defined for CBOR data items in Deterministic Encoding
(and similarly for CBOR sequences <xref target="RFC8742"/> of such).</t>
        <t>There is precedent for this approach, as ASN.1 DER (Distinguished
Encoding Rules) has an SSS, <tt>+der</tt>.
However, this appears misguided as the purpose of an SSS is to enable
processing of the underlying data representation format, and any ASN.1
BER (Basic Encoding Rules) processor (<tt>+ber</tt>) can also process a
<tt>+der</tt> instance, which is not apparent from the <tt>+der</tt> suffix.
(This was maybe mitigated by introducing both SSS at the same time.)
Similarly, any CBOR decoder today can process deterministically
encoded data items as plain CBOR data items (without any mitigation of
having introduced a related suffix at the same time), so the SSS
should be the usual <tt>+cbor</tt>/<tt>+cbor-seq</tt>.
(The additional processing that would be enabled by identifying data
items as deterministically encoded appears rather limited.)</t>
        <t>Alternatively, instead of replacing <tt>+cbor</tt>, an indication of
Deterministic Encoding could be provided by adding multiple suffixes
to the SSS concept.
There is an ongoing effort to define a more complex structure of media
type suffixes, as documented in <xref target="I-D.ietf-mediaman-suffixes"/>.
In general, the combination of multiple SSS in one media type name
raises similar questions to the multiple inheritance problem in
object-oriented programming languages, so it may not be easy to use
such a mechanism in practice.</t>
      </section>
      <section anchor="the-need-for-maps">
        <name>The Need for Maps</name>
        <t>As an extension to JSON objects in JSON <xref target="STD90"/>,
maps are an important data structure in the CBOR generic data model to
obtain extensibility of "struct"-like data (see <xref section="2" sectionFormat="of" target="RFC8610"/>).
Where this is not needed or can be provided in another way, expressing
the entire data item without the use of maps can be an efficient
option, avoiding any additional processing for Deterministic Encoding
beyond that needed for Preferred Encoding.
(This requires ensuring that a similar kind of uncertainty then does not occur
at the application level, though.)</t>
      </section>
    </section>
    <section anchor="implementation-considerations-for-deterministic-encoding">
      <name>Implementation Considerations for Deterministic Encoding</name>
      <section anchor="api-considerations">
        <name>API Considerations</name>
        <t>Support for Deterministic Encoding can be added to an API for a
generic CBOR encoder and decoder by adding one flag each:</t>
        <ul spacing="normal">
          <li>
            <t>a flag for the encoder to produce Deterministic Encoding</t>
          </li>
          <li>
            <t>a flag for the decoder to check for Deterministic Encoding (optional)</t>
          </li>
        </ul>
        <t>Additional elements could be added to a decoder API to give diagnostic
information about inputs that were not deterministically encoded, e.g.,
by flagging elements with error codes.  It is often useful to give the
application full information about well-formed CBOR that is not
deterministically encoded even when it should be.
However, if a flag for checking is provided and switched on, there
<bcp14>SHOULD</bcp14> be no chance that any other decoded data item is mistaken for
one that was encoded deterministically.</t>
        <t>As reordering maps for Deterministic Encoding is relatively expensive,
a generic encoder can also offer additional APIs for providing map
content in a pre-ordered form.  If an encoder complies with Preferred
Encoding and maps can be supplied in ordered form, an explicit
Deterministic Encoding flag may not be required.  If it is, it is
<bcp14>RECOMMENDED</bcp14> that the encoder not simply rely on the assumption that
inputs were properly ordered by the application.</t>
      </section>
      <section anchor="map-key-ordering">
        <name>Map Key Ordering</name>
        <t>Generating deterministically encoded data items requires arranging
key/value pairs in maps into an order defined in Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
        <t>This map is ordered by the byte-wise lexicographic ordering of the
deterministically encoded map keys.
Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> notes:</t>
        <blockquote>
          <t>Implementation note: the self-delimiting nature of the CBOR
encoding means that there are no two well-formed CBOR encoded
data items where one is a prefix of the other.
The bytewise lexicographic comparison of deterministic encodings of
different map keys therefore always ends in a position where the byte
differs between the keys, before the end of a key is reached.</t>
        </blockquote>
        <t>Also, an implementation may be able to make use of the property that
map keys in Deterministic Encodings are ordered by the following
information, in order of precedence:</t>
        <ul spacing="normal">
          <li>
            <t>the key's major type</t>
          </li>
          <li>
            <t>the numeric value of the argument of the key</t>
          </li>
          <li>
            <t>any content of the key data item, such as
            </t>
            <ul spacing="normal">
              <li>
                <t>the string value in a byte or text string key</t>
              </li>
              <li>
                <t>the elements of an array key, in order</t>
              </li>
              <li>
                <t>the key/value pairs of a map-shaped key, deterministically ordered</t>
              </li>
              <li>
                <t>the tag content of a tagged key</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>I may be expeditious to use this property, e.g. by processing integers
first, starting with unsigned integers in ascending order and then
negative integers in descending order, and then strings (byte strings
first), ordered by their length in bytes (encoded in the argument) and
then the string content, arrays ordered by length and then content,
and maps ordered by length and then content.
Often, and particularly with integer and string keys, it may not be
necessary to actually build a deterministically encoded data item for
a map key to perform the overall map content ordering.</t>
      </section>
    </section>
    <section anchor="application-profiles-of-deterministic-encoding">
      <name>Application Profiles of Deterministic Encoding</name>
      <t>To enable the use of generic encoders,
applications are encouraged to define rules for representing
application information in the CBOR generic data model that enable
the use of Preferred Encoding on that level as well.</t>
      <section anchor="the-need-for-cbor-common-deterministic-encoding-cde">
        <name>The need for CBOR Common Deterministic Encoding (CDE)</name>
        <t>Applications can also define their own deterministic encoding rules,
as for instance FIDO CTAP2 (Client to Authenticator Protocol <xref target="CTAP2"/>)
does with the <em>CTAP2 canonical CBOR encoding form</em> (Section 6 of <xref target="CTAP2"/>).
Its description appears
to be derived from an equivalent of Section <xref target="RFC8949" section="4.2.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.
(The actual
structure of CTAP2 limits its use to cases where that is compatible
with standard Deterministic Encoding and thus CDE; there is text in the
specification that calls for revisiting the definition when this would no
longer be the case.)</t>
        <t>Application-specific deterministic encoding rules can make it
difficult to use existing generic encoders and may therefore diminish
the value of using a standard representation format.</t>
        <t>Instead, applications can define transformations of their data
into a more limited data model that reduces the cases the
Deterministic Encoding rules have to implement.
This allows both the following implementation choices:</t>
        <ul spacing="normal">
          <li>
            <t>the use of generic encoders with standard Deterministic Encoding
rule implementations after some application processing, or</t>
          </li>
          <li>
            <t>the use of specialized encoders which combine encoding with the
implementation of the application transformations.</t>
          </li>
        </ul>
        <t>The next subsection describes some of the considerations that led to
one such application profile for Deterministic Encoding.</t>
      </section>
      <section anchor="reduction">
        <name>Numeric Reduction in dCBOR</name>
        <t>The dCBOR specification <xref target="I-D.mcnally-deterministic-cbor"/> describes the pervasive use of Deterministic
Encoding throughout an application.  It also defines a simplified
application data model of numbers, where there no longer is a distinction
between integers and floating point numbers at the application data
model level — all numbers are of a
single numeric type, and the choice of integer or floating point
representations is made based on value:</t>
        <ul spacing="normal">
          <li>
            <t>integral numbers that fit into Major Type 0 and 1 are represented in
this way even if they were originally represented as floating point values;</t>
          </li>
          <li>
            <t>all other numbers are represented as floating point
values (and all NaN values are mapped to a single quiet NAN).</t>
          </li>
        </ul>
        <t>The underlying CBOR Deterministic Encoding rules ensure that, in both
cases, the shortest form for the case will then be used for encoding.</t>
        <t>Reducing the separate integer and floating point spaces to a single
numeric space is particularly attractive in implementation languages that
also only have a single such space, such as JavaScript <xref target="ECMA262"/>.
(While JavaScript recently has acquired a separate integer type, it is much
less well integrated into the language and existing libraries than the
more well-established general numeric type.)</t>
        <t>Within the CBOR working group of the IETF, the dCBOR specification
prompted a discussion about profiles for deterministic encoding, which
led to the CBOR Common Deterministic Encoding (CDE) specification
<xref target="I-D.ietf-cbor-cde"/> and the concept of a deterministic encoding <em>application
profile</em> (<xref section="3" sectionFormat="of" target="I-D.ietf-cbor-cde"/>).
Without help of the CDE specification at the time, an early version of
the dCBOR specification restated much of Section <xref target="RFC8949" section="4.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> and added a rule that gets in the way of compatibility
with Deterministic Encoding (disallowing the interchange of basic
negative integers in the range <tt>-2</tt><sup>64</sup> to
-<tt>2</tt><sup>63</sup><tt>-1</tt>).</t>
        <aside>
          <t>Early dCBOR specifications also had a mention as future work of
subnormal values <xref target="IEEE754"/>, which work fine for interchange (even with
Deterministic Encoding) in <xref target="STD94"/>.
Note that specific values may not be available to applications that
employ floating point hardware implementing the FTZ ("flush to zero")
and/or DAZ ("denormals are zero") strategies.
These may then require special handling in the application data model.
It is generally difficult to
rely on exact equality of floating point values, which however is what
Deterministic Encoding requires.</t>
        </aside>
      </section>
    </section>
    <section anchor="using-deterministically-encoded-cbor-as-a-deterministic-encoding-of-json">
      <name>Using Deterministically Encoded CBOR as a Deterministic Encoding of JSON</name>
      <t>Certain applications could make use of a Deterministic Encoding for
JSON <xref target="STD90"/> data.
Deterministically Encoded CBOR provides an attractive solution to that
as it is already well-defined.</t>
      <t>While the data model of JSON is not well-defined, I-JSON provides one
interpretation that is generally accepted <xref target="RFC7493"/>.
Section <xref target="RFC8949" section="6.2" sectionFormat="bare">Converting from JSON to CBOR</xref> of RFC 8949 <xref target="STD94"/> provides a way
to transform JSON data that conform to this data model to CBOR.
When used with its default parameters, the combination of (1) I-JSON,
(2) the
JSON-to-CBOR transformation, and (3) the rules for CBOR Deterministic
Encoding provide a well-defined Deterministic Encoding for JSON data.</t>
      <t>Transforming decoded CBOR data after interchange back to data-model
level JSON data can be done with the inverse of Section <xref target="RFC8949" section="6.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>
(the full generality of Section <xref target="RFC8949" section="6.1" sectionFormat="bare">Converting from CBOR to JSON</xref> of RFC 8949 <xref target="STD94"/> is obviously not required as only the JSON subset of the CBOR
generic data model is used).</t>
      <t>Comparing the handling of numeric data in the JSON-to-CBOR
transformation to that reported in <xref target="reduction"/>, the main difference is
that the former only maps integral values between
<tt>-2</tt><sup>53</sup><tt>+1</tt> and <tt>2</tt><sup>53</sup><tt>-1</tt> to basic CBOR integers
and leaves the others in floating point form.
(The rationale is that only this range is injective ("unambiguous" or
"exact") in the mapping of integers to binary64 floating point
values, which may be a desirable property beyond the use in JSON
encoding.)</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>One of the major use cases of Deterministic Encoding is in security,
namely in the derivation of signing inputs from some CBOR data only
available at the model level.
Any transformation error from the application data to the CBOR model
level and then to deterministic encoding can lead to a potential exploit
by an attacker.</t>
      <t>Pertinent Security Considerations are further discussed <xref section="8" sectionFormat="of" target="I-D.ietf-cbor-cde"/>.</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>
        <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94">
          <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/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>
        </referencegroup>
        <reference anchor="I-D.ietf-cbor-cde">
          <front>
            <title>CBOR Common Deterministic Encoding (CDE)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="8" month="July" year="2024"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2, providing some flexibility for application specific
   decisions.  To facilitate Deterministic Encoding to be offered as a
   selectable feature of generic encoders, the present document defines
   a CBOR Common Deterministic Encoding (CDE) Profile that can be shared
   by a large set of applications with potentially diverging detailed
   requirements.

   This document also introduces the concept of Application Profiles,
   which are layered on top of the CBOR CDE Profile and can address more
   application specific requirements.  Application Profiles are defined
   in separate documents.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-03"/>
        </reference>
        <reference anchor="IANA.cbor-tags" target="https://www.iana.org/assignments/cbor-tags">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date day="19" month="September" year="2013"/>
          </front>
        </reference>
        <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>
        <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
          <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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>
        </referencegroup>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <referencegroup anchor="STD63" target="https://www.rfc-editor.org/info/std63">
          <reference anchor="RFC3629" target="https://www.rfc-editor.org/info/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>
        </referencegroup>
        <referencegroup anchor="STD90" target="https://www.rfc-editor.org/info/std90">
          <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259">
            <front>
              <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
              <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
              <date month="December" year="2017"/>
              <abstract>
                <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
                <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="90"/>
            <seriesInfo name="RFC" value="8259"/>
            <seriesInfo name="DOI" value="10.17487/RFC8259"/>
          </reference>
        </referencegroup>
        <referencegroup anchor="STD96" target="https://www.rfc-editor.org/info/std96">
          <reference anchor="RFC9052" target="https://www.rfc-editor.org/info/rfc9052">
            <front>
              <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
              <author fullname="J. Schaad" initials="J." surname="Schaad"/>
              <date month="August" year="2022"/>
              <abstract>
                <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
                <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="96"/>
            <seriesInfo name="RFC" value="9052"/>
            <seriesInfo name="DOI" value="10.17487/RFC9052"/>
          </reference>
          <reference anchor="RFC9338" target="https://www.rfc-editor.org/info/rfc9338">
            <front>
              <title>CBOR Object Signing and Encryption (COSE): Countersignatures</title>
              <author fullname="J. Schaad" initials="J." surname="Schaad"/>
              <date month="December" year="2022"/>
              <abstract>
                <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. CBOR Object Signing and Encryption (COSE) defines a set of security services for CBOR. This document defines a countersignature algorithm along with the needed header parameters and CBOR tags for COSE. This document updates RFC 9052.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="96"/>
            <seriesInfo name="RFC" value="9338"/>
            <seriesInfo name="DOI" value="10.17487/RFC9338"/>
          </reference>
        </referencegroup>
        <reference anchor="RFC7493">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC9557">
          <front>
            <title>Date and Time on the Internet: Timestamps with Additional Information</title>
            <author fullname="U. Sharma" initials="U." surname="Sharma"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="April" year="2024"/>
            <abstract>
              <t>This document defines an extension to the timestamp format defined in RFC 3339 for representing additional information, including a time zone.</t>
              <t>It updates RFC 3339 in the specific interpretation of the local offset, which is no longer understood to "imply that UTC is the preferred reference point for the specified time".</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9557"/>
          <seriesInfo name="DOI" value="10.17487/RFC9557"/>
        </reference>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </reference>
        <reference anchor="ECMA262" target="https://www.ecma-international.org/publications/standards/Ecma-262.htm">
          <front>
            <title>ECMAScript 2020 Language Specification</title>
            <author>
              <organization>Ecma International</organization>
            </author>
            <date year="2020" month="June"/>
          </front>
          <refcontent>Standard ECMA-262, 11th Edition</refcontent>
        </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="RFC8746">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Typed Arrays</title>
            <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR), as defined in RFC 7049, 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.</t>
              <t>This document makes use of this extensibility to define a number of CBOR tags for typed arrays of numeric data, as well as additional tags for multi-dimensional and homogeneous arrays. It is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8746"/>
          <seriesInfo name="DOI" value="10.17487/RFC8746"/>
        </reference>
        <reference anchor="I-D.ietf-cbor-edn-literals">
          <front>
            <title>CBOR Extended Diagnostic Notation (EDN)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="4" month="July" year="2024"/>
            <abstract>
              <t>   The Concise Binary Object Representation, CBOR (STD 94, RFC 8949),
   defines a "diagnostic notation" in order to be able to converse about
   CBOR data items without having to resort to binary data.  RFC 8610
   extends this into what is known as Extended Diagnostic Notation
   (EDN).

   This document sets forth a further step of evolution of EDN, and it
   is intended to serve as a single reference target in specifications
   that use EDN.

   It specifies how to add application-oriented extensions to the
   diagnostic notation.  It then defines two such extensions for text
   representations of epoch-based date/times and of IP addresses and
   prefixes (RFC 9164).

   A few further additions close some gaps in usability.  It modifies
   one extension specified in Appendix G.4 of RFC 8610 to enable further
   increasing usability.  To facilitate tool interoperation, this
   document specifies a formal ABNF definition for EDN as defined today,
   and it adds media types.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-10"/>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>dCBOR: A Deterministic CBOR Application Profile</title>
            <author fullname="Wolf McNally" initials="W." surname="McNally">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Christopher Allen" initials="C." surname="Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="10" month="June" year="2024"/>
            <abstract>
              <t>   The purpose of determinism is to ensure that semantically equivalent
   data items are encoded into identical byte streams.  CBOR (RFC 8949)
   defines "Deterministically Encoded CBOR" in its Section 4.2, but
   leaves some important choices up to the application developer.  The
   CBOR Common Deterministic Encoding (CDE) Internet Draft builds on
   this by specifying a baseline for application profiles that wish to
   implement deterministic encoding with CBOR.  The present document
   provides an application profile "dCBOR" that can be used to help
   achieve interoperable deterministic encoding based on CDE for a
   variety of applications wishing an even narrower and clearly defined
   set of choices.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-10"/>
        </reference>
        <reference anchor="CTAP2" target="https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-client-to-authenticator-protocol-v2.0-id-20180227.html#ctap2-canonical-cbor-encoding-form">
          <front>
            <title>Client to Authenticator Protocol (CTAP)</title>
            <author>
              <organization>FIDO Alliance</organization>
            </author>
            <date year="2018" month="February" day="27"/>
          </front>
          <refcontent>CTAP2 canonical CBOR encoding form (in Section 6)</refcontent>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="I-D.ietf-mediaman-suffixes">
          <front>
            <title>Media Type Suffixes</title>
            <author fullname="Manu Sporny" initials="M." surname="Sporny">
              <organization>Digital Bazaar</organization>
            </author>
            <author fullname="Amy Guy" initials="A." surname="Guy">
              <organization>Digital Bazaar</organization>
            </author>
            <date day="19" month="June" year="2024"/>
            <abstract>
              <t>   This document updates RFC 6838 "Media Type Specifications and
   Registration Procedures" to provide additional clarifications on how
   to interpret and register media types with suffixes.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mediaman-suffixes-08"/>
        </reference>
      </references>
    </references>
    <?line 770?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document was motivated by the work of Wolf McNally and
Christopher Allen as documented in <xref target="I-D.mcnally-deterministic-cbor"/> and discussed in 2023
in the CBOR working group.
It collects information that is present in the apps-discuss and CBOR
WG mailing list discussions since 2013, but not necessarily easy to
find.
The author is grateful to the many contributors to these discussions.</t>
      <!--  LocalWords:  deterministically
 -->

</section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V93XIbR5bmfT5FDn1hUAYgAvyRRHncTZG0Wz2W5DXlcExP
zA4LQAIsC6iCKwukYIU65mYvNvZ2H2HfZN+kn2TPd87JrCz80I652Q63TQBV
WZknz893fvJUr9cz9+f22Jg6r+fu3B5cvnr347l9V9grV7tqkRe5r/OxvS7G
5SQvZgcmG40qR/ccPHLNpBwX2YKGm1TZtO6NymqRFUVvTH/0Jq7uzbPa+dqY
Mf13Vlbrc5sX09L41WiRe5+XRb1e0t2vr99/ayZ0zbkZl4V3hV/5c1tXK2ey
ymU0h4vlcp7TKHSLt1kxsT+6bN57ny/cgXkoqw+zqlwtzy0WZT64NX01OTfm
3hUrGtNa/fngsizGuXf2VV5k1dq+G/3ixjWNtawcPbXm8e2bLC9qV2TF2PGj
rj/SJ89P7uABhwc04iLL5zQgVvrn3NXTflnN8P0sr+9Wo3PLJHiYPRXC4Aqh
ynjijMlW9V1ZYWI9+r8lotByL/v2ldCPvxO6XmaVp6e3fqEnndufivzeVT6v
/+//qe2ryi3oovd/e80X+Lpyrj63P5S+nmbjO3t8fHRycsS/jfOadkFukC/K
CT3nqjd8fnz6Qr9ZFTX26juHh675y+VdWdB1X5286J0MB73h4Hnv7PjFcMA/
OqHGOBuVf65/y0ELY0yBOdc0TSz05v3Vi5Nzvron1DFf4MM/n9sfv718/uIE
z37du+q3SEVXEr3oh4u3F33+ss5mYA36N+5vvvf5Yjl3vftsvnJ0gXykOzH4
2eAIA03mxoD92rM6O46zWtXT5+msjs+GL3TqR/GiX3xZtKY+PA0XnTXrK71L
L3pxdDqUyTw7eXFMUsCj8BfHx8cvzuXPF6enz2jqDpKARV9fXz87VaLVWTXD
nt7V9dKfP32aO+c+Ludl5fr4EyR/StK4om2tnz5/dnY2HMpuqrxjMHtTEz9n
1cQSEey385LoUMx6P5TE7/aiIs5dOJJvvq1hUVqQsByG4M8sqXaazb0TfnNV
7jxIK9fb8LTJuaUF9IZHgxf6w9W71+d2cNQfDI5ePMVVRLc+fu83c76+fHMx
PBvuXvfDw0PfjRdZDzJaFSyx2ZyXv1yNoo546nWp/uk1rqbx+nf1IqUIHnMz
rvJlbYdHwyP7fVbMVtnM2ZulG+dTHWkfMTCqfZ3OISENxusdnfE3lZuSTiMZ
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
aKD1/wAvTMtxSYAAAA==

-->

</rfc>
