<?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-00" 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-00"/>
    <author fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <date year="2026" month="October" day="31"/>
    <area/>
    <workgroup>HTTP</workgroup>
    <keyword>next generation</keyword>
    <keyword>unicorn</keyword>
    <keyword>sparkling distributed ledger</keyword>
    <abstract>
      <?line 37?>

<t>This describes a content-coding for HTTP that enables progressive processing of content,
without sacrificing integrity.</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  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 43?>

<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 the entirety of a piece of content
needs to be acquired in order to validate the hash.
This document describes a method of hash generation
that can be verified progressively.
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,
or chiclets,
each comprising
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.</t>
      <t>This enables progressive processing of content,
providing 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.</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;
an average chunk size of 4k adds an 0.83% overhead.</t>
      <t>Constructing content in this form
requires that the entirety of the content is available;
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>This document uses the varint encoding
and presentation language
developed for QUIC <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-description">
        <name>Format Description</name>
        <t>The format comprises zero or more non-final chiclets and a final chiclet
(which can be the first).
Content bytes are therefore interspersed with framing and integrity bytes,
increasing the size of the content.</t>
        <t>A non-final chiclet comprises a non-zero length (for framing),
between 1 and 2<sup>61</sup>-1 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"/>.
The hash is the output of the SHA-256 algorithm <xref target="SHA"/>
that has processed input of the chiclet that follows.</t>
        <t>The final chiclet includes a zero-valued length field,
any number of bytes of content up to 2<sup>61</sup> bytes, and
no hash.
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
is not written to the output.
Instead, it needs to be carried outside the content;
see <xref target="digest"/> for one method of indicating this value.</t>
        <t>The format is illustrated in <xref target="f-layout"/>.</t>
        <figure anchor="f-layout">
          <name>Layout of Content Encoding</name>
          <artwork><![CDATA[
Chic Content-Coding {
  Chiclet (i) ...,
  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="SHA"/>;
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
will need a hash value for the first chiclet
in order 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="digest"/>.</t>
        <t>Without the hash of the first chiclet,
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
starts with an expected hash value,
then proceeds as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Initialize a new instance of SHA-256 <xref target="SHA"/>.</t>
          </li>
          <li>
            <t>Read a variable-length integer.
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, plus 32, 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>Finalize the hash and generate hash output.
If the hash output is not identical to the expected value,
abort with an error.</t>
          </li>
          <li>
            <t>Release the content bytes.</t>
          </li>
          <li>
            <t>If the length value is non-zero,
replace the expected hash value
with the last 32 bytes read from the stream
and return to step 1.
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>To account for variations in how chiclets are constructed,
multiple hash values might be provided.
An entity that wishes to validate against any value
from a set of provided hash values
matches the hash of the first chiclet against the provided set.
Once the first chiclet is processed,
subsequent chiclets are validated against the single hash
from the preceding 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 immediately preceding chiclet.</t>
        <t>When constructing content,
if the content is processed in a forward direction,
chiclets might be written with placeholders values for hashes.
Hashes cannot be added until all subsequent chiclets -
and their hashes -
are computed.</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.</t>
        <t>The fact that content needs to be processed 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 it requires two processing passes to produce the format.
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 releasing it.
Implementations that accept untrusted inputs
might refuse to support large chiclets
to protect against memory exhaustion attacks.</t>
        <t>Implementations of this specification <bcp14>MUST</bcp14> support chiclets
with length values of up to 16383 bytes (2<sup>14</sup>-1).
This corresponds to a total chiclet length of 16417.
Larger chiclets can be used with prior arrangement.</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,
not the 2<sup>62</sup>-1 bytes of content that can be expressed
in a QUIC variable-length integer.
For a chiclet of that size, the length and hash further reduce
the available content length
by an additional 40 bytes to 2<sup>61</sup>-41;
the final chiclet might reduce that by as little as one byte
to 2<sup>61</sup>-2 bytes of content.
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
on receipients
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 describe content that can be progressively decoded;
see <xref target="coding"/>.
A digest format is defined to allow the hash of the first chiclet
to be signaled;
see <xref target="digest"/>.</t>
      <section anchor="coding">
        <name>Content-Coding</name>
        <t>The <tt>chi</tt> content coding indicates that the content of the request
is a sequence of chiclets,
following the construction defined in <xref target="format"/>.</t>
      </section>
      <section anchor="digest">
        <name>Digest Format</name>
        <t>The <tt>chi</tt> hash algorithm label
identifies the use of the format described in <xref target="format"/>
when carried in the Content-Digest or Repr-Digest fields
that are defined in <xref target="DIGEST"/>.</t>
        <t>The <tt>chi</tt> digest format is only useful in combination
with a very specific <tt>chi</tt> content-coding; see <xref target="coding"/>.
Any change to the length of chiclets in that coding
will invalidate the value of the digest format.
This also means that use with <tt>Repr-Digest</tt> might not be useful
if the length of chiclets could change
between different encodings of the same representation.</t>
        <t>The value associated with the <tt>chi</tt> hash algorithm is a 32-byte binary value,
represented as a structured field Byte Sequence;
see Sections <xref target="DIGEST" section="2" sectionFormat="bare"/> and <xref target="DIGEST" section="3" sectionFormat="bare"/> of <xref target="DIGEST"/> for details.</t>
        <t>Unlike other hash algorithms,
the <tt>chi</tt> hash algorithm value can only be used
during the removal of the <tt>chi</tt> content coding.
It therefore provides integrity for content,
but not necessarily the exact sequence of bytes that appear in the message.
The same sequence of bytes can have multiple valid expressions
of the <tt>chi</tt> content coding;
or, another content coding could be applied after the <tt>chi</tt> coding.</t>
        <t>Note that the Content-Digest and Repr-Digest formats
do not allow for multiple values of the <tt>chi</tt> hash algorithm.
Only the last value is visible to a recipient;
see <xref section="4.2.2" sectionFormat="of" target="RFC9651"/>.</t>
      </section>
      <section anchor="example">
        <name>Example</name>
        <t>This example shows content of 47 bytes, 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 hash of the first chiclet can be carried in the Content-Digest field,
as shown in the HTTP response 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
Content-Digest: chi=: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 <tt>chi</tt> digest of empty content 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
Content-Digest: chi=: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>The security properties of this feature is intended to be
broadly equivalent to simple hashing of content,
with the added condition that a recipient can use parts of content
prior to receiving every byte.</t>
      <t>The integrity property depends on the hash function chosen (<xref target="hash"/>),
but exposes recipients to a risk of truncation (<xref target="truncation"/>).
There is also a resource exhaustion exposure,
particularly for recipients with limited resources (<xref target="dos"/>).</t>
      <section anchor="hash">
        <name>Hash Choice</name>
        <t>This document relies on the second pre-image resistance property of SHA-256 <xref target="SHA"/>.
If a recipient holds a SHA-256 hash for some content,
an attacker that wishes to substitute content
needs to find a second plaintext that will produce the same hash.</t>
        <t>This document does not define the use of an alternative hash function.
In the event that attacks
on the second pre-image resistance of SHA-256 are found,
new labels can be defined in a new specification.
The definition of those labels could reuse the construction in this document
with a different hash function.</t>
      </section>
      <section anchor="truncation">
        <name>Truncation</name>
        <t>The use of a streaming format means that
content might be released to an application for processing,
with no guarantee that subsequent chiclets will be delivered.
Any application that uses this format
therefore needs to be robust in the event that content is truncated.</t>
        <t>The final chiclet contains a zero-length prefix.
The prefix of every chiclet is hashed,
but the hashing of a zero length ensures
that the final chiclet is easily distinguished from any non-final chiclets.</t>
      </section>
      <section anchor="dos">
        <name>Chiclet Size</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="hash-id">
        <name>Non-Identifying Integrity</name>
        <t>The use of a cryptographic hash function
provides pre-image and collision resistance, but not uniqueness.
The same sequence of bytes can produce many different integrity values.
As a result, the hash of the first chiclet cannot act as an identifier for content.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO: register both <tt>chi</tt> things.</t>
    </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="SHA">
          <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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9651">
          <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>
    <?line 518?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t><contact fullname="Jeffrey Yasskin"/> was a co-author on a previous iteration of this work.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8Vc63LbRpb+j6foyLU19kSkeBN1cZyMIstjTeRLbHlTmZ2t
SgNokh2BAIOLZFqrPMs+yz7Zfuf0BQ2KcrxTNbWqlEkC6O7T5/KdWyO9Xi+q
dZ2pY7FzupA6V6l4KauFOM9rNS91vRanRarzuZgVpXh5efl2J5JxXKprGvDy
/HQnSiSeLMr1sajqNIrSIsnlEvOlpZzVvXpRLKsi7y3qehXrqpcsdNIbDKKq
iZe6qnSR1+sVnj4/u3whxCMhs6rA1DpP1Urhn7ze2RU7KtV1UWqZ0Y/zk+/x
AXJ2zt9dvtiJ8mYZq/I4SkHIcZQUeaXyqqmORV02KgKh40iWSmLWneimKK/m
ZdGs8Mvs5kqtcTE9jkRP5OpjLeYqV6WsQRldanKdFCV/rVayvMqIF6mu6lLH
TQ1uZSqdqzK6VnmD1YXozi6E2d4OfV1KndHeVD1jfvRu5n+5GfeLck53ZZks
cJduVMd7exnWqPrm9t4J7ulrVe29beJMJ3vhFHs0eK7rRRNj+FKWtc4t1/eI
23Q7A2uqOpi981jfjO7rggfsPSy5/qJeZjtRJBvcLYlnmFyIWZNlRug7r3hi
cWkG7/Bt7EDm+hPz9Fi8Kj7pLJN8R1mWLOu/ZMUNhF0Wq3U/VzXWyItyiSHX
4Gqk81nwK+r1ekLGkIFM6ii6XOhKpKpKIBJVCSmgAjXm6iVdzRX1QtZC5TLO
8NiqLOalggZeK/qe0Fc8XMzc8N3oBmwpmlpUElPPdEL3tbOLvqVjqdM0U1H0
iEymLNImYdWJyIp6saygIn6M0ETeCjstwTJRF0XG1JG+ljQ7U2jXh7rUyQKU
qo8rldTMvarP89IuSwVa8RzGKIF1MDVoTzVkKTNR6Xku6wYPVZhjqarITC1z
QbLD9Jrstt0rqMD9TMmqJnZc61SJa0XbJnbRJcyO/4zkrTD7xHxFep2LZCGz
TOVzJYhtYmHIBFW8MBFJi5YKXKBpxEqrRAXsjnKlUjxdiFgJmfzW4FliHbQn
VSVdv5aZJhvnyWj+vhV9kTRLYlioA0sFOlOan54MjdozInY7xDqBNmRrO6/T
lGpd1WppN2JgSRT5Awq0C2RLFkJiWA3QWZJUu+olRVbgW6V+a1RuWFAqYExa
sRRW0A3SddzqEZBpUnohV6uMJEY6IDJ9paDRry4wEBBJmmMlcSPXIBO0E84x
9+M1cCvTdU2ry5ZX0MkCMmvyK7MsWXemavxQEvQnxXJVaiI5Ar0Qa73Azoql
EgZtiep4DVAJDUbIPMXjzHBSa5ITQ6qd3PIV/1WL4iYn4d7eznoFpHCt1c3d
HXbx+++/Cymr6znjA/6+gZH1RfDX73X+7t8T/X4/Cq/+19av9++Fg14+fvLg
oM69cNCe+MeDgzr3onYXf8LvP7kfT3hDn7kX3duA+bveurnwXvQ1z8L/gsm/
+x/tlwfuYc0L4AxmP7XIxEtxmCA+f48k8c+vG0H24oUuAUmka9t3F/xdSPdk
r/ctaVJ0eywetQomONJ5tvPG/YbuvmC/snNn7IdVF1c34Yp+O5wi6MDvUsG0
ACGlWgEFcAMoEq89NrlRMybfG0AXWb7ABxkspqvAkyJ0QGxiwFzvL9ge3QhQ
Y9wdW7NZniyvyLM1aCagxyPw87DlWNH8Dl7Tp1GlFCyTIqlmuSLMIdO8dLgJ
XG6AWxRT5MkavBYd56HKRGFDafBAxKSGEMa0kQ9rIQ54lKpMriuLZUmB2ZiL
BBjsxUJ3UirjTasl8UAuiybnx0nYCyXTfnSSImrEanCHBqocJrF8gFUW2CAj
laUVBYnM3bLCHog77Mg63O0zZWAfhyIBiaDJLWxdBLGaV6v0J+PnLMI+jcgJ
42EJX8kI7B+ZXAmZYiQeGPQPx/8WbCaCfUEDKLqArBxROjfsIY8RlYqd5gMe
N1BhZtw1Ii/SwlDaZn4jboposOY1zUESI349VzOdM08rIyMEz+RqQPLOqw/v
Lyk6p0/x+g1/f3f244fzd2fP6fv7lycXF/5LZJ94//LNh4vn7bd25OmbV6/O
Xj83g3FVdC5FO69Oft5hjyN23ry9PH/z+uRix/PDuzmSqQkpWLIwVbJTWUUu
VuAQ4/vTt//z38MJuPDVuxeno+Hw6O7O/jgcHkzw4wYhk1mNDcj8BEvXEdRa
yZJmYVuUK4q/ql2OANjLkaqCnX/+D+LMfx6Lb+JkNZx8ay/QhjsXHc86F5ln
96/cG2yYuOXSlmU8NzvXNzjdpffk585vx/fg4jffIUEC/g4Pv/s2ijbis6Zi
5UTYJRGzUChuIvSI+GpRlPEB0JHPG9gHxISArFhBTGS84MwpyYU+n0E4R4PB
wOvq9uzV4Lu4fWQSCOD8Sb5mQ9B5UzQuTGvjGRsZInbOTeheIKRpHyLSyWx6
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
Gby3Y1+w7kf/Cx3LNzA/QwAA

-->

</rfc>
