<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>

<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-digest-headers-13" number="9530" submissionType="IETF" category="std" consensus="true" updates="" obsoletes="3230" tocInclude="true" sortRefs="true" symRefs="true" xml:lang="en" version="3">

  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title>Digest Fields</title>
    <seriesInfo name="RFC" value="9530"/>
    <author initials="R." surname="Polli" fullname="Roberto Polli">
      <organization>Team Digitale, Italian Government</organization>
      <address>
        <postal>
          <country>Italy</country>
        </postal>
        <email>robipolli@gmail.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date month="February" year="2024"/>
    <area>Applications and Real-Time</area>
    <workgroup>HTTP</workgroup>
    <keyword>Digest</keyword>
    <abstract>
<t>This document defines HTTP fields that support integrity digests. The
<tt>Content-Digest</tt> field can be used for the integrity of HTTP message content. The
<tt>Repr-Digest</tt> field can be used for the integrity of HTTP representations.
<tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt> 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 <tt>Digest</tt> and <tt>Want-Digest</tt> HTTP
fields.</t>
    </abstract>
  </front>
  <middle>
<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP does not define the means to protect the data integrity of content or
representations. When HTTP messages are transferred between endpoints, lower-layer
features or properties such as TCP checksums or TLS records <xref target="RFC8446"/> can provide some integrity protection. However, transport-oriented integrity provides a
limited utility because it is opaque to the application layer and only covers
the extent of a single connection. HTTP messages often travel over a chain of
separate connections. In between connections, there is a possibility for
data corruption. An HTTP integrity mechanism can provide
the means for endpoints, or applications using HTTP, to detect data corruption
and make a choice about how to act on it. An example use case is to aid
fault detection and diagnosis across system boundaries.</t>
      <t>This document defines two digest integrity mechanisms for HTTP.
First, content integrity, which acts on conveyed content (<xref section="6.4" sectionFormat="of" target="RFC9110"/>).
Second, representation data integrity, which acts on representation data (<xref section="8.1" sectionFormat="of" target="RFC9110"/>). This supports advanced use cases, such as validating the
integrity of a resource that was reconstructed from parts retrieved using
multiple requests or connections.</t>
      <t>This document obsoletes <xref target="RFC3230"/> and therefore the <tt>Digest</tt> and <tt>Want-Digest</tt> HTTP
fields; see <xref target="obsolete-3230"/>.</t>
      <section anchor="document-structure">
        <name>Document Structure</name>
        <t>This document is structured as follows:</t>
        <ul spacing="normal">
          <li>
            <t>New request and response header and trailer field definitions.
            </t>
            <ul spacing="normal">
              <li>
                <xref target="content-digest"/> (<tt>Content-Digest</tt>),</li>
              <li>
                <xref target="representation-digest"/> (<tt>Repr-Digest</tt>), and</li>
              <li>
                <xref target="want-fields"/> (<tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt>).</li>
            </ul>
          </li>
          <li>
            <t>Considerations specific to representation data integrity.
            </t>
            <ul spacing="normal">
              <li>
                <xref target="state-changing-requests"/> (State-changing requests),</li>
              <li>
                <xref target="digest-and-content-location"/> (Content-Location),</li>
              <li>
                <xref target="resource-representation"/> contains worked examples of representation data
in message exchanges, and</li>
              <li>
                Appendixes <xref target="examples-unsolicited" format="counter"/> and <xref target="examples-solicited" format="counter"/> contain worked examples
of <tt>Repr-Digest</tt> and <tt>Want-Repr-Digest</tt> fields in message exchanges.</li>
            </ul>
          </li>
          <li>
            <xref target="algorithms"/> presents hash algorithm considerations and defines
registration procedures for future entries.</li>
        </ul>
      </section>
      <section anchor="concept-overview">
        <name>Concept Overview</name>
        <t>The HTTP fields defined in this document can be used for HTTP integrity. Senders
choose a hashing algorithm and calculate a digest from an input related to the
HTTP message. The algorithm identifier and digest are transmitted in an HTTP
field. Receivers can validate the digest for integrity purposes. Hashing
algorithms are registered in the "Hash Algorithms for HTTP Digest Fields" registry (see
<xref target="establish-hash-algorithm-registry"/>).</t>
        <t>Selecting the data on which digests are calculated depends on the use case of the
HTTP messages. This document provides different fields for HTTP representation
data and HTTP content.</t>
        <t>There are use cases where a simple digest of the HTTP content bytes is
required. The <tt>Content-Digest</tt> request and response header and trailer field is
defined to support digests of content (<xref section="6.4" sectionFormat="of" target="RFC9110"/>); see
<xref target="content-digest"/>.</t>
        <t>For more advanced use cases, the <tt>Repr-Digest</tt> request and response header
and trailer field (<xref target="representation-digest"/>) is defined. It contains a digest value
computed by applying a hashing algorithm to selected representation data
(<xref section="8.1" sectionFormat="of" target="RFC9110"/>). 

Basing <tt>Repr-Digest</tt> on the selected
representation makes it straightforward to apply it to use cases where the
message content requires some sort of manipulation to be considered as
representation of the resource or the content conveys a partial representation of a resource,
such as range requests (see <xref section="14" sectionFormat="of" target="RFC9110"/>).</t>
<t><tt>Content-Digest</tt> and <tt>Repr-Digest</tt> support hashing algorithm agility.
The <tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt> fields allow
endpoints to express interest in <tt>Content-Digest</tt> and <tt>Repr-Digest</tt>, respectively, and to express algorithm preferences in either.</t>
        <t><tt>Content-Digest</tt> and <tt>Repr-Digest</tt> are collectively termed
"Integrity fields".
<tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt> are
collectively termed "Integrity preference fields".</t>
        <t>Integrity fields are tied to the <tt>Content-Encoding</tt>
and <tt>Content-Type</tt> header fields. Therefore, a given resource may have multiple
different digest values when transferred with HTTP.</t>
        <t>Integrity fields apply to HTTP message content or HTTP representations. They do
not apply to HTTP messages or fields. However, they can be combined with other
mechanisms that protect metadata, such as digital signatures, in order to
protect the phases of an HTTP exchange in whole or in part. For example, HTTP
Message Signatures <xref target="RFC9421"/> could be used to sign Integrity fields, thus
providing coverage for HTTP content or representation data.</t>
        <t>This specification does not define means for authentication, authorization, or privacy.</t>
      </section>
      <section anchor="obsolete-3230">
        <name>Obsoleting RFC 3230</name>
        <t><xref target="RFC3230"/> defined the <tt>Digest</tt> and <tt>Want-Digest</tt> HTTP fields for HTTP integrity.
It also coined the terms "instance" and "instance manipulation" in order to
explain concepts, such as selected representation data (<xref section="8.1"            
sectionFormat="of" target="RFC9110"/>), that are now more universally defined and implemented as HTTP
semantics.</t>
        <t>Experience has shown that implementations of <xref target="RFC3230"/> have interpreted the
meaning of "instance" inconsistently, leading to interoperability issues. The
most common issue relates to the mistake of calculating the digest using (what
we now call) message content, rather than using (what we now call)
representation data as was originally intended. Interestingly, time has also
shown that a digest of message content can be beneficial for some use cases, so
it is difficult to detect if non-conformance to <xref target="RFC3230"/> is intentional or
unintentional.</t>
        <t>In order to address potential inconsistencies and ambiguity across
implementations of <tt>Digest</tt> and <tt>Want-Digest</tt>, this document obsoletes
<xref target="RFC3230"/>. The Integrity fields (Sections <xref format="counter" target="content-digest"/> and
<xref format="counter" target="representation-digest"/>) and Integrity preference fields (<xref target="want-fields"/>)
defined in this document are better aligned with current HTTP semantics and
have names that more clearly articulate the intended usages.</t>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</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&nbsp;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 Augmented BNF defined in <xref target="RFC5234"/> and updated by
<xref target="RFC7405"/>. This includes the rules CR (carriage return), LF (line feed), and CRLF (CR LF).</t>
        <t>This document uses the following terminology from <xref section="3" sectionFormat="of" target="RFC8941"/> to specify syntax and parsing:
Boolean, Byte Sequence, Dictionary, Integer, and List.</t>
        <t>The definitions "representation", "selected representation", "representation
data", "representation metadata", "user agent", and "content" in this document are to be
interpreted as described in <xref target="RFC9110"/>.</t>
        <t>This document uses the line folding strategies
described in <xref target="RFC8792"/>.</t>
        <t>Hashing algorithm names respect the casing used in their definition document (e.g., SHA-1, CRC32c).</t>
        <t>HTTP messages indicate hashing algorithms using an Algorithm Key (<contact fullname="algorithms"/>).
Where the document refers to an Algorithm Key in prose, it is quoted (e.g., "sha", "crc32c").</t>

        <t>The term "checksum" describes the output of applying an algorithm
        to a sequence of bytes, whereas "digest" is only used in relation to
        the value contained in the fields.</t>
<t>"Integrity fields" is the collective term for <tt>Content-Digest</tt> and
<tt>Repr-Digest</tt>.</t>
<t>"Integrity preference fields" is the collective term for <tt>Want-Repr-Digest</tt>
and <tt>Want-Content-Digest</tt>.</t>
      </section>
    </section>
    <section anchor="content-digest">
      <name>The <tt>Content-Digest</tt> Field</name>
      <t>The <tt>Content-Digest</tt> HTTP field can be used in requests and responses to
communicate digests that are calculated using a hashing algorithm applied to
the actual message content (see <xref section="6.4" sectionFormat="of" target="RFC9110"/>). It is a
Dictionary (see <xref section="3.2" sectionFormat="of" target="RFC8941"/>),
where each:</t>
      <ul spacing="normal">
        <li>key conveys the hashing algorithm (see <xref target="algorithms"/>)
used to compute the digest;</li>
        <li>value is a Byte Sequence (<xref section="3.3.5" sectionFormat="of" target="RFC8941"/>) that
conveys an encoded version of the byte output produced by the digest
calculation.</li>
      </ul>
      <t>For example:</t>
      <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Content-Digest: \
  sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\
  yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:
]]></sourcecode>
      <t>The Dictionary type can be used, for example, to attach multiple digests
calculated using different hashing algorithms in order to support a population
of endpoints with different or evolving capabilities. Such an approach could
support transitions away from weaker algorithms (see <xref target="sec-agility"/>).</t>
      <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Content-Digest: \
  sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\
  sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\
  yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:
]]></sourcecode>
      <t>A recipient <bcp14>MAY</bcp14> ignore any or all digests. Application-specific behavior or
local policy <bcp14>MAY</bcp14> set additional constraints on the processing and validation
practices of the conveyed digests.
The security considerations cover some of the issues related to
ignoring digests (see <xref target="sec-agility"/>)
and validating multiple digests (see <xref target="sec-exhaustion"/>).</t>
      <t>A sender <bcp14>MAY</bcp14> send a digest without
knowing whether the recipient supports a given hashing algorithm. A sender <bcp14>MAY</bcp14> send a digest if it knows the recipient will ignore it.</t>
      <t><tt>Content-Digest</tt> can be sent in a trailer section.
In this case,
<tt>Content-Digest</tt> <bcp14>MAY</bcp14> be merged into the header section; see <xref section="6.5.1" sectionFormat="of" target="RFC9110"/>.</t>
    </section>
    <section anchor="representation-digest">
      <name>The <tt>Repr-Digest</tt> Field</name>
      <t>The <tt>Repr-Digest</tt> HTTP field can be used in requests and responses to
communicate digests that are calculated using a hashing algorithm applied to
the entire selected representation data (see <xref section="8.1" sectionFormat="of" target="RFC9110"/>).</t>
      <t>Representations take into account the effect of the HTTP semantics on
messages. For example, the content can be affected by range requests or methods, such as HEAD, while the way the content is transferred "on the wire" is
dependent on other transformations (e.g., transfer codings for HTTP/1.1; see
<xref section="6.1" sectionFormat="of" target="RFC9112"/>). To help illustrate HTTP representation concepts,
several examples are provided in <xref target="resource-representation"/>.</t>
      <t>When a message has no representation data, it is still possible to assert that no
representation data was sent by computing the digest on an empty
string (see <xref target="usage-in-signatures"/>).</t>
      <t><tt>Repr-Digest</tt> is a Dictionary (see <xref section="3.2" sectionFormat="of" target="RFC8941"/>), where each:</t>
      <ul spacing="normal">
        <li>key conveys the hashing algorithm (see <xref target="algorithms"/>)
used to compute the digest;</li>
        <li>value is a Byte Sequence that conveys an encoded version of the byte
output produced by the digest calculation.</li>
      </ul>
      <t>For example:</t>
      <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Repr-Digest: \
  sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\
  yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:
]]></sourcecode>
      <t>The Dictionary type can be used to attach multiple digests
calculated using different hashing algorithms in order to support a population
of endpoints with different or evolving capabilities. Such an approach could
support transitions away from weaker algorithms (see <xref target="sec-agility"/>).</t>
      <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Repr-Digest: \
  sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\
  sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\
  yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:
]]></sourcecode>
      <t>A recipient <bcp14>MAY</bcp14> ignore any or all digests. Application-specific behavior or
local policy <bcp14>MAY</bcp14> set additional constraints on the processing and validation
practices of the conveyed digests.
The security considerations cover some of the issues related to
ignoring digests (see <xref target="sec-agility"/>)
and validating multiple digests (see <xref target="sec-exhaustion"/>).</t>
      <t>A sender <bcp14>MAY</bcp14> send a digest without knowing whether the recipient supports a given hashing algorithm. A sender <bcp14>MAY</bcp14> send a digest if it knows the recipient will ignore it.</t>
      <t><tt>Repr-Digest</tt> can be sent in a trailer section.
In this case,
<tt>Repr-Digest</tt> <bcp14>MAY</bcp14> be merged into the header section; see <xref section="6.5.1" sectionFormat="of" target="RFC9110"/>.</t>
      <section anchor="state-changing-requests">
        <name>Using <tt>Repr-Digest</tt> in State-Changing Requests</name>
        <t>When the representation enclosed in a state-changing request
does not describe the target resource,
the representation digest <bcp14>MUST</bcp14> be computed on the
representation data.
This is the only possible choice because representation digest requires complete
representation metadata (see <xref target="representation-digest"/>).</t>
        <t>In responses,</t>
        <ul spacing="normal">
          <li>if the representation describes the status of the request,
<tt>Repr-Digest</tt> <bcp14>MUST</bcp14> be computed on the enclosed representation
 (see <xref target="post-referencing-status"/>);</li>
          <li>if there is a referenced resource, <tt>Repr-Digest</tt>
          <bcp14>MUST</bcp14> be computed on the selected representation of
          the referenced resource even if that is different from the target
          resource.  This might or might not result in computing
          <tt>Repr-Digest</tt> on the enclosed representation.</li>
        </ul>
        <t>The latter case is done according to the HTTP semantics of the given
method, for example, using the <tt>Content-Location</tt> header field (see <xref section="8.7" sectionFormat="of" target="RFC9110"/>).
In contrast, the <tt>Location</tt> header field does not affect <tt>Repr-Digest</tt> because
it is not representation metadata.</t>
        <t>For example, in PATCH requests, the representation digest
will be computed on the patch document
because the representation metadata refers to the patch document and not
the target resource (see <xref section="2" sectionFormat="of" target="RFC5789"/>).
In responses, instead, the representation digest will be computed on the selected
representation of the patched resource.</t>
      </section>
      <section anchor="digest-and-content-location">
        <name><tt>Repr-Digest</tt> and Content-Location in Responses</name>
        <t>When a state-changing method returns the <tt>Content-Location</tt> header field, the
enclosed representation refers to the resource identified by its value and
<tt>Repr-Digest</tt> is computed accordingly.
An example is given in <xref target="post-not-request-uri"/>.</t>
      </section>
    </section>
    <section anchor="want-fields">
      <name>Integrity Preference Fields</name>
      <t>Senders can indicate their interest in Integrity fields and hashing algorithm
preferences using the
<tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt> HTTP fields. These can be used in both
requests and responses.</t>

<t><tt>Want-Content-Digest</tt> indicates that the sender would like to
receive (via the <tt>Content-Digest</tt> field) a content digest on messages
associated with the request URI and representation metadata.

   <tt>Want-Repr-Digest</tt> indicates that the sender would like to receive
   (via the <tt>Repr-Digest</tt> field) a representation digest on messages
   associated with the request URI and representation metadata.
</t>

      <t>If <tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt> are used in a response, it
indicates that the server would like the client to provide the respective
Integrity field on future requests.</t>
      <t>Integrity preference fields are only a hint. The receiver of the field can
ignore it and send an Integrity field using any algorithm or omit the field
entirely; for example, see <xref target="ex-server-selects-unsupported-algorithm"/>. It is not
a protocol error if preferences are ignored. Applications that use Integrity
fields and Integrity preferences can define expectations or constraints that
operate in addition to this specification. Ignored preferences are an
application-specific concern.</t>
      <t><tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt> are of type Dictionary
where each:</t>
      <ul spacing="normal">
        <li>key conveys the hashing algorithm (see <xref target="algorithms"/>);</li>
        <li>value is an <tt>Integer</tt> (<xref section="3.3.1" sectionFormat="of" target="RFC8941"/>)
that conveys an ascending, relative, weighted preference.
It must be in the range 0 to 10 inclusive.
1 is the least preferred, 10 is the most preferred,
and a value of 0 means "not acceptable".</li>
      </ul>
      <t>Examples:</t>
      <sourcecode type="http-message"><![CDATA[
Want-Repr-Digest: sha-256=1
Want-Repr-Digest: sha-512=3, sha-256=10, unixsum=0
Want-Content-Digest: sha-256=1
Want-Content-Digest: sha-512=3, sha-256=10, unixsum=0
]]></sourcecode>
    </section>
    <section anchor="algorithms">
      <name>Hash Algorithm Considerations and Registration</name>
      <t>There are a wide variety of hashing algorithms that can be used for the purposes
of integrity. The choice of algorithm depends on several factors such as the
integrity use case, implementation needs or constraints, or application design
and workflows.</t>
      <t>An initial set of algorithms will be registered with IANA in the "Hash
Algorithms for HTTP Digest Fields" registry; see
<xref target="establish-hash-algorithm-registry"/>. Additional algorithms can be registered
in accordance with the policies set out in this section.</t>
      <t>Each algorithm has a status field that is intended to provide an aid to
implementation selection.</t>
      <t>Algorithms with a status value of "Active" are suitable for many purposes and
it is <bcp14>RECOMMENDED</bcp14> that applications use these algorithms. These can be used in
adversarial situations where hash functions might need to provide resistance to
collision, first-preimage, and second-preimage attacks. 

   For adversarial situations, selection of the acceptable "Active" algorithms
   will depend on the level of protection the circumstances demand. More
   considerations are presented in <xref target="sec-agility"/>.</t>
      <t>Algorithms with a status value of "Deprecated" either provide none of these
properties or are known to be weak (see <xref target="RFC6151"/> and <xref target="RFC6194"/>). These
algorithms <bcp14>MAY</bcp14> be used to preserve integrity against corruption, but <bcp14>MUST NOT</bcp14> be
used in a potentially adversarial setting, for example, when signing Integrity
fields' values for authenticity. 

   Permitting the use of these algorithms can help some applications (such as
   those that previously used <xref target="RFC3230"/>, are migrating to this specification
   (<xref target="migrating"/>), and have existing stored collections of computed digest
   values) avoid undue operational overhead caused by recomputation using
   other more-secure algorithms.

Such applications are not
exempt from the requirements in this section. Furthermore, applications without
such legacy or history ought to follow the guidance for using algorithms with
the status value "Active".</t>
      <t>Discussion of algorithm agility is presented in <xref target="sec-agility"/>.</t>
      <t>Registration requests for the "Hash Algorithms for HTTP Digest Fields" registry
use the Specification Required policy (<xref section="4.6" sectionFormat="of" target="RFC8126"/>). Requests
should use the following template:</t>
<dl>
        <dt>Algorithm Key:</dt><dd>The Structured Fields key value used in
<tt>Content-Digest</tt>, <tt>Repr-Digest</tt>, <tt>Want-Content-Digest</tt>, or <tt>Want-Repr-Digest</tt>
 field Dictionary member keys.</dd>
        <dt>Status:</dt><dd>The status of the algorithm. The options are:</dd>
	<dt></dt><dd>
<dl spacing="normal">	    
            <dt>"Active":</dt><dd>Algorithms without known problems</dd>
            <dt>"Provisional":</dt><dd>Unproven algorithms</dd>
            <dt>"Deprecated":</dt><dd>Deprecated or insecure algorithms</dd>
          </dl>
	</dd>
        <dt>Description:</dt><dd>A short description of the algorithm.</dd>
        <dt>Reference(s):</dt><dd>Pointer(s) to the primary document(s) defining the Algorithm
Key and technical details of the algorithm.</dd>
      </dl>
      <t>When reviewing registration requests, the designated expert(s) should pay
attention to the requested status. The status value should reflect
standardization status and the broad opinion of relevant interest groups such as
the IETF or security-related Standards Development Organizations (SDOs). The "Active" status is not suitable for an
algorithm that is known to be weak, broken, or experimental. If a registration
request attempts to register such an algorithm as "Active", the designated
expert(s) should suggest an alternative status of "Deprecated" or "Provisional".</t>
      <t>When reviewing registration requests, the designated expert(s) cannot use a
status of "Deprecated" or "Provisional" as grounds for rejection.</t>
      <t>Requests to update or change the fields in an existing registration are
permitted. For example, this could allow for the transition of an algorithm
status from "Active" to "Deprecated" as the security environment evolves.</t>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <section anchor="sec-limitations">
        <name>HTTP Messages Are Not Protected in Full</name>
        <t>This document specifies a data integrity mechanism that protects HTTP
representation data or content, but not HTTP header and trailer fields, from
certain kinds of corruption.</t>
        <t>Integrity fields are not intended to be a general protection against malicious tampering with
HTTP messages.
In the absence of additional
  security mechanisms, an on-path malicious actor can either remove
  a digest value entirely or substitute it with a new digest value computed over
  manipulated representation data or content.
This attack can be mitigated by combining mechanisms described in this
document with other approaches such
as Transport Layer Security (TLS) or digital signatures (for example, HTTP Message
Signatures <xref target="RFC9421"/>).</t>
      </section>
      <section anchor="end-to-end-integrity">
        <name>End-to-End Integrity</name>
        <t>Integrity fields can help detect representation data or content modification due to implementation errors,
undesired "transforming proxies" (see <xref section="7.7" sectionFormat="of" target="RFC9110"/>),
or other actions as the data passes across multiple hops or system boundaries.
Even a simple mechanism for end-to-end representation data integrity is valuable
because a user agent can validate that resource retrieval succeeded before handing off to an
HTML parser, video player, etc., for parsing.</t>
        <t>Note that using these mechanisms alone does not provide end-to-end integrity of HTTP messages over
multiple hops since metadata could be manipulated at any stage. Methods to protect
metadata are discussed in <xref target="usage-in-signatures"/>.</t>
      </section>
      <section anchor="usage-in-signatures">
        <name>Usage in Signatures</name>
        <t>Digital signatures are widely used together with checksums to provide the
certain identification of the origin of a message <xref target="FIPS186-5"/>. Such signatures
can protect one or more HTTP fields and there are additional considerations when
Integrity fields are included in this set.</t>
        <t>There are no restrictions placed on the type or format of digital signature that
Integrity fields can be used with. One possible approach is to combine them with
HTTP Message Signatures <xref target="RFC9421"/>.</t>
        <t>Digests explicitly
depend on the "representation metadata" (e.g., the values of <tt>Content-Type</tt>,
<tt>Content-Encoding</tt>, etc.). A signature that protects Integrity fields but not other
"representation metadata" can expose the communication to tampering. For
example, an actor could manipulate the <tt>Content-Type</tt> field-value and cause a
digest validation failure at the recipient, preventing the application from
accessing the representation. Such an attack consumes the resources of both
endpoints. See also <xref target="digest-and-content-location"/>.</t>

        <t>Signatures are likely to be deemed an adversarial setting when applying
Integrity fields; see <xref target="algorithms"/>. <tt>Repr-Digest</tt> offers an interesting
possibility when combined with signatures. In the scenario where there is no
content to send, the digest of an empty string can be included in the message
and, if signed, can help the recipient detect if content was added either as a result of accident or purposeful manipulation. The opposite scenario is also
supported; including an Integrity field for content and signing it can help a
recipient detect where the content was removed.</t>
<t>Any mangling of Integrity fields might affect signature validation. Examples of such mangling include de-duplicating digests or combining different field values (see <xref section="5.2" sectionFormat="of" target="RFC9110"/>).</t>
      </section>
      <section anchor="usage-in-trailer-fields">
        <name>Usage in Trailer Fields</name>
        <t>Before sending Integrity fields in a trailer section, the sender
should consider that intermediaries are explicitly allowed to drop any trailer
(see <xref section="6.5.2" sectionFormat="of" target="RFC9110"/>).</t>
        <t>When Integrity fields are used in a trailer section, the field-values are received after the content.
Eager processing of content before the trailer section prevents digest validation, possibly leading to
processing of invalid data.</t>
        <t>One of the benefits of using Integrity fields in a trailer section is that it
allows hashing of bytes as they are sent. However, it is possible to
design a hashing algorithm that requires processing of content in such a way
that would negate these benefits. For example, Merkle Integrity Content Encoding
<xref target="I-D.thomson-http-mice"/> requires content to be processed in reverse order.
This means the complete data needs to be available, which means there is
negligible processing difference in sending an Integrity field in a header versus
a trailer section.</t>
      </section>
      <section anchor="variations-within-content-encoding">
       <name>Variations within Content-Encoding</name>
        <t>Content coding mechanisms can support different encoding parameters, meaning that the same input content can produce different outputs. For example, GZIP supports multiple compression levels. Such encoding parameters are generally not communicated as representation metadata. For instance, different compression levels would all use the same "Content-Encoding: gzip" field. Other examples include where encoding relies on nonces or timestamps, such as the aes128gcm content coding defined in <xref target="RFC8188"/>.</t>
        <t>Since it is possible for there to be variation within content coding, the checksum conveyed by the Integrity fields cannot be used to provide a proof of integrity "at rest"
unless the whole content is persisted.</t>
      </section>
      <section anchor="sec-agility">
        <name>Algorithm Agility</name>
        <t>The security properties of hashing algorithms are not fixed.
Algorithm agility (see <xref target="RFC7696"/>) is achieved by providing implementations with flexibility
to choose hashing algorithms from the IANA Hash Algorithms for HTTP Digest Fields registry; see
<xref target="establish-hash-algorithm-registry"/>.</t>
        <t>Transition from weak algorithms is supported
by negotiation of hashing algorithm using <tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt> (see <xref target="want-fields"/>)
or by sending multiple digests from which the receiver chooses.
A receiver that depends on a digest for security will be vulnerable
to attacks on the weakest algorithm it is willing to accept.
Endpoints are advised that sending multiple values consumes resources that may be wasted if the receiver ignores them (see <xref target="representation-digest"/>).</t>
        <t>While algorithm agility allows the migration to stronger algorithms,
it does not prevent the use of weaker algorithms.
Integrity fields do not provide any mitigations for downgrade or substitution
attacks (see <xref target="RFC6211" sectionFormat="of" section="1"/>) of the hashing algorithm.
To protect against such attacks, endpoints could restrict their set of supported algorithms
to stronger ones and protect the fields' values by using TLS and/or digital signatures.</t>
      </section>
      <section anchor="sec-exhaustion">
        <name>Resource Exhaustion</name>
        <t>Integrity field validation consumes computational resources.
In order to avoid resource exhaustion, implementations can restrict
validation of the algorithm types, the number of validations, or the size of content.
In these cases, skipping validation entirely or ignoring validation failure of a more-preferred algorithm
leaves the possibility of a downgrade attack (see <xref target="sec-agility"/>).</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-field-name-registration">
        <name>HTTP Field Name Registration</name>
        <t>IANA has updated the
"Hypertext Transfer Protocol (HTTP) Field Name Registry" 
<xref target="RFC9110"/> as shown in the table below:</t>
        <table>
	  <name>Hypertext Transfer Protocol (HTTP) Field
   Name Registry Update</name>
          <thead>
            <tr>
              <th align="left">Field Name</th>
              <th align="left">Status</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left"><tt>Content-Digest</tt></td>
              <td align="left">permanent</td>
              <td align="left">
                <xref target="content-digest"/> of RFC 9530</td>
            </tr>
            <tr>
              <td align="left"><tt>Repr-Digest</tt></td>
              <td align="left">permanent</td>
              <td align="left">
                <xref target="representation-digest"/> of RFC 9530</td>
            </tr>
            <tr>
              <td align="left"><tt>Want-Content-Digest</tt></td>
              <td align="left">permanent</td>
              <td align="left">
                <xref target="want-fields"/> of RFC 9530</td>
            </tr>
            <tr>
              <td align="left"><tt>Want-Repr-Digest</tt></td>
              <td align="left">permanent</td>
              <td align="left">
                <xref target="want-fields"/> of RFC 9530</td>
            </tr>
            <tr>
              <td align="left"><tt>Digest</tt></td>
              <td align="left">obsoleted</td>
              <td align="left">
                <xref target="RFC3230"/>, <xref target="obsolete-3230"/> of RFC 9530</td>
            </tr>
            <tr>
              <td align="left"><tt>Want-Digest</tt></td>
              <td align="left">obsoleted</td>
              <td align="left">
                <xref target="RFC3230"/>, <xref target="obsolete-3230"/> of RFC 9530</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="establish-hash-algorithm-registry">
        <name>Creation of the Hash Algorithms for HTTP Digest Fields Registry</name>
        <t>IANA has created the new "Hash Algorithms for HTTP Digest Fields"
registry at <eref brackets="angle" target="https://www.iana.org/assignments/http-digest-hash-alg/"/> and
populated it with the entries in <xref target="iana-hash-algorithm-table"/>. The procedure for
new registrations is provided in <xref target="algorithms"/>.</t>
        <table anchor="iana-hash-algorithm-table">
          <name>Initial Hash Algorithms</name>
          <thead>
            <tr>
              <th align="left">Algorithm Key</th>
              <th align="left">Status</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">sha-512</td>
              <td align="left">Active</td>
              <td align="left">The SHA-512 algorithm.</td>
              <td align="left">
                <xref target="RFC6234"/>, <xref target="RFC4648"/>, RFC 9530</td>
            </tr>
            <tr>
              <td align="left">sha-256</td>
              <td align="left">Active</td>
              <td align="left">The SHA-256 algorithm.</td>
              <td align="left">
                <xref target="RFC6234"/>, <xref target="RFC4648"/>, RFC 9530</td>
            </tr>
            <tr>
              <td align="left">md5</td>
              <td align="left">Deprecated</td>
              <td align="left">The MD5 algorithm. It is vulnerable to collision attacks; see <xref target="RFC6151"/> and <xref target="CMU-836068"/></td>
              <td align="left">
                <xref target="RFC1321"/>, <xref target="RFC4648"/>, RFC 9530</td>
            </tr>
            <tr>
              <td align="left">sha</td>
              <td align="left">Deprecated</td>
              <td align="left">The SHA-1 algorithm. It is vulnerable to collision attacks; see <xref target="RFC6194"/> and <xref target="IACR-2020-014"/></td>
              <td align="left">
                <xref target="RFC3174"/>, <xref target="RFC4648"/>, <xref target="RFC6234"/>, RFC 9530</td>
            </tr>
            <tr>
              <td align="left">unixsum</td>
              <td align="left">Deprecated</td>
              <td align="left">The algorithm used by the UNIX "sum" command.</td>
              <td align="left">
                <xref target="RFC4648"/>, <xref target="RFC6234"/>, <xref target="UNIX"/>, RFC&nbsp;9530</td>
            </tr>
            <tr>
              <td align="left">unixcksum</td>
              <td align="left">Deprecated</td>
              <td align="left">The algorithm used by the UNIX "cksum" command.</td>
              <td align="left">
                <xref target="RFC4648"/>, <xref target="RFC6234"/>, <xref target="UNIX"/>, RFC&nbsp;9530</td>
            </tr>
            <tr>
              <td align="left">adler</td>
              <td align="left">Deprecated</td>
              <td align="left">The ADLER32 algorithm.</td>
              <td align="left">
                <xref target="RFC1950"/>, RFC 9530</td>
            </tr>
            <tr>
              <td align="left">crc32c</td>
              <td align="left">Deprecated</td>
              <td align="left">The CRC32c algorithm.</td>
              <td align="left"><xref target="RFC9260" sectionFormat="of" section="A"/>, RFC 9530</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="deprecate-the-hypertext-transfer-protocol-http-digest-algorithm-values-registry">
        <name>Deprecate the Hypertext Transfer Protocol (HTTP) Digest Algorithm Values Registry</name>
        <t>IANA has deprecated the "Hypertext Transfer Protocol (HTTP) Digest
Algorithm Values" registry at
<eref brackets="angle" target="https://www.iana.org/assignments/http-dig-alg/"/> and replaced the note on that registry with the following text:</t>
            <blockquote>This registry is deprecated since it lists the algorithms that can be used
with the <tt>Digest</tt> and <tt>Want-Digest</tt> fields defined in <xref target="RFC3230"/>, which has been obsoleted by
RFC 9530. While registration is not closed, new registrations
are encouraged to use the <eref target="https://www.iana.org/assignments/http-digest-hash-alg/">Hash Algorithms for HTTP Digest                                                   
Fields</eref> registry instead.</blockquote>
      </section>
    </section>
  </middle>
  <back>

    <displayreference target="RFC9110" to="HTTP"/>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <displayreference target="RFC8792" to="FOLDING"/>
    <displayreference target="RFC8941" to="STRUCTURED-FIELDS"/>
    <displayreference target="RFC5789" to="PATCH"/>
    <displayreference target="RFC6151" to="NO-MD5"/>
    <displayreference target="RFC6194" to="NO-SHA"/>
    <displayreference target="RFC9421" to="SIGNATURES"/>
    <displayreference target="RFC8446" to="TLS"/>
    <displayreference target="I-D.thomson-http-mice" to="MICE"/>
    
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>

<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1321.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3174.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1950.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7405.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8792.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8941.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/>

      </references>
      <references>

        <name>Informative References</name>

<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3230.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9112.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5789.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6151.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6194.xml"/>

<!-- I-D.ietf-httpbis-message-signatures is now RFC 9421 -->
 <reference anchor="RFC9421" target="https://www.rfc-editor.org/info/rfc9421">
<front>
<title>HTTP Message Signatures</title>
<author initials="A." surname="Backman" fullname="Annabelle Backman" role="editor">
<organization>Amazon</organization>
</author>
<author initials="J." surname="Richer" fullname="Justin Richer" role="editor">
<organization>Bespoke Engineering</organization>
</author>
<author initials="M." surname="Sporny" fullname="Manu Sporny">
<organization>Digital Bazaar</organization>
</author>
<date month='February' year='2024'/>
</front>
<seriesInfo name="RFC" value="9421"/>
<seriesInfo name="DOI" value="10.17487/RFC9421"/>
</reference>

        <reference anchor="UNIX">
          <front>
            <title>The Single UNIX Specification, Version 2 - 6 Vol Set for UNIX 98</title>
            <author>
              <organization>The Open Group</organization>
            </author>
            <date year="1998" month="January"/>
          </front>
        </reference>
	
        <reference anchor="FIPS186-5" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf">
          <front>
            <title>Digital Signature Standard (DSS)</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2023" month="February"/>
          </front>
	  <seriesInfo name="FIPS PUB" value="186-5"/>
	  <seriesInfo name="DOI" value="10.6028/NIST.FIPS.186-5"/>
        </reference>

        <reference anchor="CMU-836068" target="https://www.kb.cert.org/vuls/id/836068/">
          <front>
            <title>MD5 vulnerable to collision attacks</title>
            <author>
              <organization>Carnegie Mellon University, Software Engineering Institute</organization>
            </author>
            <date year="2008" month="December"/>
          </front>
        </reference>

        <reference anchor="IACR-2020-014" target="https://eprint.iacr.org/2020/014.pdf">
          <front>
            <title>SHA-1 is a Shambles</title>
            <author initials="G." surname="Leurent">
            </author>
            <author initials="T." surname="Peyrin">
            </author>
            <date year="2020" month="January"/>
          </front>
        </reference>

<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml"/>

<!-- [I-D.thomson-http-mice] IESG state	Expired -->

<xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D.thomson-http-mice.xml"/>

<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8188.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7696.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6211.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9260.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7396.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml"/>

       </references>
      </references>
    <?line 722?>

<section anchor="resource-representation">
      <name>Resource Representation and Representation Data</name>
      <t>The following examples show how representation metadata, content
transformations, and methods impact the message and content. These examples a
not exhaustive.</t>
      <t>Unless otherwise indicated, the examples are based on the JSON object <tt>{"hello":
"world"}</tt> followed by an LF. When the content contains non-printable characters
(e.g., when it is encoded), it is shown as a sequence of hex-encoded bytes.</t>
      <t>Consider a client that wishes to upload a JSON object using the PUT method. 

It
could do this using the application/json <tt>Content-Type</tt> without any content
coding.</t>
      <figure>
        <name>Request Containing a JSON Object without Any Content Coding</name>
        <sourcecode type="http-message"><![CDATA[
PUT /entries/1234 HTTP/1.1
Host: foo.example
Content-Type: application/json
Content-Length: 19

{"hello": "world"}
]]></sourcecode>
      </figure>
      <t>However, the use of content coding is quite common. The client could also upload
the same data with a GZIP coding (<xref section="8.4.1.3" sectionFormat="of" target="RFC9110"/>). Note that in
this case, the <tt>Content-Length</tt> contains a larger value due to the coding
overheads.</t>
      <figure anchor="ex-put-gz">
        <name>Request Containing a GZIP-Encoded JSON Object</name>
        <sourcecode type="http-message"><![CDATA[
PUT /entries/1234 HTTP/1.1
Host: foo.example
Content-Type: application/json
Content-Encoding: gzip
Content-Length: 39

1F 8B 08 00 88 41 37 64 00 FF
AB 56 CA 48 CD C9 C9 57 B2 52
50 2A CF 2F CA 49 51 AA E5 02
00 D9 E4 31 E7 13 00 00 00
]]></sourcecode>
      </figure>
      <t>Sending the GZIP-coded data without indicating it via <tt>Content-Encoding</tt> means
that the content is malformed. In this case, the server can reply with an error.</t>
      <figure>
        <name>Request Containing Malformed JSON</name>
        <sourcecode type="http-message"><![CDATA[
PUT /entries/1234 HTTP/1.1
Host: foo.example
Content-Type: application/json

Content-Length: 39

1F 8B 08 00 88 41 37 64 00 FF
AB 56 CA 48 CD C9 C9 57 B2 52
50 2A CF 2F CA 49 51 AA E5 02
00 D9 E4 31 E7 13 00 00 00
]]></sourcecode>
      </figure>
      <figure>
        <name>An Error Response for Malformed Content</name>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 400 Bad Request
]]></sourcecode>
      </figure>
      <t>A Range-Request affects the transferred message content. In this example, the
client is accessing the resource at <tt>/entries/1234</tt>, which is the JSON object
<tt>{"hello": "world"}</tt> followed by an LF. However, the client has indicated a
preferred content coding and a specific byte range.</t>
      <figure>
        <name>Request for Partial Content</name>
        <sourcecode type="http-message"><![CDATA[
GET /entries/1234 HTTP/1.1
Host: foo.example
Accept-Encoding: gzip
Range: bytes=1-7
]]></sourcecode>
      </figure>

      <t>The server satisfies the client request by responding with a partial
representation (equivalent to the first 10 bytes of the JSON object displayed in whole
in <xref target="ex-put-gz"/>).</t>
      <figure>
        <name>Partial Response from a GZIP-Encoded Representation</name>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 206 Partial Content
Content-Encoding: gzip
Content-Type: application/json
Content-Range: bytes 0-9/39

1F 8B 08 00 A5 B4 BD 62 02 FF
]]></sourcecode>
      </figure>
      <t>Aside from content coding or range requests, the method can also affect the
transferred message content. For example, the response to a HEAD request does
not carry content, but this example case includes <tt>Content-Length</tt>; see
<xref section="8.6" sectionFormat="of" target="RFC9110"/>.</t>
      <figure>
        <name>HEAD Request</name>
        <sourcecode type="http-message"><![CDATA[
HEAD /entries/1234 HTTP/1.1
Host: foo.example
Accept: application/json
Accept-Encoding: gzip
]]></sourcecode>
      </figure>
      <figure>
        <name>Response to HEAD Request (Empty Content)</name>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: gzip
Content-Length: 39
]]></sourcecode>
      </figure>
      <t>Finally, the semantics of a response might decouple the target URI
from the enclosed representation. In the example below, the client issues a POST
request directed to <tt>/authors/</tt>, but the response includes a <tt>Content-Location</tt>
header field indicating that the enclosed representation refers to the
resource available at <tt>/authors/123</tt>. Note that <tt>Content-Length</tt> is not sent
in this example.</t>
      <figure>
        <name>POST Request</name>
        <sourcecode type="http-message"><![CDATA[
POST /authors/ HTTP/1.1
Host: foo.example
Accept: application/json
Content-Type: application/json

{"author": "Camilleri"}
]]></sourcecode>
      </figure>
      <figure>
        <name>Response with Content-Location Header</name>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 201 Created
Content-Type: application/json
Content-Location: /authors/123
Location: /authors/123

{"id": "123", "author": "Camilleri"}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="examples-unsolicited">
      <name>Examples of Unsolicited <tt>Digest</tt></name>
      <t>The following examples demonstrate interactions where a server responds with a
<tt>Content-Digest</tt> or <tt>Repr-Digest</tt> field, even though the client did not solicit one using
<tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt>.</t>
      <t>Some examples include JSON objects in the content.
For presentation purposes, objects that fit completely within the line-length limits
are presented on a single line using compact notation with no leading space.
Objects that would exceed line-length limits are presented across multiple lines
(one line per key-value pair) with two spaces of leading indentation.</t>
      <t>Checksum mechanisms defined in this document are media-type agnostic
and do not provide canonicalization algorithms for specific formats.
Examples are calculated inclusive of any space.
While examples can include both fields,
<tt>Content-Digest</tt> and <tt>Repr-Digest</tt> can be returned independently.</t>
      <section anchor="example-full-representation">
        <name>Server Returns Full Representation Data</name>
        <t>In this example, the message content conveys complete representation data.
This means that in the response, <tt>Content-Digest</tt> and <tt>Repr-Digest</tt>
are both computed over the JSON object <tt>{"hello": "world"}</tt> followed by an LF; thus, they have the same value.</t>
        <figure>
          <name>GET Request for an Item</name>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: foo.example
]]></sourcecode>
        </figure>
        <figure>
          <name>Response with Identical <tt>Repr-Digest</tt> and <tt>Content-Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 19
Content-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
Repr-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:

{"hello": "world"}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="server-returns-no-representation-data">
        <name>Server Returns No Representation Data</name>
        <t>In this example, a HEAD request is used to retrieve the checksum
of a resource.</t>
        <t>The response <tt>Content-Digest</tt> field-value is computed on empty content.
<tt>Repr-Digest</tt> is calculated over the JSON object
<tt>{"hello": "world"}</tt> followed by an LF, which is not shown because there is no content.</t>
        <figure>
          <name>HEAD Request for an Item</name>
          <sourcecode type="http-message"><![CDATA[
HEAD /items/123 HTTP/1.1
Host: foo.example
]]></sourcecode>
        </figure>
        <figure>
          <name>Response with Both <tt>Content-Digest</tt> and <tt>Digest</tt> (Empty Content)</name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 200 OK
Content-Type: application/json
Content-Digest: \
  sha-256=:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=:
Repr-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
]]></sourcecode>
        </figure>
      </section>
      <section anchor="server-returns-partial-representation-data">
        <name>Server Returns Partial Representation Data</name>
        <t>In this example, the client makes a range request and the server responds with
partial content.</t>
        <figure>
          <name>Request for Partial Content</name>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: foo.example
Range: bytes=10-18
]]></sourcecode>
        </figure>
        <figure>
          <name>Partial Response with Both <tt>Content-Digest</tt> and <tt>Repr-Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 206 Partial Content
Content-Type: application/json
Content-Range: bytes 10-18/19
Content-Digest: \
  sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=:
Repr-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:

"world"}
]]></sourcecode>
        </figure>
        <t>In the response message above, note that the
<tt>Repr-Digest</tt> and <tt>Content-Digests</tt> are different.
The <tt>Repr-Digest</tt> field-value is calculated across the entire JSON object
<tt>{"hello": "world"}</tt> followed by an LF, and the field appears as follows:</t>
        <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Repr-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:
]]></sourcecode>
        <t>However, since the message content is constrained to bytes 10-18,
the <tt>Content-Digest</tt> field-value is calculated over the
sequence  <tt>"world"}</tt> followed by an LF, thus resulting in the following:</t>
        <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Content-Digest: \
  sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=:
]]></sourcecode>
      </section>
      <section anchor="client-and-server-provide-full-representation-data">
        <name>Client and Server Provide Full Representation Data</name>
        <t>The request contains a <tt>Repr-Digest</tt> field-value calculated on the enclosed
representation. It also includes an <tt>Accept-Encoding: br</tt> header field that advertises that the
client supports Brotli encoding.</t>
        <t>The response includes a <tt>Content-Encoding: br</tt> that indicates the selected
representation is Brotli-encoded. The <tt>Repr-Digest</tt> field-value is therefore
different compared to the request.</t>
        <t>For presentation purposes, the response body is displayed as a sequence of
hex-encoded bytes because it contains non-printable characters.</t>
        <figure>
          <name>PUT Request with <tt>Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

PUT /items/123 HTTP/1.1
Host: foo.example
Content-Type: application/json
Accept-Encoding: br
Repr-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=:

{"hello": "world"}
]]></sourcecode>
        </figure>
        <figure>
          <name>Response with <tt>Digest</tt> of Encoded Response</name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 200 OK
Content-Type: application/json
Content-Location: /items/123
Content-Encoding: br
Content-Length: 23
Repr-Digest: \
  sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:

8B 08 80 7B 22 68 65 6C 6C 6F
22 3A 20 22 77 6F 72 6C 64 22
7D 0A 03
]]></sourcecode>
        </figure>
      </section>
      <section anchor="client-provides-full-representation-data-server-provides-no-representation-data">
        <name>Client Provides Full Representation Data and Server Provides No Representation Data</name>
        <t>The request <tt>Repr-Digest</tt> field-value is calculated on the enclosed content, which
is the JSON object <tt>{"hello": "world"}</tt> followed by an LF.</t>
        <t>The response <tt>Repr-Digest</tt> field-value
depends on the representation metadata header fields, including
<tt>Content-Encoding: br</tt>, even when the response does not contain content.</t>
        <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

PUT /items/123 HTTP/1.1
Host: foo.example
Content-Type: application/json
Content-Length: 19
Accept-Encoding: br
Repr-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:

{"hello": "world"}
]]></sourcecode>
        <figure>
          <name>Empty Response with <tt>Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
Content-Type: application/json
Content-Encoding: br
Repr-Digest: sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:
]]></sourcecode>
        </figure>
      </section>
      <section anchor="client-and-server-provide-full-representation-data-1">
        <name>Client and Server Provide Full Representation Data</name>
        <t>The response contains two digest values using different algorithms.</t>
        <t>For presentation purposes, the response body is displayed as a sequence of
hex-encoded bytes because it contains non-printable characters.</t>
        <figure>
          <name>PUT Request with <tt>Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

PUT /items/123 HTTP/1.1
Host: foo.example
Content-Type: application/json
Accept-Encoding: br
Repr-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:

{"hello": "world"}
]]></sourcecode>
        </figure>
        <figure>
          <name>Response with <tt>Digest</tt> of Encoded Content</name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: br
Content-Location: /items/123
Repr-Digest: \
  sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\
  sha-512=:db7fdBbgZMgX1Wb2MjA8zZj+rSNgfmDCEEXM8qLWfpfoNY0sCpHAzZbj\
  09X1/7HAb7Od5Qfto4QpuBsFbUO3dQ==:

8B 08 80 7B 22 68 65 6C 6C 6F
22 3A 20 22 77 6F 72 6C 64 22
7D 0A 03
]]></sourcecode>
        </figure>
      </section>
      <section anchor="post-not-request-uri">
        <name>POST Response Does Not Reference the Request URI</name>
        <t>The request <tt>Repr-Digest</tt> field-value is computed on the enclosed representation
(see <xref target="state-changing-requests"/>), which is the JSON object <tt>{"title": "New
Title"}</tt> followed by an LF.</t>
        <t>The representation enclosed in the response is a multiline JSON object followed by an LF.
It refers to the resource identified by
<tt>Content-Location</tt> (see <xref section="6.4.2" sectionFormat="of" target="RFC9110"/>);
thus, an application can use <tt>Repr-Digest</tt> in association with the resource
referenced by <tt>Content-Location</tt>.</t>
        <figure>
          <name>POST Request with <tt>Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
POST /books HTTP/1.1
Host: foo.example
Content-Type: application/json
Accept: application/json
Accept-Encoding: identity
Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=:

{"title": "New Title"}
]]></sourcecode>
        </figure>
        <figure>
          <name>Response with <tt>Digest</tt> of Resource</name>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 201 Created
Content-Type: application/json
Content-Location: /books/123
Location: /books/123
Repr-Digest: sha-256=:uVSlinTTdQUwm2On4k8TJUikGN1bf/Ds8WPX4oe0h9I=:

{
  "id": "123",
  "title": "New Title"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="post-referencing-status">
        <name>POST Response Describes the Request Status</name>
        <t>The request <tt>Repr-Digest</tt> field-value is computed on the enclosed representation (see
<xref target="state-changing-requests"/>), which is the JSON object <tt>{"title": "New
Title"}</tt> followed by an LF.</t>
        <t>The representation enclosed in the response describes the status of the request,
so <tt>Repr-Digest</tt> is computed on that enclosed representation. It is a multiline
JSON object followed by an LF.</t>
        <t>Response <tt>Repr-Digest</tt> has no explicit relation with the resource referenced by
<tt>Location</tt>.</t>
        <figure>
          <name>POST Request with <tt>Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
POST /books HTTP/1.1
Host: foo.example
Content-Type: application/json
Accept: application/json
Accept-Encoding: identity
Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=:

{"title": "New Title"}
]]></sourcecode>
        </figure>
        <figure>
          <name>Response with <tt>Digest</tt> of Representation</name>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 201 Created
Content-Type: application/json
Repr-Digest: sha-256=:yXIGDTN5VrfoyisKlXgRKUHHMs35SNtyC3szSz1dbO8=:
Location: /books/123

{
  "status": "created",
  "id": "123",
  "ts": 1569327729,
  "instance": "/books/123"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="digest-with-patch">
        <name><tt>Digest</tt> with PATCH</name>
        <t>This case is analogous to a POST request where the target resource reflects the
target URI.</t>
        <t>The PATCH request uses the <tt>application/merge-patch+json</tt> media type defined in
<xref target="RFC7396"/>. <tt>Repr-Digest</tt> is calculated on the content that corresponds to the
patch document and is the JSON object <tt>{"title": "New Title"}</tt> followed by an
LF.</t>
        <t>The response <tt>Repr-Digest</tt> field-value is computed on the complete representation of the patched
resource. It is a multiline JSON object followed by an LF.</t>
        <figure anchor="fig-patch">
          <name>PATCH Request with <tt>Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
PATCH /books/123 HTTP/1.1
Host: foo.example
Content-Type: application/merge-patch+json
Accept: application/json
Accept-Encoding: identity
Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=:

{"title": "New Title"}
]]></sourcecode>
        </figure>
        <figure>
          <name>Response with <tt>Digest</tt> of Representation</name>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Repr-Digest: sha-256=:uVSlinTTdQUwm2On4k8TJUikGN1bf/Ds8WPX4oe0h9I=:

{
  "id": "123",
  "title": "New Title"
}
]]></sourcecode>
        </figure>
        <t>Note that a <tt>204 No Content</tt> response without content, but with the same
<tt>Repr-Digest</tt> field-value, would have been legitimate too.
In that case, <tt>Content-Digest</tt> would have been computed on an empty content.</t>
      </section>
      <section anchor="error-responses">
        <name>Error Responses</name>
        <t>In error responses, the representation data does not necessarily refer to the
target resource. Instead, it refers to the representation of the error.</t>
        <t>In the following example, a client sends the same request from <xref target="fig-patch"/> to
patch the resource located at /books/123. However, the resource does not exist
and the server generates a 404 response with a body that describes the error in
accordance with <xref target="RFC9457"/>.</t>
        <t>The response <tt>Repr-Digest</tt> field-value is computed on this enclosed representation.
It is a multiline JSON object followed by an LF.</t>
        <figure>
          <name>Response with <tt>Digest</tt> of Error Representation</name>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 404 Not Found
Content-Type: application/problem+json
Repr-Digest: sha-256=:EXB0S2VF2H7ijkAVJkH1Sm0pBho0iDZcvVUHHXTTZSA=:

{
  "title": "Not Found",
  "detail": "Cannot PATCH a non-existent resource",
  "status": 404
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="use-with-trailer-fields-and-transfer-coding">
        <name>Use with Trailer Fields and Transfer Coding</name>
        <t>An origin server sends <tt>Repr-Digest</tt> as trailer field, so it can calculate digest-value
while streaming content and thus mitigate resource consumption.
The <tt>Repr-Digest</tt> field-value is the same as in <xref target="example-full-representation"/> because <tt>Repr-Digest</tt> is designed to
be independent of the use of one or more transfer codings (see <xref target="representation-digest"/>).</t>
        <t>In the response content below, the string "\r\n" represents the CRLF bytes.</t>
        <figure>
          <name>GET Request</name>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: foo.example
]]></sourcecode>
        </figure>
        <figure>
          <name>Chunked Response with <tt>Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Trailer: Repr-Digest

8\r\n
{"hello"\r\n
8\r\n
: "world\r\n
3\r\n
"}\n\r\n
0\r\n
Repr-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:\r\n
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="examples-solicited">
      <name>Examples of <tt>Want-Repr-Digest</tt> Solicited <tt>Digest</tt></name>
      <t>The following examples demonstrate interactions where a client solicits a
<tt>Repr-Digest</tt> using <tt>Want-Repr-Digest</tt>.
The behavior of <tt>Content-Digest</tt> and <tt>Want-Content-Digest</tt> is identical.</t>
      <t>Some examples include JSON objects in the content.
For presentation purposes, objects that fit completely within the line-length limits
are presented on a single line using compact notation with no leading space.
Objects that would exceed line-length limits are presented across multiple lines
(one line per key-value pair) with two spaces of leading indentation.</t>
      <t>Checksum mechanisms described in this document are media-type agnostic
and do not provide canonicalization algorithms for specific formats.
Examples are calculated inclusive of any space.</t>
      <section anchor="server-selects-clients-least-preferred-algorithm">
        <name>Server Selects Client's Least Preferred Algorithm</name>
        <t>The client requests a digest and prefers "sha". The server is free to reply with
"sha-256" anyway.</t>
        <figure>
          <name>GET Request with <tt>Want-Repr-Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: foo.example
Want-Repr-Digest: sha-256=3, sha=10
]]></sourcecode>
        </figure>
        <figure>
          <name>Response with Different Algorithm</name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 200 OK
Content-Type: application/json
Repr-Digest: \
  sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:

{"hello": "world"}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="ex-server-selects-unsupported-algorithm">
        <name>Server Selects Algorithm Unsupported by Client</name>
        <t>The client requests a "sha" digest because that is the only algorithm it
supports. The server is not obliged to produce a response containing a "sha"
digest; it instead uses a different algorithm.</t>
        <figure>
          <name>GET Request with <tt>Want-Repr-Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: foo.example
Want-Repr-Digest: sha=10
]]></sourcecode>
        </figure>
        <figure>
          <name>Response with Unsupported Algorithm</name>
          <sourcecode type="http-message"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 200 OK
Content-Type: application/json
Repr-Digest: \
  sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\
  yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==:

{"hello": "world"}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="server-does-not-support-client-algorithm-and-returns-an-error">
        <name>Server Does Not Support Client Algorithm and Returns an Error</name>
        <t><xref target="ex-server-selects-unsupported-algorithm"/> is an example where a server ignores
the client's preferred digest algorithm.
Alternatively, a server can also reject
the request and return a response with
an error status code such as 4xx or 5xx.
This specification does not prescribe
any requirement on status code selection;
the following example illustrates one possible
option.</t>
        <t>In this example, the client requests a "sha" <tt>Repr-Digest</tt>, and the server returns an
error with problem details <xref target="RFC9457"/> contained in the content. The problem
details contain a list of the hashing algorithms that the server supports. This
is purely an example; this specification does not define any format or
requirements for such content.</t>
        <figure>
          <name>GET Request with <tt>Want-Repr-Digest</tt></name>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: foo.example
Want-Repr-Digest: sha=10
]]></sourcecode>
        </figure>
        <figure>
          <name>Response Advertising the Supported Algorithms</name>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "title": "Bad Request",
  "detail": "Supported hashing algorithms: sha-256, sha-512",
  "status": 400
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="sample-digest-values">
      <name>Sample <tt>Digest</tt> Values</name>
      <t>This section shows examples of digest values for different hashing algorithms.
The input value is the JSON object <tt>{"hello": "world"}</tt>. The digest values are
each produced by running the relevant hashing algorithm over the input and
running the output bytes through Byte Sequence serialization; see <xref section="4.1.8" sectionFormat="of" target="RFC8941"/>.</t>
      <sourcecode><![CDATA[
NOTE: '\' line wrapping per RFC 8792

sha-512 -   :WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm+\
            AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==:

sha-256 -   :X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:

md5 -       :Sd/dVLAcvNLSq16eXua5uQ==:

sha -       :07CavjDP4u3/TungoUHJO/Wzr4c=:

unixsum -   :GQU=:

unixcksum - :7zsHAA==:

adler -     :OZkGFw==:

crc32c -    :Q3lHIA==:
]]></sourcecode>
    </section>
    <section anchor="migrating">
      <name>Migrating from RFC 3230</name>
      <t>HTTP digests are computed by applying a hashing algorithm to input data.
<xref target="RFC3230"/> defined the input data as an "instance", a term it also defined.
The concept of an instance has since been superseded by the HTTP semantic term "representation".
It is understood that some implementations of <xref target="RFC3230"/>
mistook "instance" to mean HTTP content.
Using content for the <tt>Digest</tt> field is an error
that leads to interoperability problems between peers that implement <xref target="RFC3230"/>.</t>
      <t><xref target="RFC3230"/> was only ever intended
to use what HTTP now defines as selected representation data.
The semantic concept of digest and representation are explained
alongside the definition of the <tt>Repr-Digest</tt> field (<xref target="representation-digest"/>).</t>
      <t>While the syntax of <tt>Digest</tt> and <tt>Repr-Digest</tt> are different,
the considerations and examples this document gives for <tt>Repr-Digest</tt>
apply equally to <tt>Digest</tt> because they operate on the same input data;
see Sections <xref format="counter" target="state-changing-requests"/>, <xref format="counter" target="security"/> and <xref format="counter" target="usage-in-signatures"/>.</t>
      <t><xref target="RFC3230"/> could never communicate
the digest of HTTP message content in the <tt>Digest</tt> field;
<tt>Content-Digest</tt> now provides that capability.</t>
      <t><xref target="RFC3230"/> allowed algorithms to define their output encoding format for use with
the <tt>Digest</tt> field. This resulted in a mix of formats such as base64, hex, or
decimal. By virtue of using Structured Fields, <tt>Content-Digest</tt>, and <tt>Repr-Digest</tt>
use only a single encoding format. Further explanation and examples are provided in <xref target="sample-digest-values"/>.</t>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This document is based on ideas from <xref target="RFC3230"/>, so thanks
to <contact fullname="Jeff Mogul"/> and <contact fullname="Arthur Van Hoff"/> for their great work.
The original idea of refreshing <xref target="RFC3230"/> arose from an interesting
discussion with <contact fullname="Mark Nottingham"/>, <contact fullname="Jeffrey Yasskin"/>, and <contact fullname="Martin Thomson"/> when reviewing
the MICE content coding.</t>
      <t>Thanks to <contact fullname="Julian Reschke"/> for his valuable contributions to this document,
and to the following contributors that have helped improve this specification by reporting bugs,
asking smart questions, drafting or reviewing text, and evaluating open issues:
<contact fullname="Mike Bishop"/>,
<contact fullname="Brian Campbell"/>,
<contact fullname="Matthew Kerwin"/>,
<contact fullname="James Manger"/>,
<contact fullname="Tommy Pauly"/>,
<contact fullname="Sean Turner"/>,
<contact fullname="Justin Richer"/>,
and <contact fullname="Erik Wilde"/>.</t>
    </section>
  </back>
</rfc>
