<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-thomson-httpbis-chic-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="CHIC">Chained Hash Integrity Coding for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-thomson-httpbis-chic-01"/>
    <author fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <date year="2026" month="November" day="01"/>
    <area>ART</area>
    <workgroup>HTTP</workgroup>
    <keyword>blockchain</keyword>
    <abstract>
      <?line 40?>

<t>This document defines a content coding for HTTP that provides strong integrity protection
while maintaining the ability to perform some progressive processing.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://martinthomson.github.io/chic/draft-thomson-httpbis-chic.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-thomson-httpbis-chic/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/martinthomson/chic"/>.</t>
    </note>
  </front>
  <middle>
    <?line 46?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Hash-based integrity is a powerful tool for ensuring that content matches expectations.
Hashes are often the basis of digital signature schemes
that can authenticate content,
or at least provide verifiable proof of authorization.</t>
      <t>The main challenge with hashes is that validating integrity
requires every byte in the sequence.
This document describes a method of hash generation
that can be verified incrementally.
This enables systems that depend on progressive processing,
such as streaming processing of a long sequence of records,
or performance-sensitive applications like HTML rendering.</t>
      <t>The way this works is by splitting a document into chunks,
called chiclets.
Each chiclet comprises
a length,
some number of bytes of content, and
a hash for the next chiclet.
This is shown in <xref target="f-overview"/>.</t>
      <figure anchor="f-overview">
        <name>Overview of Format</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="496" viewBox="0 0 496 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,112 L 8,160" fill="none" stroke="black"/>
              <path d="M 56,128 L 56,160" fill="none" stroke="black"/>
              <path d="M 104,48 L 104,56" fill="none" stroke="black"/>
              <path d="M 160,128 L 160,160" fill="none" stroke="black"/>
              <path d="M 192,48 L 192,88" fill="none" stroke="black"/>
              <path d="M 192,104 L 192,120" fill="none" stroke="black"/>
              <path d="M 232,112 L 232,160" fill="none" stroke="black"/>
              <path d="M 280,128 L 280,160" fill="none" stroke="black"/>
              <path d="M 328,48 L 328,56" fill="none" stroke="black"/>
              <path d="M 384,128 L 384,160" fill="none" stroke="black"/>
              <path d="M 416,48 L 416,88" fill="none" stroke="black"/>
              <path d="M 416,104 L 416,120" fill="none" stroke="black"/>
              <path d="M 456,112 L 456,160" fill="none" stroke="black"/>
              <path d="M 64,32 L 88,32" fill="none" stroke="black"/>
              <path d="M 208,32 L 312,32" fill="none" stroke="black"/>
              <path d="M 432,32 L 456,32" fill="none" stroke="black"/>
              <path d="M 24,96 L 88,96" fill="none" stroke="black"/>
              <path d="M 120,96 L 216,96" fill="none" stroke="black"/>
              <path d="M 248,96 L 312,96" fill="none" stroke="black"/>
              <path d="M 344,96 L 440,96" fill="none" stroke="black"/>
              <path d="M 8,128 L 92,128" fill="none" stroke="black"/>
              <path d="M 92,128 Q 94,124.8 96,128 Q 98,131.2 100,128 Q 102,124.8 104,128 Q 106,131.2 108,128 Q 110,124.8 112,128 Q 114,131.2 116,128 Q 118,124.8 120,128 Q 122,131.2 124,128 " fill="none" stroke="black"/>
              <path d="M 124,128 L 316,128" fill="none" stroke="black"/>
              <path d="M 316,128 Q 318,124.8 320,128 Q 322,131.2 324,128 Q 326,124.8 328,128 Q 330,131.2 332,128 Q 334,124.8 336,128 Q 338,131.2 340,128 Q 342,124.8 344,128 Q 346,131.2 348,128 " fill="none" stroke="black"/>
              <path d="M 348,128 L 456,128" fill="none" stroke="black"/>
              <path d="M 8,160 L 92,160" fill="none" stroke="black"/>
              <path d="M 92,160 Q 94,156.8 96,160 Q 98,163.2 100,160 Q 102,156.8 104,160 Q 106,163.2 108,160 Q 110,156.8 112,160 Q 114,163.2 116,160 Q 118,156.8 120,160 Q 122,163.2 124,160 " fill="none" stroke="black"/>
              <path d="M 124,160 L 316,160" fill="none" stroke="black"/>
              <path d="M 316,160 Q 318,156.8 320,160 Q 322,163.2 324,160 Q 326,156.8 328,160 Q 330,163.2 332,160 Q 334,156.8 336,160 Q 338,163.2 340,160 Q 342,156.8 344,160 Q 346,163.2 348,160 " fill="none" stroke="black"/>
              <path d="M 348,160 L 456,160" fill="none" stroke="black"/>
              <path d="M 8,192 L 24,192" fill="none" stroke="black"/>
              <path d="M 464,192 L 480,192" fill="none" stroke="black"/>
              <path d="M 108,72 L 120,96" fill="none" stroke="black"/>
              <path d="M 332,72 L 344,96" fill="none" stroke="black"/>
              <path d="M 88,96 L 100,72" fill="none" stroke="black"/>
              <path d="M 312,96 L 324,72" fill="none" stroke="black"/>
              <path d="M 88,32 C 96.83064,32 104,39.16936 104,48" fill="none" stroke="black"/>
              <path d="M 208,32 C 199.16936,32 192,39.16936 192,48" fill="none" stroke="black"/>
              <path d="M 312,32 C 320.83064,32 328,39.16936 328,48" fill="none" stroke="black"/>
              <path d="M 432,32 C 423.16936,32 416,39.16936 416,48" fill="none" stroke="black"/>
              <path d="M 24,96 C 15.16936,96 8,103.16936 8,112" fill="none" stroke="black"/>
              <path d="M 216,96 C 224.83064,96 232,103.16936 232,112" fill="none" stroke="black"/>
              <path d="M 248,96 C 239.16936,96 232,103.16936 232,112" fill="none" stroke="black"/>
              <path d="M 440,96 C 448.83064,96 456,103.16936 456,112" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="488,192 476,186.4 476,197.6" fill="black" transform="rotate(0,480,192)"/>
              <polygon class="arrowhead" points="424,120 412,114.4 412,125.6" fill="black" transform="rotate(90,416,120)"/>
              <path class="jump" d="M 416,104 C 422,104 422,88 416,88" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="200,120 188,114.4 188,125.6" fill="black" transform="rotate(90,192,120)"/>
              <path class="jump" d="M 192,104 C 198,104 198,88 192,88" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="72,32 60,26.4 60,37.6" fill="black" transform="rotate(180,64,32)"/>
              <polygon class="arrowhead" points="16,192 4,186.4 4,197.6" fill="black" transform="rotate(180,8,192)"/>
              <g class="text">
                <text x="480" y="36">...</text>
                <text x="104" y="68">H()</text>
                <text x="328" y="68">H()</text>
                <text x="32" y="148">Len</text>
                <text x="104" y="148">Content</text>
                <text x="196" y="148">Hash</text>
                <text x="256" y="148">Len</text>
                <text x="328" y="148">Content</text>
                <text x="420" y="148">Hash</text>
                <text x="480" y="148">...</text>
                <text x="56" y="196">First</text>
                <text x="100" y="196">byte</text>
                <text x="396" y="196">Last</text>
                <text x="436" y="196">byte</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
       <---.            .--------------.            .---- ...
            |          |                |          |
           H()         |               H()         |
           / \         |               / \         |
 .--------'   '--------)---. .--------'   '--------)---.
|                      v    |                      v    |
+-----+----~~~~----+--------+-----+----~~~~----+--------+
| Len |  Content   |  Hash  | Len |  Content   |  Hash  | ...
+-----+----~~~~----+--------+-----+----~~~~----+--------+

<-- First byte                                 Last byte -->
]]></artwork>
        </artset>
      </figure>
      <t>The hash of the entirety of the content
can thereby be represented by the hash of the first chiclet,
or chi digest.</t>
      <t>This enables progressive processing of content,
maintaining strong integrity for all content bytes,
provided that each chiclet is only released after being validated;
see <xref target="consumption"/>.
That can reduce latency -- or at least perceived latency --
for applications that are sensitive to delays
by allowing processing to start
before the entire sequence of bytes is received.</t>
      <t>The cost of this scheme is that there is a small amount of overhead.
Additional bytes for the hash and length fields
are interspersed with content bytes.
The relative cost of that overhead depends on the size of chiclets;
a 4 KiB chiclet size adds overhead of 0.83%,
whereas a 65535-byte chiclet adds overhead of 0.055%.
Larger chiclets reduce overhead, but add latency;
smaller chiclets can improve latency with higher overheads.</t>
      <t>Though it is possible to process data incrementally,
constructing this format
requires two passes over the entire sequence of bytes;
see <xref target="construction"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>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?>

<t>The term "chi digest" refers to the hash of the first chiclet
in the format defined in <xref target="format"/>.</t>
      <t>This document uses the varint encoding
and presentation language
developed for QUIC Sections <xref target="QUIC" section="16" sectionFormat="bare"/> and <xref target="QUIC" section="1.3" sectionFormat="bare"/> of <xref target="QUIC"/>.</t>
    </section>
    <section anchor="format">
      <name>Chained Hash Integrity Format</name>
      <t>Any continuous stream of bytes can be turned into
a stream of variable-length chiclets.
This format allows for progressive validation of the integrity of content.</t>
      <section anchor="format-definition">
        <name>Format Definition</name>
        <t>The format comprises zero or more non-final chiclets and a final chiclet.
Content bytes are therefore interspersed with framing and integrity bytes.</t>
        <t>A non-final chiclet comprises a non-zero length (for framing),
between 1 and 2<sup>61</sup>-41 bytes (inclusive) of content (see <xref target="length"/>),
and a 32-byte hash (that is, integrity bytes).</t>
        <t>Lengths are encoded using the variable-length integer format
from <xref section="16" sectionFormat="of" target="QUIC"/>.
Lengths do not need to be encoded in the minimal form;
the chosen encoding will affect the resulting digest.</t>
        <t>The hash is the output of the SHA-256 algorithm <xref target="SHA2"/>
that covers the entirety of the subsequent chiclet.</t>
        <t>The final chiclet includes a zero-valued length field,
up to 2<sup>61</sup>-2 bytes of content
(less if the length is encoded in more than one byte),
and no hash value.
The final chiclet ends when content ends,
which means that this format can only be used
where there is a distinct end to the protected content.
That might mean the end of a file,
the end of a stream, or
the end of an HTTP message; see <xref target="http"/>.</t>
        <t>The hash value that is computed from the very first chiclet --
the chi digest --
is not written to the output.
The chi digest commits to the entire sequence of chiclets
and the content that it protects.
A chi digest needs to be carried outside the content;
see <xref target="chi-digest"/> for one way to convey a chi digest.</t>
        <t>The format is illustrated in <xref target="f-layout"/>
using the notation from <xref section="1.3" sectionFormat="of" target="QUIC"/>.</t>
        <figure anchor="f-layout">
          <name>Chained Hash Integrity Format</name>
          <artwork><![CDATA[
Chained Hash Integrity Format {
  Chiclet (..) ...,
  Final Chiclet (..),
}

Chiclet {
  Length (i),
  Content (8..),
  Hash (256),
}

Final Chiclet {
  Length (i) = 0,
  Content (..),
}
]]></artwork>
        </figure>
        <t>The format uses SHA-256 for integrity <xref target="SHA2"/>;
see <xref target="hash"/> for details.</t>
      </section>
      <section anchor="consumption">
        <name>Consumption and Validation</name>
        <t>An entity that receives a stream of bytes in this format
can use the chi digest to validate the content.
That value might be provided via some alternative communication channel;
one method for carrying this hash value in HTTP fields
is defined in <xref target="chi-digest"/>.</t>
        <t>Without the chi digest,
it is not possible to validate the integrity of the content.
Content can still be processed by removing the length and hash bytes.</t>
        <t>The process for progressively validating and releasing content bytes
proceeds as follows,
starting with an expected hash value set to the chi digest:</t>
        <ol spacing="normal" type="1"><li>
            <t>Initialize a new instance of SHA-256 <xref target="SHA2"/>.</t>
          </li>
          <li>
            <t>Read a variable-length integer as a length.
Update the hash instance with each byte as it is read.
Abort with an error if the stream ends before reading a complete value.</t>
          </li>
          <li>
            <t>Read the indicated number of bytes from the stream.
If the length value is 0, read to the end of the stream instead.
Update the hash instance with each byte as it is read.
Abort with an error if the stream ends before reading this amount.</t>
          </li>
          <li>
            <t>If the length value is non-zero,
read 32 bytes from the stream
and assign those bytes to the next hash value.
Update the hash instance with each byte as it is read.
Abort with an error if the stream ends before reading this amount.</t>
          </li>
          <li>
            <t>Finalize the hash and generate hash output.
If the hash output is not identical to the expected hash value,
abort with an error.</t>
          </li>
          <li>
            <t>Release the content bytes.</t>
          </li>
          <li>
            <t>If the length value is non-zero,
set the expected hash value to the next hash value
and return to the start.
Otherwise, end the process successfully.</t>
          </li>
        </ol>
        <t>This process ensures that released bytes are all integrity-protected,
according to the value that was provided.</t>
        <t>The Chi-Digest field (<xref target="chi-digest"/>) provides only a single hash,
but other mechanisms could be defined,
such as a future extension to <xref target="SRI"/>.</t>
        <t>When hashes are obtained via means other than the Chi-Digest field,
there is a risk that chiclet layout has changed.
A different layout invalidates the hash,
so resources should not change the chiclet layout.</t>
        <t>To account for variations in how chiclets are constructed
(see <xref target="non-canon"/>),
content could be matched against one of a set of chi digests.
An entity can validate against a set of chi digests
by matching the hash of the first chiclet
against any value from the provided set.
Once the first chiclet is processed,
subsequent chiclets are validated against the single hash
that was included in that first chiclet.</t>
      </section>
      <section anchor="construction">
        <name>Construction</name>
        <t>In order to produce hashes,
content needs to be processed in reverse order.
Content is split into multiple pieces,
which are turned into chiclets.
These chiclets are hashed,
starting from the last,
placing the resulting hash
from each chiclet
at the end of the chiclet that immediately precedes it;
see <xref target="f-layout"/>.</t>
        <t>When constructing content,
if the content is processed in a forward direction,
chiclets might be written with placeholder values for each hash.
Hashes can then be added in reverse order once the final chiclet is hashed.</t>
        <t>The construction of chiclets can operate on fixed-sized pieces,
or application needs can drive how content is split.
For instance, an image that can be displayed
at progressively-higher levels of quality can have certain points at which
significant quality improvements can be realized.
Aligning chiclets to those points might enable better incremental processing.
Similarly, a video file might have chiclets aligned to frame boundaries
or significant features within frames.</t>
        <t>The need to produce the encoding in reverse order
makes this format ill-suited to situations
where content of arbitrary length is streamed.
It is also poorly suited to use with dynamically-generated content,
especially where content is latency sensitive,
because of the need for two processing passes.
It is therefore best suited to static resources
where the format can be pregenerated and saved.</t>
      </section>
      <section anchor="length">
        <name>Length Constraints</name>
        <t>An implementation that processes input needs to hold an entire chiclet
in its memory before validating and releasing it.
Implementations that accept untrusted inputs
might refuse to support large chiclets
to protect against memory exhaustion attacks.</t>
        <t>Receivers <bcp14>MUST</bcp14> support chiclets
with content lengths of up to 65535 bytes (2<sup>16</sup>-1).
The total size of chiclets will be larger as they also contain
a length field of up to 8 bytes
and non-final chiclets include a 32-byte hash.
Encoders <bcp14>MUST NOT</bcp14> generate larger chiclets
without knowing, by means outside of this specification,
that the receiver supports the size it uses.</t>
        <t>Receivers can support chiclets larger than the 65535-byte minimum.
A chiclet larger than the supported maximum results in a decode error.</t>
        <t>A receiver can validate that the length of a non-final chiclet
is acceptable before reading further.
In contrast, the final chiclet has a zero-valued length prefix,
so receivers need to either rely on other length indicators
(such as the HTTP Content-Length field)
or abort when received bytes exceed their configured maximum.</t>
        <t>The absolute maximum length of a chiclet is determined by the length encoding in SHA-2,
which is expressed in bits as a 64-bit value.
Consequently, the maximum length is 2<sup>61</sup>-1 bytes,
less overheads of 40 bytes for a non-final chiclet
and up to 8 bytes for a final chiclet (though this can be a single byte).
This is less than the 2<sup>62</sup>-1 length that could otherwise
be expressed in a QUIC variable-length integer.
Of course, there is little value in having such large chiclets,
which directly act against the goal of incremental processing.</t>
        <t>An abusive implementation might also seek to generate wasteful work
for recipients
by constructing many small chiclets.
While small chiclets might be necessary for some applications,
very small lengths can add significant amounts of overhead.
Recipients therefore need to look for abusive patterns,
such as receiving a large number of chiclets below a given threshold,
rather than have a strict lower bound on chiclet length.</t>
      </section>
    </section>
    <section anchor="http">
      <name>HTTP Usage</name>
      <t>The use of progressive validation
is well-suited to HTTP applications <xref target="HTTP"/> that rely
on the streaming and incremental processing of message content.</t>
      <t>A content coding is defined to enable progressive decoding
while maintaining integrity;
see <xref target="coding"/>.
A header field is defined to carry a chi digest;
see <xref target="chi-digest"/>.</t>
      <section anchor="coding">
        <name>Content Coding</name>
        <t>The <tt>chi</tt> content coding indicates that the representation
is encoded as a sequence of chiclets,
following the construction defined in <xref target="format"/>.
Encoding follows the guidance in <xref target="construction"/>;
decoding follows the procedure in <xref target="consumption"/>.</t>
        <t>A decoder can read a message that uses <tt>chi</tt> content coding
without a target digest,
though that provides no integrity guarantee.</t>
        <t>A client can indicate that it will accept <tt>chi</tt> content coding
in responses using the Accept-Encoding field.
A client can attempt to use <tt>chi</tt> content coding on requests,
which could result in an error response that carries Accept-Encoding
if it is not understood by the server;
see <xref section="12.5.3" sectionFormat="of" target="HTTP"/> for details.</t>
        <t>Intermediaries can check, add, or remove <tt>chi</tt> content coding
at their discretion.
Adding the coding requires buffering of much of the message
before the hash for any non-final chiclet can be sent;
see <xref target="construction"/>.
Intermediaries <bcp14>MUST</bcp14> update any Chi-Digest field
when adding or removing <tt>chi</tt> codings; see <xref target="chi-digest"/>.</t>
        <t>Like other content codings,
the <tt>chi</tt> content coding applies to the entirety of a representation,
so it is less useful in combination with range requests
(<xref section="14" sectionFormat="of" target="HTTP"/>).
A client could still benefit from the use of the coding
for a series of range requests if they are contiguous
with the first byte of the representation.</t>
        <t>Compression content coding, such as <tt>gzip</tt> or <tt>br</tt>,
can be applied in combination with <tt>chi</tt> in any order.
Applying integrity after compression
ensures that invalid content does not need to be decompressed;
whereas applying integrity before compression
allows compression to be negotiated
without needing fresh integrity values.</t>
      </section>
      <section anchor="chi-digest">
        <name>Chi-Digest Field</name>
        <t>The Chi-Digest field is a <tt>sf-list</tt> header field;
see <xref section="3.1" sectionFormat="of" target="FIELDS"/>.
Each list item is a byte sequence;
see <xref section="3.3.5" sectionFormat="of" target="FIELDS"/>.</t>
        <t>This field carries only <tt>chi</tt> digests,
each value being 32 bytes.
Values with other types or lengths <bcp14>MUST</bcp14> be treated as errors,
causing the entire field value to be ignored,
as recommended by <xref section="2.2" sectionFormat="of" target="FIELDS"/>.
No semantics are defined for parameters,
which <bcp14>MUST</bcp14> be ignored on receipt,
as recommended by <xref section="2.3" sectionFormat="of" target="FIELDS"/>.</t>
        <t>Each digest in the Chi-Digest field corresponds to a <tt>chi</tt> content coding
in the order that they are applied
(this follows the same rule as content codings; see <xref section="8.4" sectionFormat="of" target="HTTP"/>).
That means that a recipient uses the last Chi-Digest value
when removing the outermost <tt>chi</tt> coding.</t>
        <t>Use of the Chi-Digest field is not mandatory
when using the <tt>chi</tt> content coding.
However, if the Chi-Digest field is present
when adding an additional <tt>chi</tt> content coding,
the field <bcp14>MUST</bcp14> either be removed or have a value added.
This prevents existing values from being invalidated.
An intermediary that removes a <tt>chi</tt> coding
<bcp14>MUST</bcp14> remove the last Chi-Digest value if the field is present.</t>
        <t>This field offers no means of negotiating different hash algorithms;
see <xref target="hash"/>.</t>
        <t>The Chi-Digest field can be carried in a trailer field,
but this is strictly worse than a Repr-Digest field
with a <tt>sha-256</tt> digest,
as defined in <xref target="DIGEST"/>.
If the chi digest is only delivered in a trailer,
progressive validation cannot be performed.</t>
      </section>
      <section anchor="example">
        <name>Example</name>
        <t>This example shows a 47-byte sequence split into chiclets of 16 bytes.
This chiclet size is far smaller than would be used in practice,
but it allows the example to show multiple chiclets.
The resulting 3 chiclets are shown in <xref target="ex-chiclets"/>,
with the hash of each, starting from the last.</t>
        <figure anchor="ex-chiclets">
          <name>Example Chiclets</name>
          <artwork><![CDATA[
Chiclet 3:
  Length: 0
  Content: " the next one.\n"
  SHA-256 of Chiclet 3:
    1ea4150d 2454faec 9e8b2993 aac8ef95
    15477606 7c59005c 57f00583 81018b09

Chiclet 2:
  Length: 16
  Content: "ries the hash of"
  Hash of Chiclet 3:
    1ea4150d 2454faec 9e8b2993 aac8ef95
    15477606 7c59005c 57f00583 81018b09
  SHA-256 of Chiclet 2:
    c7156912 ad30c2a3 910cc3d8 06ed2318
    aa25474f ff11f6a8 9efb6e6d 4ff7fe84

Chiclet 1:
  Length: 16
  Content: "Each chiclet car"
  Hash of Chiclet 2:
    c7156912 ad30c2a3 910cc3d8 06ed2318
    aa25474f ff11f6a8 9efb6e6d 4ff7fe84
  SHA-256 of Chiclet 1:
    e3bb01bc b8baa8d0 9010fb28 66b73d27
    d8ff408a b74a7bc7 2af12be4 464f94d7
]]></artwork>
        </figure>
        <t>The chi digest can be carried in a Chi-Digest field,
as shown in <xref target="ex-response"/>.</t>
        <figure anchor="ex-response">
          <name>Example Response Header</name>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Encoding: chi
Content-Length: 114
Chi-Digest: :47sBvLi6qNCQEPsoZrc9J9j/QIq3SnvHKvEr5EZPlNc=:
]]></sourcecode>
        </figure>
        <t>The 114 bytes of response content are shown in <xref target="ex-content"/> in hexadecimal.</t>
        <figure anchor="ex-content">
          <name>Example Encoded Content</name>
          <artwork><![CDATA[
10                                    # Length = 16
45616368 20636869 636c6574 20636172   # "Each chiclet car"
c7156912 ad30c2a3 910cc3d8 06ed2318   # Hash of Chiclet 2
aa25474f ff11f6a8 9efb6e6d 4ff7fe84
10                                    # Length = 16
72696573 20746865 20686173 68206f66   # "ries the hash of"
1ea4150d 2454faec 9e8b2993 aac8ef95   # Hash of Chiclet 3
15477606 7c59005c 57f00583 81018b09
00                                    # Length = 0
20746865 206e6578 74206f6e 652e0a     # " the next one.\n"
]]></artwork>
        </figure>
        <t>Empty content is encoded as a single final chiclet,
comprising a single byte with a value of 0.
The chi digest of a zero-length sequence is therefore the SHA-256 hash
of that one byte, as shown in <xref target="ex-empty"/>.</t>
        <figure anchor="ex-empty">
          <name>Fields for Empty Content</name>
          <sourcecode type="http-message"><![CDATA[
Content-Encoding: chi
Content-Length: 1
Chi-Digest: :bjQLnP+zepicpUTmu3gKLHiQHT+zNzh2hRGjBhevoB0=:
]]></sourcecode>
        </figure>
        <t>Note that these examples use the minimal encoding
for the variable-length integers.
Longer encodings for those integers would produce different digest values.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This coding provides integrity protection equivalent
to hashing the message content.
However, there are subtle differences that need to be noted.</t>
      <t>In general, integrity is only valuable if the chi digest comes from a source
that also has integrity protection.
A chi digest might be provided alongside a reference to a resource
(such as with <xref target="SRI"/>)
or it might be signed
(for instance, an HTTP Message Signature <xref target="HTTPSIG"/>
that covers a Chi-Digest field).</t>
      <t>The integrity property depends on the hash function chosen (<xref target="hash"/>).
Recipients are exposed to a risk of message truncation (<xref target="truncation"/>).
There is also a resource exhaustion exposure,
particularly for recipients with limited resources (<xref target="dos"/>).
Finally, the digest value produced is not canonical (<xref target="non-canon"/>).</t>
      <section anchor="hash">
        <name>Hash Choice</name>
        <t>Integrity protection relies on the second pre-image resistance
property of SHA-256 <xref target="SHA2"/>.
If a recipient holds a chi digest,
an attacker that wishes to substitute content
needs to find a second sequence of chiclets
that will produce the same chi digest.</t>
        <t>If the digest is subsequently signed,
the collision resistance of SHA-256 is also relied on
to prevent message substitution.</t>
        <t>This document does not define a way to negotiate an alternative hash function.
If attacks on SHA-256 are considered an unacceptable risk,
new codings and fields can be defined in a new specification.
Whether those items reuse the construction in this document
with a different hash function can be considered.</t>
      </section>
      <section anchor="truncation">
        <name>Truncation</name>
        <t>The use of a streaming format means that
data might be released to an application for processing,
with no guarantee that subsequent chiclets will be delivered intact.
Any application that uses this format
therefore needs to be robust in the event that its input is truncated.</t>
        <t>The final chiclet contains a zero-valued length prefix.
The prefix of every chiclet is hashed,
so a value of zero ensures
that the final chiclet is easily distinguished from any non-final chiclets.
This ensures that truncation can be reliably detected.</t>
      </section>
      <section anchor="dos">
        <name>Chiclet Size Denial of Service</name>
        <t>The requirement to hold an entire chiclet until it is validated
creates a denial of service risk;
see <xref target="length"/> for discussion and mitigations.</t>
      </section>
      <section anchor="non-canon">
        <name>Non-Canonical</name>
        <t>The same sequence of bytes can produce many different integrity values.
As a result, the chi digest cannot act
as a canonical identifier for content.</t>
        <t>Each digest value commits to a specific sequence of chiclets,
so cannot be used with a different arrangement of chiclet lengths.
Accepting one of a set of values
to safeguard against chiclet layout changes
increases the chance of a pre-image attack
by a negligible amount for each accepted chi digest.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document registers
a <tt>chi</tt> content coding
and a header field for carrying chi digests.</t>
      <section anchor="iana-coding">
        <name>Content Coding</name>
        <t>IANA is requested to add the following entry
to the <eref target="https://www.iana.org/assignments/http-parameters/#content-coding">"HTTP Content Coding Registry"</eref>
established by <xref section="16.6.1" sectionFormat="of" target="HTTP"/>:</t>
        <dl spacing="compact">
          <dt>Name:</dt>
          <dd>
            <t>chi</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>Chained Hash Integrity Coding</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="coding"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-field">
        <name>Chi-Digest Header Field</name>
        <t>IANA is requested to add the following entry
to the <eref target="https://www.iana.org/assignments/http-fields/">"Hypertext Transfer Protocol (HTTP) Field Name Registry"</eref>
established by <xref section="16.3.1" sectionFormat="of" target="HTTP"/>:</t>
        <dl spacing="compact">
          <dt>Field Name:</dt>
          <dd>
            <t>Chi-Digest</t>
          </dd>
          <dt>Status:</dt>
          <dd>
            <t>permanent</t>
          </dd>
          <dt>Structured Type:</dt>
          <dd>
            <t>List</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="chi-digest"/> of this document</t>
          </dd>
          <dt>Comments:</dt>
          <dd>
            <t>(none)</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="SHA2">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="FIELDS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="SRI" target="https://w3c.github.io/webappsec-subresource-integrity/">
          <front>
            <title>Subresource Integrity</title>
            <author initials="F." surname="Braun" fullname="Frederik Braun">
              <organization/>
            </author>
            <date year="2026" month="March" day="20"/>
          </front>
        </reference>
        <reference anchor="DIGEST">
          <front>
            <title>Digest Fields</title>
            <author fullname="R. Polli" initials="R." surname="Polli"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
              <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9530"/>
          <seriesInfo name="DOI" value="10.17487/RFC9530"/>
        </reference>
        <reference anchor="HTTPSIG">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>
      </references>
    </references>
    <?line 668?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t><contact fullname="Jeffrey Yasskin"/> was a co-author on a previous iteration of this work.
<contact fullname="Lucas Pardue"/> suggested the Chi-Digest field, rather than an integration with RFC 9530.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81c+XIbx5n/f56iTVUqZAKAuAgesp3QFBUxpg6LVFK5qtSY
aQATDWbg6RlSkJZ+ln2WfbL9jj4BUHZSla1VOSE5Rx/f8fvOnm63mzR5U6gz
sXexkHmpMvFC6oW4Khs1r/NmLS6qLC/nYlbV4sXt7Zu9RE6ntbrDF15cXewl
qYQnq3p9JnSTJUlWpaVcwnhZLWdNt1lUS12V3UXTrKa57qaLPO32B4lup8tc
67wqm/UKnr66vH2elO1yquqzJIMhz5K0KrUqdavPRFO3KoEpR4mslYSpz9/e
7iX3Vf1hXlftCi7w0j6oNVzMzhLRFdOiSj+kuKfkTpUtDChE/LQQS5kX8Geu
mhmtsHs///39qFfVc7wr63QBd/GGPjs8LHLd6B7fPjyHe/md0odv2mmRp4fh
EIf48jxvFu0UXl/KuslLQ4dD3D/eLmCLuglGjx7r8du9vKIXDh+nZW/RLIu9
JJEt3K1x4zC4ELO2KJgNey9pYHHLL+/RbdiBLPNPsgH6n4mX1ae8KCTdUYYk
y+b3RXWvyqauVuteqRqYo6zqJbxyB6RM8nLm/xLi5u3VGb1vhemmBSHRVVun
yssST07cFcP+cNLtj7rDPl1066d/XcGLf16rTNX5B/FdLduSJ5D1XIWEux+l
Abnu1VSuVlqlXe1X0M3tCoA1SdLtdoWc6qaWaZMkt4tcC5Dadgm7FZmagRJo
IQWIX4NX0lj+RbOQjVjV1V2ewXMwSgV33QR4p1EpEja5X+SFQhkrG/gfDtIs
FMycF/hgU4mVqpGKQldLhS/OYcEaKIq/p/hrOe+Z9S7zLCtUkjxBatZV1vIU
CSprdyo16K1fQ47rXwH7apADmKgqaPmoTDUvQzZuf8DEdAE7UR9XsG4SCd2j
cZEMtRLVDJ6jpcM8MHQ1E1kOFJeF0Pm8lE0LD2kYY6l0wkPLkhgKw+cID3au
TgKrgPuFktrRUNwBh2e5nBa0bxgd/mNxMBLaQyYxIQUodFGocq7EPfBcLHiZ
sCqa+E4WOYhXHnIkqdWPbV7jDmGmtZiuYUE5b0jDLVWmqrclBTqt8ynJwVLB
UjJcFE4m5qpUNS3L73VqN0FcSGuFg8A612ZcVeLuQFjWulFLs9ZMrVQJ45aP
cL4DGJkuhCQZU3KJm/J3iUiiQNmzm8BLtUoB/zQR2kiXhFtdBNIclVWAdhTI
FGSzKPIPCqT65TW8WKKmkcAhse8lSCiuHUGWCDxdCw2vNkRd6WkFhK6ALW35
AaZNkTuZQGQqFKBlcilhD+ZPEIPlqs41iAksHZjYLGCTKPsM/LgB5A6JmBUZ
IcsMHifaoxAj20r1sbGDGhLDf3pR3ZfI2c+fZ90KGHKXq/uHB9jQTz/9JKTU
d3MDL+JrUKmeCP71utG/7Xui1+sl4dX/2vnr9r3wpRf7B4++FN0LXzoUf3/0
pehe4nfxa/j71/aPA9rQF+4lWxvgf3c7NxfeS35Lo9D/A5F/cn/4Xx65B3Ne
A6rA6BcGh2gq8j3El+8hJ/79eRPgvXie1wBAhAQ/9+9a2ie73W9RkpLPZ+KJ
FzC2eN/svbZ/g+w+J9O498CqRKILV1FyERFrBRBt/jZSniCKwN+1Ai0DNKnV
CgABboAuTdf0ZDjKjJZvFIB0HX5HUAaXopfEmLMbXEINS0ILtWXPUOdAqZ25
IAXtJAa8M8YyFWo5moiyWMMmEOfhEfBdQLmnCsc3CK2yp4lWClQVvbx2uUI8
Ql29tZgKlr8FTEM/qUzXQHwR2Q4FZh22lAUPJLTUEN5obWjCPPwBVmWqkGud
AF1hX9X9Bq7CAxp8jCaZKhhPBVyLgJZxCrYKiEsLMbiZVrA6YhMiEhlFZ52I
wWyc9RJpKpdVW9LjKE0LJWGU8yzLcfVgXXkOC3okAACGBjlBCFSRaXSIiVu1
BpogtckuRtzq0cqAHeSuBUuENdmJjTlC1rFlzD/RPi2SPwUMHovv8+8cm+kJ
meErdgx4vt87Gf2qA64PbFXiTidHR6OjLimQfXPHS/2jo1/1kmv07Wo3p5UB
+2hHTFt62zIdZAjpGL6CopMvUTq97LCnkM8XaGLMWJr4VbXzhchJZFcV8B99
EPTLWBzQU5WxQe9QVALhSNqwI5UTg0DbvZvR3MMIUmvFm/yiBIVawKOyGqCj
B+B3h++hJCPfn6FrSrKhWdYg2kHzDMTce/nu5navwz/Fq9f0+9vLH95dvb18
hr/fvDi/vna/JOaJmxev310/87/5Ny9ev3x5+eoZvwxXRXQp2Xt5/pc9Ms1i
7/Wb26vXr86v99ipCt0olE0g59RIKGAaAprUifWv0F0S3128+Z//HoyBCl+9
fX4xHAxOHx7MHyeD4zH8AdJU8mwELPwnkHWdgLorWeMohFFyhW6p7pDXRO4A
yiGQ8zd/Q8r840x8PU1Xg/G35gJuOLpoaRZdJJptX9l6mYm449KOaRw1o+sb
lI7Xe/6X6G9L9+Di178rIHgR3cHJ775NWEaA7Eux583DHijVDIAC+fJFs5IY
F5ml28RFmXGv6BrJaew3tyj0+NadBF8S7ELJ0VOCvDMmjbAZdLOct3KuQBTu
VFGtYGgEOqD+BUxwwxGUFoMJsX3QG+Eiv8Lb34BcnPb7facmu9MWbIPF5ydm
sUlyXq4JF/OyrVrrVXssN448RDO8z6YCyPMP4Y7QonYN/HoX99aDAFsUxuzQ
8Nq4BDZuaO0NrLfEtJ8nduVe3ZmTZgbnQ4tPqq7QKC7RTJVV2YXnwWo4KETC
SRFd7CUXoWFgBUUVIVO3bUZmNccdOJRfsTEqyfn2rMHyJN2lRRqS7SNZzJAH
HTCwzb0CP29Aww+/1u3q28ng60P82R0PzBL3AX+LFql4EJBK7DNu8sgPDzAc
b3c0ZFtDcr1PJi4HPNhY/AGs/ppeZRqQnMKmW22j9E120wAA5gbsZ3W19HKK
YgprQ+lEqbQjZxWQoIFoBd0kgkE7j9EtIEQOBowGfZqQP7ioQEec3gAX0E2Y
zWAeegMEqi3I9ATentltzqpXtc2qbaycAVJ1h0egRcUc4ulmgav+Ci4OUY0m
wxHAq4lj0VbpnU6qbqdsuIKgi0UyYj0xKiPOI9e7IPStit2VTtKukBQbzB5u
hX3JfoEGOOcFWB7okIBL9s5AayvAPBzACEFZMT1o/t6OhZKfg0bESRNeQacl
Bzd2qWTpHDav2SlNVJB7DjCXsYsT+nRZroEzKY1m4dVkgzAktjpOHu4SvJGG
pjIUzzign+WF6iTRJYagDmh6dL3kbNQSyAQw+lSwPmBSzOCyCqggjCKQera4
HBJgEnTMiUTIj640y6I1GngFXkZhvgchonRQFQgbEzl4HqZZ5o0zMju8H4tS
xLEgEjIrbSzlAGfOw5FRmbTRplTWNaZcYBEaE0nBMM6vWuRdfhPcCIQflBXK
bVT46B14UHIzeHJQi2mFArCnqTFgsZkFCB5gQlAbDxZAGAb3TVhgs2VxgaLH
nzFXEPlfGDbs93oHGOx24NpzEuDwTicBk2Yv4GvXBmTzA3zB4vz+CT1roud9
gAJ+Mx4wfl98I/rRGGY6H/wyDWzo+8Ut2SjY0JQ8BAtKyBCPzAaYHh4s81B+
DdsyBQFqoY2FvPAxI9mOP3nz+vlJGFCi0Sfpw3wrCpaJ1rSQW/bfeq8G4VHf
YbFiQxNAbmwIG8qbUWtWNlbuqRIuSL7LJSd5ZQEmtrRx2HLZliZYxcRmWari
aYISanKOuHMU8rWLNQKVzg0CmDgQ3bDQRwslH8j2Z8B+Ylm0nU7CwQ9qdhgA
RVuMXJVoz1ZAkFaAfWCqpi7JwJkLiJyABEZNDIwjx2gf1o+4Xbi3Nj0nwNsg
p4tvclYB/4pi3IQGQGyQOAi5YZ2EInm2ozSxSXKrLCSkVo0FKk+ZsyQZ9ECY
wQGD+THSBei5B1rAkAbCrBQ7ue3RO28xqJWPOhAUFPM1Sii+WzlCsxW3M9CS
KbFCDg28x7yqKU0Ab55Pq7rxO6tr1CZjsVm2ydCZPAa+xplbtAGg9MoaSLdo
ZnZGKftsKyfrLAYPTku4iuyzkUsN6EHTefjPnCvBC8NN2m38XxOA9IgzL7z3
RzZhvVdEQt7OaLibFPgAeZ8a6yFwA3w486ShACWsQ6fk/8O+yQSgaEfZJVPf
sJGhse+e18FlixwAcVToKRzDt7WMqCi3F27Fj1KFkSNg0eEXcoi0ePfcj3DB
sg1cXYj57EMEGbTh1+jb3UMs02GPLkAp3ab4E6usaxsE23tUZVPa2huTA/Xx
FiYqHKR2nYMIvmuKtRuTg+QYxLlu91I7a2IQE2x39xkbJTIBYj8G/QNfpCS/
FSwQjF0wByH6whgBdwjGBm1PrpfoHrYwEIC4MSW+BgWuaUuFPqAhJlMrIhi4
Om+v2L6gO70IiobThp0CNH3sUvNs5LE3O9ZPbq/1pSGE/GDKlMZFMS4HTEGm
co50OAewhtioRnEx9/PS2i7txBWLTMLWgikxhLtEyeWRLPQH8yCNK4EcwQQt
GiXCc05KgH1dVPdBoF2T1HICDyIDE5uieIJlxITeAeUNTTnZkJjrroAac4mq
T54pO/yqMR6ysUXoAzs3Bm2tM8/23V0vYYKb5rDm9/FUjxumXBuhcwjnXBiN
Ud9rxKet94WXfhaZzXCRSeRS/27ZnGh2Qpk4UTehpAmUZRPPF3iBNmdq/D6X
Qk2SKwjX6gwFjvK5lEhm+fS8CIMJ77bkWHzAYFjxCN7PwZQ+lkC55rnESHyF
VescvEoXP1JOxSeRokSR0iqmCa0oCxwVR/hConu2KmRq+edjfyIWPRkWXhLZ
bJpbyyAOqpZLlYEMo1O1QkcYoSF3oZKPbKw6R6luVy3KIycw4j3lYVFb7mWd
gRzWHAcBwe2enWts40gyBrhLtagKZBfJH/uBtDncq2tHMGUyStTJLNvBLFAj
J6JRckIbWrs6TSA8QTzKcf6KTSBGdPlHlXWx1pE5PsdlJiNF+F5Wo19P2LAh
Mb3kOcU6bOIxlw3skHOD7ib1mOXwrFwDgnCHiXeCu6Z6UWCylPIkP7aysHCw
kBhNqBoRF9x4kDqNlTISxwRdknwGa4XV2JdMgQRTti7vCW4COgOIqgW+giy3
NCF7hE6NGZy5yBVGeLfB8l5QJonaV27yZV7Iulh30CkGKKkoyWHG4KU7jcCZ
OVmGaUIYG+A3A+AF/x7IF25lpqjvRJMA5SU/b4MJm3Gzes9aYVJqmxKTLOUH
MhY+1wORTFe3ecOj6LxpGflNzscyF9G6nuZNLet1kKNiHwwpeUUCIAswP6uq
AhoIPyrGliT82bqUS/SegM3W+cq8uikN/kyOd0U8O4xsC1yuvIlJ1VTi0AYA
iBJUQbyvwion16fsCn0KeIrmONg65jVSbzt90itMixF6Kr92dKq05JooArXJ
LDBeS5Kgz09M5pYi9BwDkqWrDdgOKwIVNAboazqsRpwg95GTSkG5AjNOSwg4
scmHt/No7IgaeRXNaqvF4NitGgFWv241Z31gdp2wuAKVKCcAlGlXK3RmCyxZ
+mwWCx16dM7ImRWpjwtgDKcsmkamH1BY33I6otaCqlF2UDdcVMstTFoZWMtZ
VCqt2jQ5p1QHE5NSHRxwUq6puE8rruZyXnmqePkUlGI5jUUV58OuSRmlbv20
Jybi5lzrVtnB2O6NXHwvuaTUrd0qVrpcqFHEdV/aNjpzH0oqz3cwk2B8SJPq
cxV2VI6ZQeJOYsvsNs9TW5JqX9TOOQkVUZ8SGBvEt6tyDmtQyabEfbs0uUnj
N8ZPm+FAgpbyIz5s7LdmI5kppIaLgc79iiMHz23IsIIcxC2iY/KHBdcgchT4
zdoaFbyHLhHytkbPYoeJXMhHUveg3GAGjRdtSWYxVuXk1tfoVaApbdhOmZwH
JROqWoNPbAIJnJfyVsap6l4HQnZAtpWjRDTztrnCCLn6mNKsC5XXuJVZPgcb
4Chs0F9OdVW0yCVD+JB2gT+QKSyOUpBiemzMg6GpoCSPde1y6pKsna8zRcTh
LodxF/6w0T0iHXvAaPao0hMvBQbaKIEMbGMN1T1clwIuetwPOkF2cR8VMVJN
82TM3v2G2x1Ibwxsu5iQyie+lY4W4UTZLHXolmp2YepGGM9UNlZOpiqmkeSa
7iPpMAgpsObT1hhlu/gPuwwL5fOc4CVQbxKKUAy4ljPsa2KUGyAvrn1eAQmA
iI+5J2h+5JTqi5tmiCGfIBE85A9IX4dYEKQ0CptrsT2SGo9g/hwcxJIDr8h1
XmJcxR0/Phj4MzUHx1e9e1yip6nRr8CxOXUcdDZ1Eirb8NvWLlDXbZZFbhLn
e3TcYvTWLTWw/Fafi6r6wPJjqLKS6N/hnFaFWSs5mcjs8LlCt5WpKsAPlmIO
Y6AYgUSg5e4kQD+XByD3j1LxOfANG85r9vkEZcQNsppkKRb7CTneYcULXAgq
drHOG5dnd80d4fFeRT4djRP1in3+/BVepO6CwaD/8OASOOvE9kS5Plyuh++S
KFyFqckFZf3zzW7yIFuPGFra7me3erIP2Dmx3UTukke+eQifxLjtXCCHsUxN
JjuehSoJUblrV5XMB9e0XnP6A8NrmoTJ/R7eeL+1J5M69t1uvo/R8cEWcAk1
dxUEOwln723UGwVqj3ShXJauSZ/7L0jzW2A/Ds7lkKjB6mli6Ru9QmzM2jp4
J2hNxHQTWe3aNChSnt8ym/ZM1a1dxHEujTQHGFwBxqFyeKqgrIKqy7yVNeiy
UixIRW5LLpbgrmbK3QLswe5cBcU+eoXmSQfNDuf0SteTEaWnF0+GKAC0sKHL
TgmocHhgqfbAzOaBXR8yBzZhbddhI2As5erNlWCywVeoWmxR101VOYOtVQ2o
ZsXYlV2HvSOuvKJGb1UQsUJZUyqEpsTNpQuVfuggemKdnatWu/dokizgf0C0
DgDA5xOwadPJK/3qugGnLWYoLTIggprQzAhO2GfqmtzRYOzorWGjrcP69kbf
4MbeyNVuudCAY27mXBPysiSv3m4cf7dbxxvaNhdswMQ1Hh5gfy+mkeYOhp0i
QpirNjoDuLQoN+CCHE7mPvkjIHZocfEQSLWc5iVbaQqRakrjWtlL9gNZGHs5
OAhFmuTSFi1LwJXG596CANpwnR0qELec21TiCU31ZW0zwQ34pVVrwjefLqXQ
wYwbbxWoeYGNU4pOxG3QrCOs4X0//5Sv3iOj3k/r953EenFE02wnZZgJpHhr
m848h+fXkSUxLdqpX0MSlTFMVt0tLKuU3uxtQmxcGsfvqW8A3p7LCHw4mWmb
Cy6ZQUs1rxrMWWYOQXFKzpQqvQiG5cShNV9e0J+TKQQD5qX3kQIKVR7e61kX
T/q9j0zpJsSMegNqSHx+dXn97IachsnRgGwRJi1xABBdteQxifHW2G0PNeod
BYP5tkpelYVGKuIwO02Gv5NQhpTdZG6vtyXKXvInzqOSEJjKy3qFw9TOYSR0
wJZH4BQ35jI20zkebx1MooVX4wpq2NQ7L4GRWLkin7BaLvEQEYGz396wN6Qj
EW5vr9CdBpe4yVPOgVujTqV/iXk8bEO0BsQu0kzGNgb8z1Xzc/OO4nmZM6aN
I99dgwIJrNkwca5JPmpGqfmJ6wvG2WHtN7qY7Jt8oncuNCY067agiu4GYFqE
tYs/6cWwxT1jvjFN+nDD99xixSDcERc5TRwdtGGAEoGNwEMAIcoDgd552Nul
G6jvwLcMA/o1j+uFZBedeskL8OjBQHdseXrXsAYHI1PEkYw9B7FrbDYxPAiJ
iMlDUCYbrXeGkm7iCxZaKhj0bLFW3VEApD5S197c1R3QBrAu+VJiRgW43NtW
102EM+lATEg8aD3Gh3iUMZYkm3SIlb+aUbM2+IMm/zVzkMhNoLb8yfV72+Sp
4xaqxyrGxn7YPjqK1jFDW1jY4zJxYw/YUZhW0KEDbXovpXgLlmzDqaACPyDp
QmKDzHvn68qNHqXfPbv6w+XNLcHn0Yg6uq9c4cqpqoG+TBWYedpYJ51E2tVn
DXtDgcXcNJ+DdOnoy48SA30wCYp/e7BHpswNPDmATB0fdyPkDot/Ls4Fjgwm
/pwN5lbCAzLISVkLe06FaHZvS8CtyZGs8CRyniomd+7ayLmfgReFOWesLLmq
Y1RXDIqDo7jCGJyKVB+79tbDQ8d7J7YwjNakI3aXIl33Iu9tdOY6Bs9E3/cK
nok932pRlar3dzpxblulYJJoBCEGSo4HR/1MDMdH45lUqThVJ9Ph6elISJme
qNnpET93ND4+nvQn4jg9Ou33j1JxdDyDnycjcTLoD06m/VPfDjkMVzeYRMsj
Wxrses/2Rv5n17aTBkOeJz0eHE1OB0NAqFE/HcqROB3003SUnYj+RGXD0eCE
z8jLIcw0nonZbDCYTeQJrGc2nahJJsaz2fFMnYw9DQZfoEF8KFfWu2jwH1jb
ThoMeB41mk77g2kqpidTKU+yvjjtD/qz6fBETCbT41E2POaPB5zMZuP+CfhU
x2N5PE2PxVDOBsOpGovxZDw7HWfHrk81kHfbqmp138yubXdq2Lu8AxS3e1Wk
3tAsG8+6A8f0MQgb5KElPxyA0zjs98Xr721HQfeWPn7RgLYcrgosutgbNgI+
w6Ulca4c+DkYJ35NZ+JsfKy/u7vOJz++uvjh8o2u/lqnp388/efhD1c/jm7K
uxff313WR5d/fVO8Sr85Cwnkw/CYQG/t9RfkBVs6wcS+V9+9a03zDrzhOxCD
YxoXsAyiBDzyYOBk0P/Z87fwz1UQv0FBHh9NBpPR5ARIiT8mpwJ+pJOj4zFf
GRwP6Z0dUv4LhJle3dKF5JeI97+zmePhBAKH4xEs/XgMmznCPZzAHkZicgK/
ziYT3sw2bP0CdNq5mVHyS/Cq/69upp+EW1CwqRNxPKYtYOlsqPrSvLLDQoQa
a88BxPJ4afKGRhNQHi+Xq2YdlsPj3CIXNqIMCnb+0PEkzl0HtQ/TlGhcMzqS
uokLlKGg6pgpYTi3IKqg494szFGfjjtpa06pBIcTrZZgYm29Gzh+IR7EaDD9
5w/X5ZvfflKrPF29u122o/n31y/yH17c/vbTq0+L4eLtH/753ULdVd/1YzSg
hVjSU+DMtSQmdUD7V1VQnNTOS9GuZd4ebXInAO0x5kcKQeDGXFclVlDtG/bk
M/ad2IeM62T7Orz7mwWeNecABMRSrfmAUYk141q6o7N0ECYzB78547rrAy4C
c3gwJEYnDR8qsuHOVorfRTpcxCIkbKdYxbKLTG0yJciZgIdKbulVaUpLRXhU
zXq+uCsqEORbzjHIsw1a8IQBNmlwEZzKVgu5e2MbZ2q2zytI/LAIFdolnxcl
OaeA2PaC+IouqY7pBKUCbh4MqamjJ9mfbbY/UQXmpSHjjfuODAQFeOfm6g8U
FYyHg40DatvG+MCEN9FOwelv1puH2jm/2papOXFBZ+32bZR0EFXG6Fjgx1Wl
mVmmJTWo7jQ1DMSxBgzh/zIBu21lRT54qoVtIDQ67BlCGPS405bapERcTGTq
FvmSKle+iRWmzCpNc1Efty00h4pg9cRF79SNSo3a+3F7qomMyFRcLCoIRbC8
hlThdPmWZtSq4JyUScODHtAB3y53tcE6c+Z14nix+8TE1SxKZmCJUEc1KjzT
ZzpmbLLlPqdmQOrCmQItm9Z/YihxfUKA/BnlbGltO8+emdGKIuoUo0RNdCbM
BKU+IPUtrtjTRSLOCYm0KopcM4UsCcKdW4kg+mEyizuGKBnhJMvtyn77KPo0
kU29ciQNOzTH2VyqlLInwTmjSOqZ4tyAhOxz50NNDzMCJbVwibYMWkpQ+DsJ
noCx4IwlUD565NoXfWjPh2Wi5hyseCtT+SVIpy8h1ar1bf++zrf5JQGbUtjI
d3hVNj6724AR6Fuvo5+fBCoaFY1lUNg1XW0+1ZbQNyAcnLl+foSEMmoDNSeX
3NebaMll5ct3LLy7uqNtN1aY4gAONT06sx5O4quM4Vm1uIpvO5rratr6VCeL
mKkU2qY69FyYKq4xdvM4N5Wdv9gY1DMHuPB3SiNQb8JW4y2VcwIPi06GmyqD
b9za6trFhj3M/nCarkXVN6dXdxbJtPvkVlC+CKDadbsW6IWsqQkobZzAWCf5
BnM3z1SZc/fIDX7bh0ARQTcxGReq8JFSPtqWiI2EeWGqWC6dmKSUcadDw24O
beZAVbPpO3u8nSuYuU5bLo6g8oFFyOf2c220+FdAjAsH8Z+feITnFROwbX/E
Bkli8Y9aVbyWbVdXzjVbs7YwPWRx5IzAhF/VIxfcmxs+IQRwUfOZRtcYEebk
WTKCo8PSIcgjnQLYrOjSfK37akGIExDFY6luafp1454S3A9hHBev4/MXvGPE
Zy1nCrXYH1zYOJTCx0h0Qi0h0ubj8WpqxvSmkbGXvj6EkF3kczp0aT4F5Nre
GXv5U2reEOHn/85fnW+4tMDqXJbyYdNU1GoOWgNOU/JIHYM/mRC1jERHTqMj
KLvbQnDirusNocXRUTUqjBqczDLTMWz7OmCEep2YEvDf9sJ2QDvyW1p7vd77
x7770OP9fQ+no+9v8lk76mA/pIDJV44On5htmnUdJLAUUHaGjqhINJj0JlzJ
41LLGUQ2+OHJhMOs5Bl9p4Y6QPDaF7+Qiv2kxlPGZ31bjmtWddbs8xnGoaAn
D5vFSs62uJolUZcY8+8Td43uFwbbt6AJGlYo3oAfV4GnIvZx1wdmNtz4v052
dgEOv0zj0QaN/YRMVbv9JLlpIAzQeBVWDWCE1IKL6BdQpyfly+DudY5PbxI8
POy/RXSssNPC8eF9QCZ1EDECP/I3RdUEJTtPsfW4UNmc3oDnuMNNZd/szcCB
UxgDf/78+Y9qNqvVWvwF6PIhB0/6gY4v4RnbLn/CEn0sUv+7HD86A15PHXwH
xnxfsYdjXbcpvPoGYKZVOJBu53PD5l2n5UTYRydLA9VB5R/CJ4FVlV7yvxWS
tKDlVwAA

-->

</rfc>
