<?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.7 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bormann-cbor-det-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="On Deterministic Encoding">CBOR: On Deterministic Encoding</title>
    <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-02"/>
    <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="March" day="03"/>
    <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 BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</section>
    </section>
    <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="I-D.ietf-sedate-datetime-extended"/>.</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>
      <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="January" 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-01"/>
        </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>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <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="I-D.ietf-sedate-datetime-extended">
          <front>
            <title>Date and Time on the Internet: Timestamps with additional information</title>
            <author fullname="Ujjwal Sharma" initials="U." surname="Sharma">
              <organization>Igalia, S.L.</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="23" month="October" year="2023"/>
            <abstract>
              <t>   This document defines an extension to the timestamp format defined in
   RFC3339 for representing additional information including a time
   zone.

   It updates RFC3339 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"; see Section 2.


   // (This "cref" paragraph will be removed by the RFC editor:) The
   // present version (-11) addresses comments received during IESG
   // review.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-sedate-datetime-extended-11"/>
        </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): Application-Oriented Literals, ABNF, and Media Type</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="1" month="February" 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.

   This document 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.  To facilitate
   tool interoperation, this document specifies a formal ABNF definition
   for extended diagnostic notation (EDN) that accommodates application-
   oriented literals.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-08"/>
        </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="9" month="January" 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-07"/>
        </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 Types with Multiple 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="2" month="March" year="2024"/>
            <abstract>
              <t>   This document updates RFC 6838 "Media Type Specifications and
   Registration Procedures" to describe how to interpret subtypes with
   multiple suffixes.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mediaman-suffixes-07"/>
        </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:
H4sIAAAAAAAAA8V93XIbR5bmfT5FDn1h0AYgAvyRRHm6myJpt3osyWvKoZie
mB0WgARYFlAFVxZIwwp1zM1ebMztPMBe7JPsvkk/yZ7vnJNZWfihHHOzHW6b
AKqyMk+en+/85Kler2fuz+2xMXVez925Pbh8+fbHc/u2sFeudtUiL3Jf52N7
XYzLSV7MDkw2GlWO7jl45JpJOS6yBQ03qbJp3RuV1SIrit6Y/uhNXN2bZ7Xz
tTFj+u+srNbnNi+mpfGr0SL3Pi+Ler2ku19dv/vWTOiaczMuC+8Kv/Lntq5W
zmSVy2gOF8vlPKdR6BZvs2Jif3TZvPcuX7gD81BWH2ZVuVqeWyzKfHBr+mpy
bsy9K1Y0prX688FlWYxz7+zLvMiqtX07+tmNaxprWTl6as3j29dZXtSuyIqx
40dd/0qfPD+5gwccHtCIiyyf04BY6Z9yV0/7ZTXD97O8vluNzi2T4GH2RAiD
K4Qq44kzJlvVd2WFifXo/5aIQsu97NuXQj/+Tuh6mVWent76hZ50bn8q8ntX
+bz+v/+7ti8rt6CL3v31FV/g68q5+tz+UPp6mo3v7PHx0cnJEf82zmvaBblB
vign9Jyr3vDZ8elz/WZV1Nir7xweuuYvl3dlQdd9ffK8dzIc9IaDZ72z4+fD
Af/ohBrjbFT+qf4tBy2MMQXmXNM0sdCbd1fPT8756p5Qx3yBD/94bn/89vLZ
8xM8+1Xvqt8iFV1J9KIfLt5c9PnLOpuBNejfuL/53ueL5dz17rP5ytEF8pHu
xOBngyMMNJkbA/Zrz+rsOM5qVU+fpbM6Phs+16kfxYt+9mXRmvrwNFx01qyv
9C696PnR6VAm8/Tk+TFJAY/CXxwfHz8/T9fuHSShh3/VxN89B/abuAktin/B
tdfX109PlZx1Vs2w23d1vfTnT57kzrlfl/Oycn38ic14QnK6og2vnzx7enY2
HMo+qybAYPamJk7Pqokl8thv5yVRqJj1fihJEuxFRTy9oMmM+baGeWmpwowY
gj+zDNtpNvdOONFVufMgulxvw9NoNbSA3vBo8Fx/uHr76twOjvqDwdHzJ7iK
KNrH7/1mzteXry+GZ8Pd6354eOi78SLrQXqrgmU5m/Pyl6tR1B5PvC7VP7nG
1TRe/65epBTBY27GVb6s7fBoeGS/z4rZKps5e7N043yqI+0jBka1r9I5JKTB
eL2jM/6mclPSdrS5dbg/7gJmgJl17WBQ39nrSa5PBMM9PRmCF36JH8/ObVZV
2XpLgtyk6M1zmgltyLmlT3rFgrT2fL6Gim7UOt9CmpzvLKt8Rhdfvrv4YQ+5
p/mkpEFyqEkmsifieP66dz/sH/XyCbb32dFw+FS+Hc9zWmuvLnugGv0JQtKz
llVZl+NyvnUb9mX+xbjOlsPeOCvKgm6Y68rUBPUgzuneXfJDbF3ai/Qh9gd9
CKlwWtPh1uapWv321dVbe6HLau0bKbyjYW/4dHPrhEY2zo9tkA3zgzwtbCcv
7A1ZGliXs0PZt7Nnx8/O7cJN8gxG0Kebx9+S6u351XSa/wqFtljN6xwqzfR6
PZuNSMdnY7Ks//Lf6e9B71+bv2Q9PIsOyZB9ftLF8yx07KGduGleOG8PWiYd
3CBm3U341gOySWKaah+nftIf9q19d+es2ksb9Ap9Ud7nExo3mwivEiGirg2y
MipXtV2R+R1n3vkuzYXU1Jrvh9mn+yuR0S7bXVbhi2iWx3dlPmY6WdZSuzFJ
Xwi0yEndE7G+gCRW5WTFKyCjhNn/LhTApr5rP35ky/Xpk818XK6bkCFJiJrT
usEomZUV24c7MgC0Pp/PCjsjOfFEjfF8NXGWmNIsSwI/o5xEc23LqSUND3tM
W+AXtBNsksmC/ea6pErzKn6/cN5DDfFPBiRyAk10qAfS0yAxPcIWzokyZ5RA
6ykIgNU5r41o9KqwMO1hJ5hb6BHlg7e+XLh07yBLIyccTWPSwr27h0ox91lF
clLT/Q93OcEMZQI7yadTV2FbswWwhMci/TJTPEUAydu5K2b1HchiXq4JJPZ5
Z+QhFQg6cwUeQoufEprBJIgBQFWsTu6mP7Pa0LULAjr0dBIIlkAsO69tB/Tg
y8FdJC9kGLqYCgGcyhNxcTvvB28dU4weM83rw775lsbgYXVKtEgakp5FSn1F
88KV2fwhW/t0Xp70CRAv84HJ7gkWZaO5sx3aOegiXk92X+asG+Yu4//+5qrS
0zOJ16KkDWznB9IyrqpoVjdkRrN5/hvvxyGWoJjpT4E5gRY9TYEmqHRwzCC7
5HK2yicMbkEn3vm2pPkXtE0lLacykDDsOISWhj5ophR9AGKmdN5D23lcs+yc
/qykKY7cuiwmBnTcs/S4Njta69JAv2o1p9tpNear3UrhK+GukgWdoB+msPtK
rLIuoZo21kDyJru9ZG2i201Ub6l6UQJkcRdeuIvcF+t+WeWES1keal4eX7Ug
ksyJB+7dnKZH3DS+y+kDb2J3LwXA7QAJpIOgJZuni3o07LpMVPZJ51Syr/N4
oSFjxEaAZhnkKPzGmmySe/DsRJRwwjduSmNCBgzhy+YhcQbkdz1h/G2XpLUg
2jTVJTlNWDI5ZCTXRHdWFeQ40o4Rk9EVNVGaVAqtSkl9iDuz9hbI/cRr39H2
FUrbralBhH3QV2GOtIonoEWLx41aE96gOvtAY2a0vV0aIgfn76U/OTVmD+tg
KNkb8nSxBrB733TI3JDy8bWIJyuln95923tmO43gHKtUwOX4E3slnz4dBr0K
8yLMR3aCkTkZI3OQF0TtfHJgocjjLgSl3PDfvCxmtCL6DCswhhGp1v1Ds28d
4AFGCazs28K9Q3Y7tI3O8NNa1/aPd10d8EcWJirzfCDrit3DfomMwPdh/hpl
4w8PAMXjcrGk1auxA3M+5GQVwUUjGB0/XpGWJaZcVay88kIoHqz2oWiBLezi
SEeXFSIVttRboutqVVSwptHaNDpnN855DOOY349xHsE3L4yYIdrL5Lk0i7gc
pudd+QAjTfxI4KEGmYhE5PsTeR6INmSIDbllMzJNzOcumANQHgRHwISm96ie
pPWQLAJug7AJofFj1EMijSsv3ET3/LwqhEdYEtj+XJaLBcnknkd1Lq+uAcQQ
EGCpyJL98alLxkvITFtzRMmgzZvmc9cw3AS6t1zKzERBsVUnGGQYftDdu+wj
rgpYZ8xTt361XEID8QSYtV29NkS+LA1c0efdcyPF9sUXwKX3QAkhxnUVec8L
cG2YkcdKsCk9Zd03PxKgIKgiVof037iOGzDNFiQ3WdVQXRhwmVU0kdU8Y5hZ
8s+NQfeMRHDdbuHvy7ymJWgGGmNxvPliJZmyLM2EVNtTrkgT5WzuXE6G4aEw
3tFkSAxbywSznhuzRx2fG3J9yXjw2EF4Fhkw6KrCfNrKu3MdDR0zQcSY5FQA
jPHOBgzHrmXcIR/kRh/DuD1wloJZGgWSGVBfNwJysUUbakNtVlmIIFXQ6zTC
yNUPjsxRA6I/kMEW3gngoo+AE4HiNmDcoW0FbjvdlkSr8/K93IzR3rVAVxS9
iKxSYKNb+jLzxMHfiZzQEFe44jWDGmgd4rlsNRNvCXCtGSqIrH2XzUgNeseq
x3AYtGZgmtjF/slOO9JPWSJMF9ywh1H2GTvcclG0dAQMpNDHLaC7/V4sAOou
CDtg45ONndDyfNATarg7W4DykDkOl8ADscQjBG13IMoEPebFckWGXZyWHSCS
mCInKc9Yje2ZdJfvjYMSsWWILLKHsdEStLb4cxucjElDyHYHjtvadtvBtpNf
XCabPdzJxIfirrZMuXqsCVPuIQpUoamCZ9/oI7k9z2ZFyfxAIEJVRDOdZzQZ
syVR3oaALBb98ePFkmX7V/sd5t5DmPnTp65RENKACwVTiMmJEeP0Ss6/sE4+
uL56c0Ceoo5udswOpHh/JzZsy97GwDZ7qgywGYeQZiHP12pWBExJyGgCm+QS
n7nC9omz4NV3IIYl41hlArgEPNEoVoY5eP3TzbuDrvzXvnnLf/94/d9+evXj
9RX+vvnzxfffxz+MXnHz57c/fX/V/NXcefn29evrN1dyM31rW1+Zg9cX/3wg
Nuvg7Q/vXr19c/H9gd3EeILn2eLxAmjjQWCCy+QEj6t8JPvw8vKH//O/Bie0
H/9AGzwcDJ7T1sqHZ4On2GfS9oU8rSzIMspH2tG1IVvrsop9FMRqsmVO7hXg
nIfpeCjYZNFGffUvoMy/nttvRuPl4OQP+gUW3Poy0Kz1JdNs+5utm4WIO77a
8ZhIzdb3G5Ruz/fin1ufA92TL7/545wk3PYGz/74B2MQcPuJmO4S4PcRFGvM
S0e/RtTOyk4lhjQlGVC/H3uSXXXEhKv5xMzzD7zdS05USOwL0SJkDXmEBImL
LyVmlVRsuZrdqTYgBeERXqVJxBCBmgAB28TxiCSV9i67F2OaF+W8nK2DplwI
gLuKIuu3QmyJOLORIYDCMY+CVCThxqpcYHTGCDFsFEB619JycmJDdoEq/q1q
hysRYUPgDgqQ8NJXwNR0Ka9pVbPdABq1HJ1CWBCuo9zqVwgFKGBSTMwOC6lx
GueVZQ82L1blynNiY1ZpIApmgASgpqXY/VGfcbnMHT8+WFeZUVeymQHXEHqf
57M7nh1/Q+SnFUrILhoPmT/fb1097vMYLx3TDWRBnJBXzshyYUt4QexLwpVU
bOXXno2G4jOJ8yveAoIsx+NVVYmfLdks4jCfC1+MM4j4fGmjFq2jVznmx2Qj
/XMq+VTVwLR6muHC94Ww77CSe+K2shK4zyG3Bu1hpfgD6d+42SE6u9RZ4z6E
mWHnlSqyzVVW+OgeKpXWQCtYlV8JecIt7PFvbJ8kdmUL4XJJRpVsXu0eEDwX
Kuce+JUoQnaeZwBNyesQVGM3ZsJ+FxkVfEFT9qsxGGK6msN9Ia59tWDHCp5E
46pHDk9kaCNAfbciWfMgLFZJy1jkv7GbWnBBwS8rib62djlwQ1uSvGybVyQF
Tuzq8AH2TDOPmFUuq5bHJLMhI8Gww4oJom1ko9O3JDyJv6Vzy5HfRxxsKS4o
x/IQ2GOJp0Hu4Ga2HwD/FfpP9NEIiyBFR1QUqJ5omlVFjIvoOkH89kYEovVI
VU5YdPBbXCMeT2tkiAtFLeNjTVOssEI8mD6xcSwLuRlbtKGWApJkSozvsmJG
tABN1eNF0BPm4DU0ZRDLMX3rbGfhFmX+mzu0op5VgQGoQHJ8KZQGreihRKom
3I/7J3obm+4mWhtuJ/Z17MpkM8imOkqGs3riquIWHpioLLFKnT/wKP38UIbB
klhbGsdsHso4V2yHfmXadOqGp7UyUJzG8Hj83SGv07uKxsigLgy5j/mYc51C
LkJm4LAwb1klRw6xwesgymY7si0Iiv4hPJuEu4SS3r2gITSZTaaBL8f0x/lS
nw76S0LWJfvDu7E3R/feqQbaE/NBHoasoM5tzMwe/CVZL36GCVXDbuSaEcSh
yGdE0REpIyZ8/CXGirA57r78IBieFpCxzTdZXWfjDxIGmsDM8YqELWnSF0DU
K00wbdExZshEZYBhABBFqkinJJGglv8Fvdrynvb5MuQql4b1f3qx2lQOlH3V
ji61+emrQ5Vto1h/Eh6Uzky9JrKNbj7vmrrJSySO6KbGjFm9zM7KcqI7dEe4
Bp6PiDp5VYQwUHx0Q9uD6b5id9aY8Iv9tiLJQDWXh2G4wywu395c8/B/wR+c
TiXav764tJ2kiMAJt2XmtWZIk9w/FnVJROzirsOWIs0LjjSz6iIdoMH22kDe
iSNWvKusXVP11Q1WdENcQ+DdzAFxKkeUzBAaNZ03Za1Rx8a5fK6eLiqD2Lk8
S4Lju4OEpgmhQC3A1YC9uG8AoBJW4wSMKZOZM0OZjaTOuFov65JYfXkHe5Fh
C+gO/wKc4RlJI+aloXeyEn5F6KY2qiAvy03o18jwj6lLqbK3kVMwyBM8Erla
sdK/vLpGuuLPEtPucgoaYqDImnVqunSNwuK7jLEpfwTTkACYkOdFzgDkQ3gC
lEoxZ0gaNbCzZTxZnqOIxnhyyiWki2+YhzcBUI6NyVYAuhxrJTAEb2evKPLo
wSijrivXeEtQVv6F0bwvw0s8gHAYMg1CGYLfLtizzdxHf1/MHQ+krSuRKy2A
fmsFUL5cVRL9ZH6X2IBkfxaM3hEQa0jvVVw5FsGCsYHB++wz3mj4nJYVok3X
mnfXSLh8MGZnPB42KNHvHHdLkVZCVfImKhOBA930b/rAf5PSFgY2YJ66KgU/
YuH3IagQfAxajcniXLVG4MlEpknKoyo5iChzqqsVYyOpskgSAi/M1ley36qh
mxXF/AI4FdZ/44lYTMwvjebYvJilfmAA2U5/hvG0WOlnhDl5bPcrOIFWHhIg
G7QGX5cc7MiMhs+JLk35hRPvPJMaLEXiMo9itRhpDhghUVpFyu3guCCapKTn
KzGFcR7t9RKjlEvJo5npXOLIJE5kdugv9gthcyR+qczFqQrZXjGinCBpIDUh
hkydPsKiCfc01SPeJNibGZ0lbyGRDAAyAE5JtELgGV1lSUWYqzhnaRCW2I5f
s2ZLHjxrs5ffJ63dkO7raka00XBKFESxWHsQZKznSE4bLm7Z3FzTmKpd03vg
2OPKB/+sVe7SxC1MQP2RfWOgtl1M1OUwZfFlHcAxkhIYk4ygN5lIEDz4SpKu
MTpzLrmyyodUWJY8gjaqRBYwJlCgwRIgI7OeNGF22DjANZBeNaVJYBWtiVTX
ZE/1S+edoudWJi2Y/1hj86VPMjokCbyxqgNfGM/JHP2arB89sHyAzbsBp7b0
A+8w49ogZLS/4w/qghRJnRYsYYAxxtPtfpo7H/2DVrR3H1B/KV5M4hY8EpYT
rC5qdQKiZ1O60LDMMp2TTRqttz2RZkfwzJ9XxFgi75PkRpiDcYhtGVmM+HnB
/YvPYxL0G9ywrU1p5Uw9vnohxZiO5aM1UuCGsDgW+OiAiWeQ6Ty6rdH3Zc+L
TeE2mzaNSJmEZVVuNOss9t9C8XHGkoWc2NzAZYxp1GlItEsyq4Bo+sO9W625
I6isMDfVtpJQ3pgNS+zmHExZPNnx/FKf3hB7P226pokgZezBRkITG0cqgSdC
xFKJSkMywkiuB50aZsmioxpT7sm5kjZeBZtxourjFzhs8GkzAf9IaYQwCQIM
wiiYAD+EvO/IpAGCYxxJiLWSnjsg8cePfPiBE2Jv1LnEFxzKUAcowJat/F7f
vC+15nFX9k/xJabbMsoNooJNk2ocmNS9fv0XRNPrXzMOFfKUeG1HTM6B7VwR
EZ7g1A6ptm85ySQZ367VgG1SSkB30o0I3dI1C9SRkQGrnNdKEj7qsytHljiq
fzTmm3/o9ezw2L4do5h/cGwHJ+enw3P6pnf09OjI9np/MOZvf/ubOeoc4Pfe
4Kg3PH43HMhVfz043PPL10dH50dHWz+H4Wl0+Rljg3fWvGETV5R1UjwYU97Q
OLRU+PgSYhPeF/2mtiTZGRMCTeL/rGHUAEoyqfRJM56ZN7d7F3eLB++rZ/Pp
NEzL2CdaVcF0Va1TvzLOr+XAEJwm9cX1iGUltYp6PRcJuh4OEsU6Zwak4pVL
kg/cw7F8F1gMc+TqPRxYyAuWMb7tMpvnNNEiz7pxCCfhZ9hJSQn8xsggFJuV
06lUkphYdtdw3EgM4a3s6y3J4Psm0G2neYX6vodSS2/I7KYxHc5pAGHojpIP
zSXn9Kgk+835YznjwwUOGsvbSVQuGVkn8+KjQrKC20SXmNP+WSgtPD5+TsqD
a5jLuuEqqUBo+0htbN6LagARiLCXWq7HCReuX+Einx4pCNqDRGwZjuEJB389
EKA4ktxfo4m3UQ6ewSCnKcgA7cKo4M3bQWdw/Gx4enY6ODk+vO2aeRmB6U6a
haAWKyMBsZn9RZJfEZoJc79q2BZOH6EqVJ2S64q4/25x+WMa51GBO+sNhr3j
wbvh8fnp8/OzIxa4WPoqFjQJBtaGyRP0ph10NcrdCgtwciDXVOmY3fySNgN5
LnilEjlrZAUOL1vgX8duKTSJsUpRL1wj6rIl6oHKYtI8/wgIdEujv85+phHf
4cyKPepikqDn025jMof85zGZzoBojfl4nsE5/WT+gMQoO2Aak2g0vkq1FxcS
OHflU9fRnJ3+/d//5+nxGf376OhI/h3D5NNwak2SwSBl156d0uVH/L/+Efyr
nSaD/dkcO+LNqKQ1juRkCJZREP/rxw7oTV7doZ1mnLY71/ww7SCfCDC3w9tv
CP79YXD2zRP89+//8T9uB0fynX5lOzG0ldwwHDY3nLauR80HO5CISk7LVZUw
Kwk7ez/Bn9iIy3IeWLarlu0SO8wJyHcc3gtljE3dInBaT+vCt3PMZydEDKQe
VwViPGyKa4fyYtkistKL+EB7dMiKz82kVrN9CQ3CFw0OMauuQjUitQox0Aqe
eIon2t1PC6VrmHiZnCoBS29UoLYyM6Ewb+EyPO6FZit3VMC1znj4ttdL1oOT
li2m7xyMaKqrhSfb/18mc1bRmkkwJQM4x9G7huIdyOawTVr+7vhwF30uxuOy
CkmVz1fWISvfPoIRaYGJFfERrOimkDzW8Om2W97dAUSDvTgJr+R91xcAOkJx
MSSqScHONCXKYzP8Ri2kUDLWE0f1Rdag4Hgdoi8u07AZx0/ivHFeNHFNwSQ4
myDnkGgpuVQyzCNbwnklPYiMpid1W/O6MAuGvHFqHZGBLQngUKf+FvZFc8D4
lbk8rkj28Mlxc3Mgp1AzHEPQaIRlbKGDc0bpkIW45Xcij7URUAshguVcDl+t
UXBDSlKLe1mS5dCEerwonInESaQa9kpzghvcypFAu7mDEnKX1UoqTu/mTTi3
rj/rb87YWE3VBWnJwoo3hL/ibEbjZ3JMVB+m+MNGEVrzcbmNewOuDYHy9nOY
RbrKgyHYtyQFPJ8GoxW0EjNTRDgbz+RnIcBtbYQGNGyQR3jauzTO7uMXNMg+
kbUIrY/rDe3kkmBDKpxPcGZfJ944GknRkdYMbw/UKcpwZo2GwKk1LgfxfGAn
MLTKF6QoDwa+WsiZPs6JhgeJ7m4JcCwVaFjP7rT5XE3TyPkGS8IiaxSMiNl5
rrPEPpA3Jq0ZUBhYQ7kORpYG1H+m9mRoT/SjXI67BAfUPNrTR0cb0+2ne8fp
3A47d1+2f/1SfLDdsMTJYSfUqqlanst5qdzr/nAoHMphJKco2ybfPsVjtdi1
cuyVxCOBGO7jR+0lQFwkGEGwzuCsq38dD7tRG+Pz2UmXxJQgG6FW1sUfCmQi
M8/yAUpI9TNhV65dS75RSk7K1Sj9PiI3KePrJ9KiNVHJLOM8mrtk3mLy4yo1
CEcscJ9nzJwn3eABwCW2VsEcsnGqDsOVpwEghZMF0lVCZhSooupcSBKqUDS9
JtU/Sy6fxUxIgypSS+xQ8k2geTImkZ0Zm/NHXHjRD2CC72Tn4fLq6ns9+kkj
MUGwcfxHs2/8kebYijAdJ9XKhwwTUAfTbcSqdbKwwT5IajD2kZnH4xEvUMK+
Q6nHp4eM/qB/Kth+I0yBIpy4uUSKztGv0+fH7ogw5MiNM/EEss3ag+hRx+CE
cgXoz34A39TieTEBcjo2sKA6s5K4oDF5j0CWzsvV/ENDi0DmyK3KG109HlKn
R68R4B4HSIdhua6sXql95nSprCwLNXEcC5rnizzUBeXY6mIyZ1cfOiCboYSK
+z141JPzX58+9VkhheJw/B91sInef7o58a0iDmbaFkxOT64uOK6IbjIik3lS
VPUAb12Iu2VpouHdfhy7pXHEbpONAuIAg/PtUmQ5UelTwMj+gcIibu5DOxCx
SpP++kAubwQKEzHUGxhzgyphEDVGMRK+ddji/5P1+i9YrNOtEaaZPR3Ypyd2
eNK6S+JeD6FeKiSUIzl5w1MGaTDYDqGgAVvut7RU2GnpxG6xluapn0Zfu1HP
XQvPih+kvtWrwteoCYNfMkE6OKkil4KLppBIhyNFhCC2KJnhM8aONFJiYMLR
Ei3FYQaTPDdBuolE3Hm3NRfEJxv5oE44uGETvdLe23MxL3x5TJ5vWDMmIGB5
cJbTVYcYC5EpHSPSanOQbSpC17edwBMpeN0qwEH0zdd8LJbXe/AyzKOJzoX1
s++uWXJB31slDSyVHPcRf2pj3Rq1GWfLUFNid/ezUMPOBWToJUSbdhAy01ur
pUEO+Fg2kt1aIptPN02UHhu/08jttj+OBW0Nnli0QWKitMSgKGWwbfnGIvhg
wDYAIcWwkyxbg/gDBjNiQrhaXcpc41Wct5bOP/YvN2/fMI9zIyva2ryRm1c9
/NpLz8rgCxgW7lHFgWgCZOqORlZEfcOOBQTPralUSxWdi+64BCNZ4WtFQquh
QzxkGdQ9s0xiTBpXel/BMSsp7zNFW1K3gdILy5ZrVRV81tLOUF5QNIH0Hfgn
KbtT0wFg8JK7VahPx86f96vFsgElYhCIJzg8NMbJ/cZpjQIu/pKeBtcc/to+
VsepAT8oBxoFmFUew5qJ/YJsqRnihMebRWCuYFVJPNoTtRYAvV+0O1yhyCI5
sd4caWkduuajT17Or6o7mdQcoqwYHjmy04+XzOpBPg6PygPWGPGBj7NnHC29
w9mrInVbYeNCobL04ZnPmx8Z1Emi9zVy+xy13loVZx/aS1L1T4zINQGCZ5R4
edVaoBqacAS+SRDnsRxWoi816sVZJINzk+04dbFFEYwTC3anSc5UvQdkKeIc
UYpguf6aQzNVDtwe8umZvamr1RhleRN7syZ2+tXecIMp27m5ucERe+1LRS6B
0YTiyLUOcW4eu9ybPTSyj6GmoLlZDmNg+qRj6APpI5Suki497CclWjChbqIZ
GcHktPlVSXCRVd/FzRtSu1fXP9rOlVSsrXJ/R2qmKT9dcbkDF/MWlhd4+zVt
+20rdynjuqyCNvVojSO4i3WBnJ7QuCeNIN1htJghLRFSb2hF9p8Wy1UJoNG2
blpwBAgluCRGvAbzEmuQSrXNuesTiACd269J4G/lGEArMZYZWVWSS4/pS0aA
SxyGKrR0kHOFcr30FgsFTEiMSraLfI98lmmRaTjJj0lxZgRUUKjL0B8pJvI9
kuIRrEwhlFS81eUkk3LLMOffwfacriPB0Ux/S0MEXIAn6WzVTusJuqT/ADZh
zquR9W5N/jAm2WhpCdeLmkRe5/ZrxHhun8h/wbO3TLVWmjFhhqRGkEvduJsO
ExP8rGqNa7HjQvdrxsCcpDUgw+wakk4j/HvRPpWRGHWcWsl4y3TqXYnbT4Je
J0rtq10J025VGk2kJlhb0NnQlc7UkXCAfzDp/UaC6ZHkMpac2JNWB3yqIujV
WBnjfkXViuglzJ61mWGNGx7UbTdfk7jo/m55AC2vioCOxTpLaika0LgWluqC
SwQTVV/wEZ2M1Wc4CRbUqg8Z8zhGXtCac6njiFXYhZFqRbRSlFnTT7MqWyyk
plBaSnop+JACCe1k4zK/DjXGms1dOFib3C/Ed5RKWzFs4MM3ARy/zpZeqtGK
0BtO6q8Y1MmEWGkryFNE2DXcqIlr/QugMtotZA5Y6JrNSc/O73CMyUCXIz7p
2G5LR+Q+kEEOenxgl+/p+FYDi2E4bH82OOKI1HuNp0hxJUijMZqyCq5X5FE+
wCVhCW7ipGUboUAQUle5xKSmjoVCISaAjgvihRoyI2XG3aZrG7TObsF/5Lzz
qEGLaaxpO/wf9LGafMQCvNS5KWQI7Pghl/48q0LPl9ZrKXGJ9QXsF5h9Bwu6
GlfmHD/OXaZ9iNoQ6dGD3Cii++HVNqj6fBFkoPZEk7T0ESNJD59W/51QOy2n
XWMFuOolPn6IMkTEkjjnrWWJAe2G26VtD9fF71nN1q2NDdMy20fW0ym1vgLK
OenzMteSwqhbmxXH8bFw+mLGLadigMRst5bSsz1iY5wWLu81H12JyZrRmpc1
Y2Uc5sPVHMR9ECi6GKX9ryQrxmeO1V0Os0IashXXXc13tb5CfL2np3t57xKk
/ogDwIkOdmHz2kYjnCA1eO3N1jRFu77RAgw4m3r3rjjjRvshoGKp5COc4wC/
SZDLUEezDboJDkppGZrTSKGYnvOJYGVzOVIJXLl4kJe1ymN1wF7gCdtwaRPk
0cHDZJv1wQ3wK7mBQaKBiHeCrx0caHqu0Qa10kyP9GGPZyWKZyFHRWO5eKVF
qk65okmiN2lJbnbTKEnEYeZ50jtLR5auhHrUYB/M4I1MTF5wcGRaXFSj/TZN
q+w4RFnDrHG7lwOUleOTyJuuuLQIFaFheZGsDK7VSavjn/C2eozZ0v6TW9u3
upnG8HEfCbD9Llc26nDE6AsIn9nXI1HOLIQuZPva7/FRuc2WNOw1cVvIJQtv
e1kI/fb4wD4BrXwcT/pFFtUKg/0Lwrg0bd/uT7rn2B6qW1F39PH8lxX9yeVe
bdOCK841kjyf9gg4ANJiJuGw3jSiDBNjMO0oe+X0zAaHZ7dUTjzq3GyFZGcg
xeyWI8pDvoA+ipWA9LeJ7Q3a1EqaHezt4caHApvarEA2mS8XPGotkSuk3iLT
phJlkSSPMAEdxafZDh6rG0onRQYk8s09eViR8LF36CBSE11FcinpQ9cmPcPG
B5gU/kjoC5LBMIJkJs5/r4svgHGD32I1X2q7uk2DPe4CIq792LGx1sV96ZPc
kX4d6tpEYnSaWTWTVj/6me6F3S44BF23f2iksRvCtdx7g9mvZv6XsXk7QHuu
lkQHAP0Zo4c7ouWUgABn3nBBs7x46aac80YRSXsaneO7tmVOiRmHqbNZuqos
pP8wK/MqORbq2BpwTaEWTYpl5A0VFKAh1gBWQyzTcO1yF6F+CeGxAdgubgKF
/Fjb2MleaqVIYWIZWno1Gi6ll3fj9Upb8uSZ4vpJJnLY3eCovApdahEdRyLL
dpJe1ClHcHrE1LHfg+yg0q8bcqbJ8DpwnFe41ERj9/mL++Yt4NKObopMyDRi
3bCUWLfGAJrYl1UOqoWz56scNf2/x9owSsmC1mGoKxll0XDcsHvOP0d+UgvA
cd/0HMwP0ifzkQ5MBv2K9UhP4kNtnlfsmlYaKNOa71WVzQT/ajSgiU2n+YsW
2mwf23/cDW1OO5lkcrvqGfVoVKvnQeNVx5RT0qN0L/a/vLoG7E/XGxGbLrMO
nS73GBChQ9dkvhXnlXcSyFsGOp99vcHHj3wlIrjsCMYDR199/j0FX9lOfEuB
NOsMY/XNq9pbaaEmuErjUmbHQfpWSbs2/fxMW+AQT2PGN61wkEybQYLnOm9W
b6Uc/o+GU3yMpk2BHLQKr/rYe8IlVGLT7r1ocnes/7U1WLu/rCZ+5/PArve5
z+tw6iAJ/mvTGe4dBl+mKI22YdbQIqbfb3NMc8ziMf5gtmLTTfA6OXQsen/r
+HaQRcXv6wSOTHJ+xJ1pipK4Y5pk4CLtdgaxuScjBxy77VwvZhf4fatngoqA
xD4Z8UocUKOaW1Ish9h9JJgcRNqzmUIdOUhcNtBHEzP6cgOOYbdwyp4WzBGa
7NFt9vcwGHfs2OpWwKdiJRWeqrjGNnOPgtbTmTO0AqGZAYf5JbCZNA0NEr9x
ojTCp+SRGzuk3XwLhj9o8yFCGzon+taxjXY366BIJxwFLJyirfbyuPvyo6/u
IM37RjHfj05f2sFYgpXVxy+q8GU4jykppZaMfvzYa95hw01VwvQZ5LrqPoOP
HUjbmkvj7tZ3FaJjkmZoOYccJUn0ug/N0bi9SctqJfzcJG2TUjHxYVQxyEtE
mvJsE9B/WrD0mXKlzYebtBXq3//9Pzk9Gu8RBRs7gQe0DQAewVrS7jgp7d4o
NNms7cq1CXPI/GrVN0Rqq+q+XffeHC6Kh0YxzXahIJfCcs5qLYEjKTRei4Ov
JwHnHBNIj0Hurtx7AeeBqCKRoJQ2j96N1LtUhXKiEyO8yd6E7+RVAMtlCPMp
hckqutq+uXijqc40Ycic/Khq40hwqCIHGKYpm7QHTqsbQ4hg4gIpuGTU2qpY
agSPpS3YsVjVlYLXDeJJ2UK6OhO7Gkht+UZHhKzmNxaJl7CpdGM6RHxPiXMV
3HqNT5kr/VipaHV+qL75S3af6cu6Pn7UF4QxoJBayORnuJ18KFz6O4UeWNvL
FQGQo10Leox0dOLKYWXfWExYc0m2vh5M3sijBniej3CAR5YkWIJtHUcrcIpx
NOeEdSziSsUPyOB9jlMuDdRFYyy27Ch3DFoYb06U3d+hCpGhXiyZfWOj1Rio
XQaUv9XMLKnTkdZqotabmfwOKLwxkdC8v9Eqki7U1h274c5X6dkQne5XWy/N
0LcC9JleWBj35gxBpKvrDeugilJORnKbRTBneElSaOu0w6ygLRTvOzhiC9Xu
bBUtnbYkCb0KLx6YuTqetoEC4/cRJS+2MI80zrMdvJwl9tq/a/VVxEhSJ7XT
Ha9j5fNtTw8dnp3okUSy2b1wEvHsWL687Q1wyjk9uHnNtNpBHB86HE44V1mE
g0HTFaN4cC4IRJhC2uIENdkquwzFp3Qtw8fYhFqX15EcAXpm7abOocZLg0vR
nCKIwFqfm0Sem3MvUGWbVYtGWsBvKr87gnwPfOAgqLGwH9+++6vtHEznK8/9
gnFG5uDQaDexqwv8iBYAIIJYCbkCoQG8IjXXF2F5F7B60e4FRbTjcnA917PL
5oeGD5LLaV6jlfoKJkTLpeCRz69qqnZveTt2J7xWBMYX5NlnrzTw3Zd+0Pjq
8ZdC8SmyfUxPk+ISRnOpjXTbDkfTjEkR3d6BECJpJ761FelnJte8RKtIzZgv
56ta8+titrwajdBzk3W9BvOT1u1uAxjynDTJnd7S1fLMZgKErE2s1Uxc0tZG
Z2OoVpp8WsTZaKszvKPrMr5yQnx2fgytY+8buhoaQGtx5UdwHuTmphUe6XYJ
PJU2tG1oSgT0pUjv7yTDqKfNc44uTDNwZ9ODcGflRmdwqGTpms7wkA0r17DW
ZU8Sji2nRoBs5/hQFGCMNG3DrQb7N+cP0914hKsaCgDXhefnoTlN4CPpMDiV
3sGNYsP7djgaRj/3mE5GAHtD17SpUozo5NwBy7Vt0dnO97QYbq/BKdtQzC7S
nt442GYLIaiUjxzusnFIOI3uEXmer7WtRMBVXhAcHswLkcaRrfTOjuhdzgGe
CZ96jx3McUNUe8l599A4PDwj8ICpt3odh7NDciaMDUXjTH4STltkeZF0iEb2
MWYc9RAjLylk7MSRUZui3pqJ1vU0GNKvB7fMhLebP5CF5YMVXPsnjQ1DUB7X
z112r14rOydsxjfUs7Sr4OCZeOLZ3MXyY6U/ckOhFjcvwivwOgerIiPJmqGt
+wEiDgdsDA4OA0XhwCjBm1PKZXPmbcMhaluKkGuS7uRsYGN+KRbDiMrWcqSY
7JOKlNgVdrOy5G0RYxCSMIo9/h/pycRLR4MLHrNrUOCV9vn6XBtVjnw0QgzK
Jq93VB5pnQ+6KNabrT+l1iLWYW4Z7hRjp3ogphw4ZL4TK0NBhP7IWdKuUzuG
Gm1zrC1D8fYcFnMEaPcQmtFJfCdDfLnaxutRBH2znce7uLc2q/1eMGmkLVfq
kQGc/MELW6EEORExxnlS8jj4zTKe4Ke45G7yjwfcif/g0+aoXLpa1tjBJg+p
mNO+L+dT+3r8RixjMTGXdxXRrlxiWRfzuSt21Ra2I0hcdhQpQBcMj4bHZq9v
xtALR2S12G6jc7sUN3stzVBG8D19AD+Mddj77/gl8+JLohVe9OBQkwj9hJZO
crheyuMkhYT3RGgJoUF/eklsy7uOGSgAaWpljwiRpk6rnIYqq1Df6F36SOwT
99Ky35cEkd7jHTDndtdrA9BR6/8B9R+h3W+AAAA=

-->

</rfc>
