<?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-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.5 -->
  <front>
    <title abbrev="Deterministic Encoding">CBOR: On Deterministic Encoding</title>
    <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-01"/>
    <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="August" day="09"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <abstract>
      <?line 85?>

<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 95?>

<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="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 fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="23" month="July" year="2023"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2.  The present document provides the application
   profile "dCBOR" that can be used with Deterministic Encoding.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-dcbor-00"/>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>Gordian 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>
            <date day="8" month="August" year="2023"/>
            <abstract>
              <t>   CBOR (RFC 8949) defines "Deterministically Encoded CBOR" in its
   Section 4.2.  The present document provides the application profile
   "dCBOR" that can be used to help achieve interoperable deterministic
   encoding.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/BlockchainCommons/WIPs-IETF-draft-deterministic-
   cbor.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-05"/>
        </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 746?>

<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:
H4sIAAAAAAAAA8V93XIbx5LmfT1FDXVh0AYgAqQoifb4DEVJPjxjSV5RDsec
idlhAyiAbTW64a4GaVqhE3OzFxt7uw+wF/sku29ynmTzy8yqrsYP7ZibnTgj
k0B3/WTlz5c/lRwMBub2zB4b0+RN4c7swcWLd+/P7LvSvnSNq5d5mfsmn9pX
5bSa5eXiwGSTSe3onYN9D8yqaZktaaxZnc2bwaSql1lZDqb0w2DmmkGRNc43
xkzpv4uqvj+zeTmvjF9Plrn3eVU29yt6+/LVh9fWPrJZ4SuaLS9nbuXon7I5
6NuDy/MX9J+qpp/ef3hNk9JgZ2Zald6Vfu3PbFOvnclql9G756tVkdN0NLa3
WTmz711WDD7kS3dg7qr646Ku1qszi62bj+6ePpqdGXPryjWNaa1+fXBRldPc
O/siL7P63r6b/OymDY21qh3N2vD49k2Wl40rs3LqeKpXv9JvnmfuYYLDAxpx
meUFDQiS/FPumvmwqhf4fJE3N+sJvskm1WMi1oEx2bq5qWqsY0D/b4lYtLuL
oX0hdOXPhN4XWe1pss43NPCZ/bHMb13t8+b//u/Gvqjdkh768NdLfsA3tXPN
mf2h8s08m97Y4+Ojk5Mj/m6aN3Q68oJ8UM1onpeD8bPjJ8/1k3XZ4Ay/c5j0
nj9c3VQlPffVyfPByXg0GI+eDU6Pn49H/KWTzWOH/9T8lmPrxpgSa25omdjo
1YeXz0/O+OkBPUlU4p//8cy+f33x7PkJpr48f3s+ZJ5qsgXOm/41j9LPfb5c
FW5wmxVrRw/Ir/QmxjgdHdHAs1lhDJivO/fpcZx73cyfJXMfn46f6/qO4jM/
+6pM1zdm0tBPT0+eHxNz6/d4/fj4OV67HLwc4tgH3oFvB/inIW4cODDLzM1o
tfwNnn316tXTJ0qNJqsXOKybpln5s8ePc+fcr6uiqt0QP4KWj0n81nRezeNn
T09Px2M5JpVuDGavGuLLrJ5Z2rd9XVS09XIx+KEivrXnNXHgkhYz5dda3qOd
Ci9hCP6dJc7OSTydMJKrc+dBTXnehtloN7SBwfho9Fy/ePnu8syOjoaj0dHz
x3iKCDrE98N2za8u3pyPT8e79313dzd002U2gKzVJUteVvD2V+tJlPXHXrfq
H7/C0zTe8KZZphTBNFfTOl81dnw0PrLfZ+VinS2cvVq5aT7XkfYRA6Pay3QN
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
ZnFmdzVAR0um/we6DeDXhnsAAA==

-->

</rfc>
