<?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.6.39 (Ruby 3.2.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bormann-cbor-det-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="Deterministic Encoding">CBOR: On Deterministic Encoding</title>
    <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-00"/>
    <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="2023" month="July" day="23"/>
    <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.</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/cabo/det"/>.</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="STD94" section="4.1" sectionFormat="bare">Preferred Serialization</xref> of <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="STD94" section="4.2" sectionFormat="bare">Deterministically Encoded CBOR</xref> of <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 anyway.</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 (<xref section="3" sectionFormat="of" target="STD63"/>), which is always treating as
"invalid" any encoding variants that are longer than necessary.)</t>
      <t>Deterministic Encoding is defined in <xref section="4.2" sectionFormat="of" target="STD94"/> (note
that <xref section="4.2.3" sectionFormat="of" 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 Deterministic Encoding is convenient.</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="STD94" section="4.1" sectionFormat="bare"/> and <xref target="STD94" section="4.2" sectionFormat="bare"/> of <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 <xref section="4.1" sectionFormat="of" 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 <xref section="3.4.3" sectionFormat="of" 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 <xref section="2.1" sectionFormat="of" target="STD94"/>).</t>
          </dd>
        </dl>
        <t>CBOR data items at the data model level are represented in the CBOR
diagnostic notation (<xref section="8" sectionFormat="of" 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>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.</li>
              <li>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.</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 (deterministic representation) 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>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 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, whether that is efficiently
implemented during decoding or less efficiently by comparing
re-encoding.</t>
      </section>
      <section anchor="application-requirements-and-tags">
        <name>Application Requirements and Tags</name>
        <t>The definition of Deterministic Encoding can become more complicated
with the addition of Tags (<xref section="3.4" sectionFormat="of" 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 Mail 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 <xref section="3.4.3" sectionFormat="of" 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 <xref section="3.4.3" sectionFormat="of" 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).
 <xref section="3.4.4" sectionFormat="of" 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 a 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>a flag for the encoder to produce Deterministic Encoding</li>
          <li>a flag for the decoder to check for Deterministic Encoding (optional)</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 <xref section="4.2.1" sectionFormat="of" target="STD94"/>.</t>
        <t>This map is ordered by the byte-wise lexicographic ordering of the
deterministically encoded map keys.
<xref section="4.2.1" sectionFormat="of" 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>the key's major type</li>
          <li>the numeric value of the argument of the key</li>
          <li>
            <t>any content of the key data item, such as
            </t>
            <ul spacing="normal">
              <li>the string value in a byte or text string key</li>
              <li>the elements of an array key, in order</li>
              <li>the key/value pairs of a map-shaped key, deterministically ordered</li>
              <li>the tag content of a tagged key</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>
      <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 <xref section="4.2.3" sectionFormat="of" target="STD94"/>.
(The actual
structure of CTAP2 limits its use to cases where that is compatible
with standard Deterministic Encoding; 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.
However, applications can also 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>the use of generic encoders with standard Deterministic Encoding
rule implementations after some application processing, or</li>
        <li>the use of specialized encoders which combine encoding with the
implementation of the application transformations.</li>
      </ul>
      <t>This section describes some of the considerations that led to one such
application profile for Deterministic Encoding.</t>
      <section anchor="reduction">
        <name>Numeric Reduction in dCBOR</name>
        <t>The dCBOR specification (originally in <xref target="I-D.mcnally-deterministic-cbor"/>, with a condensed form
proposed in <xref target="I-D.bormann-cbor-dcbor"/>) 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>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;</li>
          <li>all other numbers are represented as floating point
values (and all NaN values are mapped to a single quiet NAN).</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
general numeric type.)</t>
        <t>The original specification <xref target="I-D.mcnally-deterministic-cbor"/> restated much of <xref section="4.2" sectionFormat="of" target="STD94"/> and
added a rule that doesn't allow 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>
        <t>It 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>
        <t>A streamlined specification of the dCBOR numeric-reduction based
application profile is proposed in <xref target="I-D.bormann-cbor-dcbor"/>.</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="STD94" section="6.2" sectionFormat="bare">Converting from JSON to CBOR</xref> of <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 <xref section="6.2" sectionFormat="of" target="STD94"/>
(the full generality of Section <xref target="STD94" section="6.1" sectionFormat="bare">Converting from CBOR to JSON</xref> of <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>TODO further Security Considerations</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>
        <name>Normative References</name>
        <reference anchor="STD94">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="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>
        <name>Informative References</name>
        <reference anchor="STD63">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values. This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="STD90">
          <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>
        <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="14" month="July" 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 (-09) addresses comments received during IETF last
   // call.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-sedate-datetime-extended-09"/>
        </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>Application-Oriented Literals in CBOR Extended Diagnostic Notation</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="23" month="July" year="2023"/>
            <abstract>
              <t>   The Concise Binary Object Representation, CBOR (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 Constrained
   Resource Identifiers (draft-ietf-core-href).

   To facilitate tool interoperation, this document also 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-02"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-dcbor">
          <front>
            <title>dCBOR – an Application Profile for Use with CBOR Deterministic Encoding</title>
            <author initials="C." surname="Bormann" fullname="Carsten Bormann">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>Gordian dCBOR: Deterministic CBOR Implementation Practices</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>
            <date day="4" month="May" year="2023"/>
            <abstract>
              <t>   CBOR has many advantages over other data serialization formats.  One
   of its strengths is specifications and guidelines for serializing
   data deterministically, such that multiple agents serializing the
   same data automatically achieve consensus on the exact byte-level
   form of that serialized data.  Nonetheless, determinism is an opt-in
   feature of the specification, and most existing CBOR codecs put the
   primary burden of correct deterministic serialization and validation
   of deterministic encoding during deserialization on the engineer.
   This document specifies a set of norms and practices for CBOR codec
   implementors intended to support deterministic CBOR ("dCBOR") at the
   codec API level.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-01"/>
        </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="10" month="July" year="2023"/>
            <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-05"/>
        </reference>
      </references>
    </references>
    <?line 749?>

<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:
H4sIAAAAAAAAA8V93XIbR5bmfT5FDnVh0AYgAqQoifa4hyIlN3stySvK4Zie
mBkWgAJYVqEKriyQghXq6Ju92NjL3QeYi3mSnTfpJ5nznXMyK6sA0I65mYke
mQSq8ufk+fnOTx4OBgNzd2aPjamzOk/P7MHFi7fvzuzbwl6mdVotsyJzdTa1
L4tpOcuKxYFJJpMqpXcO9j0wK6dFsqSxZlUyrweTslomRTGY0g+DWVoP8qRO
XW3MlP67KKvNmc2KeWncerLMnMvKot6s6O2rl+9fWfvIJrkrabasmKWrlP4p
6oO+Pbg6f0H/KSv66d37VzQpDXZmpmXh0sKt3Zmtq3VqkipN6N3z1SrPaDoa
29mkmNl3aZIP3mfL9MDcl9WHRVWuV2cWWzcf0g19NDsz5i4t1jSmtfr1wUVZ
TDOX2hdZkVQb+3byczqtaaxVldKsNY9vXydZUadFUkxTnurlR/rN8cw9THB4
QCMukyynAUGSf8jSej4sqwU+X2T17XqCb5JJ+ZiIdWBMsq5vywrrGND/WyIW
7e5iaF8IXfkzofdFUjmarPUNDXxmfyyyu7RyWf0f/17bF1W6pIfe//mKH3B1
lab1mf2hdPU8md7a4+Ojk5Mj/m6a1XQ68oJ8UM5onsvB+Nnxk+f6ybqocYbf
pZh0wx+ubsuCnvvq5PngZDwajEfPBqfHz8cj/jKVzWOH/1D/mmHrxpgCa65p
mdjo9fvL5ydn/PSAniQq8c9/f2bfvbp49vwEU1+dvzkfMk/VyQLnTf+aR/Hn
Lluu8nRwl+TrlB6QX+lNjHE6OqKBZ7PcGDBfe+7T4zD3up4/i+Y+Ph0/1/Ud
hWd+dmURr2/MpKGfnp48Pybm1u/x+vHxc7x2Nbgc4tgHLgXfDvBPTdw4SMEs
s3RGq+Vv8OzLly+fPlFq1Em1wGHd1vXKnT1+nKVp+nGVl1U6xI+g5WMSvzWd
V/342dPT0/FYjkmlG4PZ65r4MqlmlvZtX+Ulbb1YDH4oiW/teUUcuKTFTPm1
hvdop8JLGIJ/Z4mzcxLPVBgprbLUgZryvPWz0W5oA4Px0ei5fnH59urMjo6G
o9HR88d4igg6xPfDZs0vL16fj0/Hu/d9f38/TKfLZABZqwqWvCTn7a/WkyDr
j51u1T1+iadpvOFtvYwpgmmup1W2qu34aHxkv0+KxTpZpPZ6lU6zuY60jxgY
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

-->

</rfc>
