<?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.21 (Ruby 3.4.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bormann-cbor-det-04" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.24.0 -->
  <front>
    <title abbrev="On Deterministic Encoding/Representation">CBOR: On Deterministic Encoding and Representation</title>
    <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-04"/>
    <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="2025" month="January" day="21"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <abstract>
      <?line 88?>

<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 and Representation.</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 98?>

<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 that
clarifies Section <xref target="RFC8949" section="4.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> in order to allow
fully generic CBOR implementations that can 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>Deterministic Encoding assumes that the application already has formed
data items at the CBOR generic data model level, presumably in a way
that satisfies its determinism requirements
We add two terms to encompass the entire process from application data in
platform and application specific forms towards an encoded CBOR data
item:</t>
        <dl>
          <dt>Deterministic Representation:</dt>
          <dd>
            <t>A representation process that employs application-layer processing
of data into deterministically formed CBOR data items and then
applies Deterministic Encoding to achieve a deterministic
representation of the application-layer data.</t>
          </dd>
          <dt>Application-Layer Deterministic Representation (ALDR):</dt>
          <dd>
            <t>The part of Deterministic Representation that is not covered by
Deterministic Encoding.</t>
          </dd>
          <dt>ALDR rules:</dt>
          <dd>
            <t>rules (or a ruleset) that achieves ALDR.
A CBOR protocol that is described in terms of data in some platform
or application specific form may set up ALDR rules to describe how
an ALDR of these data is achieved, as input to Deterministic Encoding.</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;
the present document focuses on Deterministic Encoding and just
mentions ALDR rules as a way to manage required application processing.
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 (ALDR) 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-rules-for-deterministic-representation-aldr-rules">
      <name>Application Rules for Deterministic Representation (ALDR Rules)</name>
      <t>To enable the use of generic encoders,
applications are encouraged to define (ALDR) 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 (ALDR) 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-layer specification for deterministic
representation at the data model level, building on CDE for
deterministic encoding of these data.</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 rulesets for deterministic representation
at the application data model level (ALDR, see <xref section="A" 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 anchor="aldr-in-rfc9679">
        <name>ALDR in <xref target="RFC9679"/></name>
        <t><xref target="RFC9679"/> describes a process that derives a deterministic thumbprint
from a COSE Key <xref target="STD96"/>.
<xref section="4" sectionFormat="of" target="RFC9679"/> defines the application-layer subsetting that is
applied to the COSE Key to derive the input for the deterministic
encoding that finally supplies the input to a hashing process; this
section essentially serves as the ALDR ruleset for this specification.
The paragraph at the end of <xref section="4.2" sectionFormat="of" target="RFC9679"/> is an example for
an application-specific <em>reduction</em>: the ALDR ruleset only allows
uncompressed point representations, and it therefore needs a process
to derive these: "if an implementation uses the compressed point
representation, it <bcp14>MUST</bcp14> first convert it to the uncompressed form for
the purpose of thumbprint calculation".</t>
      </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="21" month="January" year="2025"/>
            <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.  It also defines "Basic Serialization", which stops
   short of the potentially more onerous requirements that make CDE
   fully deterministic, while employing most of its reductions of the
   variability needing to be handled by decoders.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-07"/>
        </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>
          </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>
        <reference anchor="RFC9679">
          <front>
            <title>CBOR Object Signing and Encryption (COSE) Key Thumbprint</title>
            <author fullname="K. Isobe" initials="K." surname="Isobe"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="O. Steele" initials="O." surname="Steele"/>
            <date month="December" year="2024"/>
            <abstract>
              <t>This specification defines a method for computing a hash value over a CBOR Object Signing and Encryption (COSE) Key. It specifies which fields within the COSE Key structure are included in the cryptographic hash computation, the process for creating a canonical representation of these fields, and how to hash the resulting byte sequence. The resulting hash value, referred to as a "thumbprint", can be used to identify or select the corresponding key.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9679"/>
          <seriesInfo name="DOI" value="10.17487/RFC9679"/>
        </reference>
        <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 Z, 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="8" month="January" year="2025"/>
            <abstract>
              <t>   This document formalizes and consolidates the definition of the
   Extended Diagnostic Notation (EDN) of the Concise Binary Object
   Representation (CBOR), addressing implementer experience.

   Replacing EDN's previous informal descriptions, it updates RFC 8949,
   obsoleting its Section 8, and RFC 8610, obsoleting its Appendix G.

   It also specifies and uses registry-based extension points, using one
   to support text representations of epoch-based dates/times and of IP
   addresses and prefixes.


   // (This cref will be removed by the RFC editor:) The present
   // revision (–16) addresses the first half of the WGLC comments,
   // except for the issues around the specific way how to best achieve
   // pluggable ABNF grammars for application-extensions.  It is
   // intended for use as a reference document for the mid-WGLC CBOR WG
   // interim meeting on 2025-01-08.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-16"/>
        </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>
            <author fullname="Laurence Lundblade" initials="L." surname="Lundblade">
              <organization>Security Theory LLC</organization>
            </author>
            <date day="8" month="August" 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-11"/>
        </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 813?>

<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:
H4sIAAAAAAAAA719W3MbR5bme/6KHPjBoA1ABHiRRPV0N0XSbvZYkteUQzE9
MTssAAWwLKAKriyQghnqmJd92NjX/Qn7T/af9C/Z851zMiurAFCOedgOtw3W
JS8nz/1W/X7f3J/ZI2OqrFqkZ7Zz8frdT2f2XW4v0yotl1meuSqb2Kt8Ukyz
fG6TfGp/Sldl6tK8SqqsyDsmGY/LlIbp7H3tWfuVaTHJkyVNOC2TWdUfF+Uy
yfP+hH70p2nVXyRV6ipjJvTfeVFuzmyWzwrj1uNl5hwNUW1W9Pb11fvvzJSe
OTOTIqfx3dqd2apcpyYp04SWdL5aLbIJz+p08cmi/z5bph3zUJQf52WxXp1Z
bNt8TDd0aXpmzH2ar2lMa/V256LIJ5lL7essT8qNfTf+JZ1ULUDYN0mWV2me
5JOUp7r6RH85nrmLCQ46NOIyyRY0IHb65yytZoOinOP6PKvu1uMzyyB4mD8T
wOAJgcpkmhqTrKu7osTC+vR/S0Ch7V4M7GuBH18TuF4kpaPZG3dopjP7c57d
p6XLqv/7fyr7ukyX9ND7v13zA64q07Q6sz8Wrpolkzt7dHR4fHzI9yZZRacg
L8iFYkrzXPZHL45OXuqVdV7hrL5PMemGL67uipye+/b4Zf94NOyPhi/6p0cv
R0O+mQo0Jsm4+HP1WwZYGGNyrLmiZWKjN+8vXx6f8dN9gY75Cn/885n96buL
Fy+PMfd1/3LQABU9SfCiG+dvzwd8sUrmQA36N96vr7tsuVqk/ftksU7pAfmT
3sTgp8NDDDRdGAP0i1ZFd1+ePn9JA96tl2NZ5ulRWOa6mr2Il3l0OnqpezkM
D/3iiryxl9GJf+i03nDh0vihl4cnI5n/+fHLIyILHoUvHB0dvfRrOzl5TntJ
QRqAwtXV1fMThWKVlHMc8l1VrdzZs2dZmqafVouiTAf4iTN4RuS5pnOunr14
fno6GsnxKovAYPamIgRPyqklqNjvFgUBJp/3fyyIAOx5Sai8TIn++bUaZ2lD
goMYgv9m0rWzZOFSQcC0zFIHWMvz1s82PbO0gf7ocPhSb1y+uz6zw8PBcHj4
8hmeIrgNcH9Qr/nq4s356HS0e98PDw+DdLJM+iDaMmcSTha8/dV6HJjGM6db
dc+u8DSNN7irljFEMM3NpMxWlR0djg7tD0k+Xyfz1N6s0kk205H2AQOj2ut4
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
BdJeXqWIAAA=

-->

</rfc>
