rfc9530.original.xml | rfc9530.xml | |||
---|---|---|---|---|
<?xml version='1.0' encoding='utf-8'?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE rfc [ | <!DOCTYPE rfc [ | |||
<!ENTITY nbsp " "> | <!ENTITY nbsp " "> | |||
<!ENTITY zwsp "​"> | <!ENTITY zwsp "​"> | |||
<!ENTITY nbhy "‑"> | <!ENTITY nbhy "‑"> | |||
<!ENTITY wj "⁠"> | <!ENTITY wj "⁠"> | |||
]> | ]> | |||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | ||||
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.36 (Ruby 3.2. | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | |||
2) --> | -ietf-httpbis-digest-headers-13" number="9530" submissionType="IETF" category="s | |||
<?rfc tocindent="yes"?> | td" consensus="true" updates="" obsoletes="3230" tocInclude="true" sortRefs="tru | |||
<?rfc strict="yes"?> | e" symRefs="true" xml:lang="en" version="3"> | |||
<?rfc compact="yes"?> | ||||
<?rfc comments="yes"?> | ||||
<?rfc inline="yes"?> | ||||
<?rfc docmapping="yes"?> | ||||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | ||||
-ietf-httpbis-digest-headers-13" category="std" consensus="true" obsoletes="3230 | ||||
" tocInclude="true" sortRefs="true" symRefs="true" version="3"> | ||||
<!-- xml2rfc v2v3 conversion 3.17.4 --> | <!-- xml2rfc v2v3 conversion 3.17.4 --> | |||
<front> | <front> | |||
<title>Digest Fields</title> | <title>Digest Fields</title> | |||
<seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-digest-headers-1 3"/> | <seriesInfo name="RFC" value="9530"/> | |||
<author initials="R." surname="Polli" fullname="Roberto Polli"> | <author initials="R." surname="Polli" fullname="Roberto Polli"> | |||
<organization>Team Digitale, Italian Government</organization> | <organization>Team Digitale, Italian Government</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<country>Italy</country> | <country>Italy</country> | |||
</postal> | </postal> | |||
<email>robipolli@gmail.com</email> | <email>robipolli@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="L." surname="Pardue" fullname="Lucas Pardue"> | <author initials="L." surname="Pardue" fullname="Lucas Pardue"> | |||
<organization>Cloudflare</organization> | <organization>Cloudflare</organization> | |||
<address> | <address> | |||
<email>lucaspardue.24.7@gmail.com</email> | <email>lucas@lucaspardue.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2023" month="July" day="10"/> | <date month="February" year="2024"/> | |||
<area>Applications and Real-Time</area> | <area>Applications and Real-Time</area> | |||
<workgroup>HTTP</workgroup> | <workgroup>HTTP</workgroup> | |||
<keyword>Digest</keyword> | <keyword>Digest</keyword> | |||
<abstract> | <abstract> | |||
<?line 87?> | ||||
<t>This document defines HTTP fields that support integrity digests. The | <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 | <tt>Content-Digest</tt> field can be used for the integrity of HTTP message cont | |||
Repr-Digest field can be used for the integrity of HTTP representations. | ent. The | |||
Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's | <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 indica | ||||
te a sender's | ||||
interest and preferences for receiving the respective Integrity fields.</t> | interest and preferences for receiving the respective Integrity fields.</t> | |||
<t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP | <t>This document obsoletes RFC 3230 and the <tt>Digest</tt> and <tt>Want-D igest</tt> HTTP | |||
fields.</t> | fields.</t> | |||
</abstract> | </abstract> | |||
<note removeInRFC="true"> | ||||
<name>About This Document</name> | ||||
<t> | ||||
Status information for this document may be found at <eref target="https | ||||
://datatracker.ietf.org/doc/draft-ietf-httpbis-digest-headers/"/>. | ||||
</t> | ||||
<t> | ||||
Discussion of this document takes place on the | ||||
HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.or | ||||
g"/>), | ||||
which is archived at <eref target="https://lists.w3.org/Archives/Public/ | ||||
ietf-http-wg/"/>. | ||||
Working Group information can be found at <eref target="https://httpwg.o | ||||
rg/"/>. | ||||
</t> | ||||
<t>Source for this draft and an issue tracker can be found at | ||||
<eref target="https://github.com/httpwg/http-extensions/labels/digest-he | ||||
aders"/>.</t> | ||||
</note> | ||||
</front> | </front> | |||
<middle> | <middle> | |||
<?line 99?> | ||||
<section anchor="introduction"> | <section anchor="introduction"> | |||
<name>Introduction</name> | <name>Introduction</name> | |||
<t>HTTP does not define the means to protect the data integrity of content or | <t>HTTP does not define the means to protect the data integrity of content or | |||
representations. When HTTP messages are transferred between endpoints, lower lay | representations. When HTTP messages are transferred between endpoints, lower-lay | |||
er | er | |||
features or properties such as TCP checksums or TLS records <xref target="TLS"/> | features or properties such as TCP checksums or TLS records <xref target="RFC844 | |||
can provide | 6"/> can provide some integrity protection. However, transport-oriented integrit | |||
some integrity protection. However, transport-oriented integrity provides a | y provides a | |||
limited utility because it is opaque to the application layer and only covers | 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 | the extent of a single connection. HTTP messages often travel over a chain of | |||
separate connections. In between connections there is a possibility for | separate connections. In between connections, there is a possibility for | |||
data corruption. An HTTP integrity mechanism can provide | data corruption. An HTTP integrity mechanism can provide | |||
the means for endpoints, or applications using HTTP, to detect data corruption | 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 | 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> | fault detection and diagnosis across system boundaries.</t> | |||
<t>This document defines two digest integrity mechanisms for HTTP. | <t>This document defines two digest integrity mechanisms for HTTP. | |||
First, content integrity, which acts on conveyed content (<xref section="6.4" se ctionFormat="of" target="RFC9110"/>). | First, content integrity, which acts on conveyed content (<xref section="6.4" se ctionFormat="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 | 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 | integrity of a resource that was reconstructed from parts retrieved using | |||
multiple requests or connections.</t> | multiple requests or connections.</t> | |||
<t>This document obsoletes RFC 3230 and therefore the Digest and Want-Dige st HTTP | <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> | fields; see <xref target="obsolete-3230"/>.</t> | |||
<section anchor="document-structure"> | <section anchor="document-structure"> | |||
<name>Document Structure</name> | <name>Document Structure</name> | |||
<t>This document is structured as follows:</t> | <t>This document is structured as follows:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>New request and response header and trailer field definitions. | <t>New request and response header and trailer field definitions. | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<xref target="content-digest"/> (Content-Digest),</li> | <xref target="content-digest"/> (<tt>Content-Digest</tt>),</li> | |||
<li> | <li> | |||
<xref target="representation-digest"/> (Repr-Digest), and</li> | <xref target="representation-digest"/> (<tt>Repr-Digest</tt>), a nd</li> | |||
<li> | <li> | |||
<xref target="want-fields"/> (Want-Content-Digest and Want-Repr- Digest).</li> | <xref target="want-fields"/> (<tt>Want-Content-Digest</tt> and < tt>Want-Repr-Digest</tt>).</li> | |||
</ul> | </ul> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>Considerations specific to representation data integrity. | <t>Considerations specific to representation data integrity. | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<xref target="state-changing-requests"/> (State-changing request s),</li> | <xref target="state-changing-requests"/> (State-changing request s),</li> | |||
<li> | <li> | |||
<xref target="digest-and-content-location"/> (Content-Location), </li> | <xref target="digest-and-content-location"/> (Content-Location), </li> | |||
<li> | <li> | |||
<xref target="resource-representation"/> contains worked example s of Representation data | <xref target="resource-representation"/> contains worked example s of representation data | |||
in message exchanges, and</li> | in message exchanges, and</li> | |||
<li> | <li> | |||
<xref target="examples-unsolicited"/> and <xref target="examples | Appendixes <xref target="examples-unsolicited" format="counter"/ | |||
-solicited"/> contain worked examples | > and <xref target="examples-solicited" format="counter"/> contain worked exampl | |||
of Repr-Digest and Want-Repr-Digest fields in message exchanges.</li> | es | |||
of <tt>Repr-Digest</tt> and <tt>Want-Repr-Digest</tt> fields in message exchange | ||||
s.</li> | ||||
</ul> | </ul> | |||
</li> | </li> | |||
<li> | <li> | |||
<xref target="algorithms"/> presents hash algorithm considerations a nd defines | <xref target="algorithms"/> presents hash algorithm considerations a nd defines | |||
registration procedures for future entries.</li> | registration procedures for future entries.</li> | |||
</ul> | </ul> | |||
</section> | </section> | |||
<section anchor="concept-overview"> | <section anchor="concept-overview"> | |||
<name>Concept Overview</name> | <name>Concept Overview</name> | |||
<t>The HTTP fields defined in this document can be used for HTTP integri ty. Senders | <t>The HTTP fields defined in this document can be used for HTTP integri ty. Senders | |||
skipping to change at line 144 ¶ | skipping to change at line 120 ¶ | |||
<t>Selecting the data on which digests are calculated depends on the use case of the | <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 | HTTP messages. This document provides different fields for HTTP representation | |||
data and HTTP content.</t> | data and HTTP content.</t> | |||
<t>There are use cases where a simple digest of the HTTP content bytes i s | <t>There are use cases where a simple digest of the HTTP content bytes i s | |||
required. The <tt>Content-Digest</tt> request and response header and trailer fi eld is | required. The <tt>Content-Digest</tt> request and response header and trailer fi eld is | |||
defined to support digests of content (<xref section="6.4" sectionFormat="of" ta rget="RFC9110"/>); see | defined to support digests of content (<xref section="6.4" sectionFormat="of" ta rget="RFC9110"/>); see | |||
<xref target="content-digest"/>.</t> | <xref target="content-digest"/>.</t> | |||
<t>For more advanced use cases, the <tt>Repr-Digest</tt> request and res ponse header | <t>For more advanced use cases, the <tt>Repr-Digest</tt> request and res ponse header | |||
and trailer field (<xref target="representation-digest"/>) is defined. It contai ns a digest value | and trailer field (<xref target="representation-digest"/>) is defined. It contai ns a digest value | |||
computed by applying a hashing algorithm to selected representation data | computed by applying a hashing algorithm to selected representation data | |||
(<xref section="8.1" sectionFormat="of" target="RFC9110"/>). Basing <tt>Repr-Dig | (<xref section="8.1" sectionFormat="of" target="RFC9110"/>). | |||
est</tt> on the selected | ||||
Basing <tt>Repr-Digest</tt> on the selected | ||||
representation makes it straightforward to apply it to use cases where the | representation makes it straightforward to apply it to use cases where the | |||
message content requires some sort of manipulation to be considered as | message content requires some sort of manipulation to be considered as | |||
representation of the resource or content conveys a partial representation of a | representation of the resource or the content conveys a partial representation o | |||
resource, | f a resource, | |||
such as Range Requests (see <xref section="14" sectionFormat="of" target="RFC911 | such as range requests (see <xref section="14" sectionFormat="of" target="RFC911 | |||
0"/>).</t> | 0"/>).</t> | |||
<t><tt>Content-Digest</tt> and <tt>Repr-Digest</tt> support hashing algo | <t><tt>Content-Digest</tt> and <tt>Repr-Digest</tt> support hashing algorithm ag | |||
rithm agility. | ility. | |||
The <tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt> fields allow | 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 | endpoints to express interest in <tt>Content-Digest</tt> and <tt>Repr-Digest</tt | |||
> | >, respectively, and to express algorithm preferences in either.</t> | |||
respectively, and to express algorithm preferences in either.</t> | ||||
<t><tt>Content-Digest</tt> and <tt>Repr-Digest</tt> are collectively ter med | <t><tt>Content-Digest</tt> and <tt>Repr-Digest</tt> are collectively ter med | |||
Integrity fields. | "Integrity fields". | |||
<tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt> are | <tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt> are | |||
collectively termed Integrity preference fields.</t> | collectively termed "Integrity preference fields".</t> | |||
<t>Integrity fields are tied to the <tt>Content-Encoding</tt> | <t>Integrity fields are tied to the <tt>Content-Encoding</tt> | |||
and <tt>Content-Type</tt> header fields. Therefore, a given resource may have mu ltiple | and <tt>Content-Type</tt> header fields. Therefore, a given resource may have mu ltiple | |||
different digest values when transferred with HTTP.</t> | different digest values when transferred with HTTP.</t> | |||
<t>Integrity fields apply to HTTP message content or HTTP representation s. They do | <t>Integrity fields apply to HTTP message content or HTTP representation s. They do | |||
not apply to HTTP messages or fields. However, they can be combined with other | 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 | 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 | protect the phases of an HTTP exchange in whole or in part. For example, HTTP | |||
Message Signatures <xref target="SIGNATURES"/> could be used to sign Integrity f ields, thus | Message Signatures <xref target="RFC9421"/> could be used to sign Integrity fiel ds, thus | |||
providing coverage for HTTP content or representation data.</t> | providing coverage for HTTP content or representation data.</t> | |||
<t>This specification does not define means for authentication, authoriz ation, or privacy.</t> | <t>This specification does not define means for authentication, authoriz ation, or privacy.</t> | |||
</section> | </section> | |||
<section anchor="obsolete-3230"> | <section anchor="obsolete-3230"> | |||
<name>Obsoleting RFC 3230</name> | <name>Obsoleting RFC 3230</name> | |||
<t><xref target="RFC3230"/> defined the <tt>Digest</tt> and <tt>Want-Dig est</tt> HTTP fields for HTTP integrity. | <t><xref target="RFC3230"/> defined the <tt>Digest</tt> and <tt>Want-Dig est</tt> HTTP fields for HTTP integrity. | |||
It also coined the term "instance" and "instance manipulation" in order to | It also coined the terms "instance" and "instance manipulation" in order to | |||
explain concepts that are now more universally defined, and implemented, as HTTP | explain concepts, such as selected representation data (<xref section="8.1" | |||
semantics such as selected representation data (<xref section="8.1" sectionForma | sectionFormat="of" target="RFC9110"/>), that are now more universally defined an | |||
t="of" target="RFC9110"/>).</t> | d implemented as HTTP | |||
semantics.</t> | ||||
<t>Experience has shown that implementations of <xref target="RFC3230"/> have interpreted the | <t>Experience has shown that implementations of <xref target="RFC3230"/> have interpreted the | |||
meaning of "instance" inconsistently, leading to interoperability issues. The | meaning of "instance" inconsistently, leading to interoperability issues. The | |||
most common issue relates to the mistake of calculating the digest using (what | 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) | we now call) message content, rather than using (what we now call) | |||
representation data as was originally intended. Interestingly, time has also | 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 | 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 inte ntional or | it is difficult to detect if non-conformance to <xref target="RFC3230"/> is inte ntional or | |||
unintentional.</t> | unintentional.</t> | |||
<t>In order to address potential inconsistencies and ambiguity across | <t>In order to address potential inconsistencies and ambiguity across | |||
implementations of <tt>Digest</tt> and <tt>Want-Digest</tt>, this document obsol etes | implementations of <tt>Digest</tt> and <tt>Want-Digest</tt>, this document obsol etes | |||
<xref target="RFC3230"/>. The Integrity fields (Sections <xref format="counter" target="content-digest"/> and | <xref target="RFC3230"/>. The Integrity fields (Sections <xref format="counter" target="content-digest"/> and | |||
<xref format="counter" target="representation-digest"/>) and Integrity preferenc e fields (<xref target="want-fields"/>) | <xref format="counter" target="representation-digest"/>) and Integrity preferenc e fields (<xref target="want-fields"/>) | |||
defined in this document are better aligned with current HTTP semantics and | defined in this document are better aligned with current HTTP semantics and | |||
have names that more clearly articulate the intended usages.</t> | have names that more clearly articulate the intended usages.</t> | |||
</section> | </section> | |||
<section anchor="notational-conventions"> | <section anchor="notational-conventions"> | |||
<name>Notational Conventions</name> | <name>Notational Conventions</name> | |||
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp | <t> | |||
14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
nterpreted as | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and | be interpreted as | |||
only when, they | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
appear in all capitals, as shown here.</t> | when, and only when, they appear in all capitals, as shown here. | |||
</t> | ||||
<?line -18?> | <?line -18?> | |||
<t>This document uses the Augmented BNF defined in <xref target="RFC5234"/> and updated by | <t>This document uses the Augmented BNF defined in <xref target="RFC5234"/> and updated by | |||
<xref target="RFC7405"/>. This includes the rules: CR (carriage | <xref target="RFC7405"/>. This includes the rules CR (carriage return), LF (line | |||
return), LF (line feed), and CRLF (CR LF).</t> | feed), and CRLF (CR LF).</t> | |||
<t>This document uses the following terminology from <xref section="3" s | <t>This document uses the following terminology from <xref section="3" s | |||
ectionFormat="of" target="STRUCTURED-FIELDS"/> to specify syntax and parsing: | ectionFormat="of" target="RFC8941"/> to specify syntax and parsing: | |||
Boolean, Byte Sequence, Dictionary, Integer, and List.</t> | Boolean, Byte Sequence, Dictionary, Integer, and List.</t> | |||
<t>The definitions "representation", "selected representation", "represe ntation | <t>The definitions "representation", "selected representation", "represe ntation | |||
data", "representation metadata", "user agent", and "content" in this document a re to be | data", "representation metadata", "user agent", and "content" in this document a re to be | |||
interpreted as described in <xref target="RFC9110"/>.</t> | interpreted as described in <xref target="RFC9110"/>.</t> | |||
<t>This document uses the line folding strategies | <t>This document uses the line folding strategies | |||
described in <xref target="FOLDING"/>.</t> | described in <xref target="RFC8792"/>.</t> | |||
<t>Hashing algorithm names respect the casing used in their definition d ocument (e.g., SHA-1, CRC32c).</t> | <t>Hashing algorithm names respect the casing used in their definition d ocument (e.g., SHA-1, CRC32c).</t> | |||
<t>HTTP messages indicate hashing algorithms using an Algorithm Key (<co ntact fullname="algorithms"/>). | <t>HTTP messages indicate hashing algorithms using an Algorithm Key (<co ntact fullname="algorithms"/>). | |||
Where the document refers to an Algorithm Key in prose, it is quoted (e.g., "sha ", "crc32c").</t> | 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 the application of an alg | ||||
orithm | <t>The term "checksum" describes the output of applying an algorithm | |||
to a sequence of bytes, | to a sequence of bytes, whereas "digest" is only used in relation to | |||
whereas "digest" is only used in relation to the value contained in the fields.< | the value contained in the fields.</t> | |||
/t> | <t>"Integrity fields" is the collective term for <tt>Content-Digest</tt> and | |||
<t>Integrity fields: collective term for <tt>Content-Digest</tt> and <tt | <tt>Repr-Digest</tt>.</t> | |||
>Repr-Digest</tt></t> | <t>"Integrity preference fields" is the collective term for <tt>Want-Repr-Digest | |||
<t>Integrity preference fields: collective term for <tt>Want-Repr-Digest | </tt> | |||
</tt> and <tt>Want-Content-Digest</tt></t> | and <tt>Want-Content-Digest</tt>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="content-digest"> | <section anchor="content-digest"> | |||
<name>The Content-Digest Field</name> | <name>The <tt>Content-Digest</tt> Field</name> | |||
<t>The <tt>Content-Digest</tt> HTTP field can be used in requests and resp onses to | <t>The <tt>Content-Digest</tt> HTTP field can be used in requests and resp onses to | |||
communicate digests that are calculated using a hashing algorithm applied to | communicate digests that are calculated using a hashing algorithm applied to | |||
the actual message content (see <xref section="6.4" sectionFormat="of" target="R FC9110"/>). It is a | the actual message content (see <xref section="6.4" sectionFormat="of" target="R FC9110"/>). It is a | |||
<tt>Dictionary</tt> (see <xref section="3.2" sectionFormat="of" target="STRUCTUR ED-FIELDS"/>) | Dictionary (see <xref section="3.2" sectionFormat="of" target="RFC8941"/>), | |||
where each:</t> | where each:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>key conveys the hashing algorithm (see <xref target="algorithms"/>) | <li>key conveys the hashing algorithm (see <xref target="algorithms"/>) | |||
used to compute the digest;</li> | used to compute the digest;</li> | |||
<li>value is a <tt>Byte Sequence</tt> (<xref section="3.3.5" sectionForm at="of" target="STRUCTURED-FIELDS"/>), that | <li>value is a Byte Sequence (<xref section="3.3.5" sectionFormat="of" t arget="RFC8941"/>) that | |||
conveys an encoded version of the byte output produced by the digest | conveys an encoded version of the byte output produced by the digest | |||
calculation.</li> | calculation.</li> | |||
</ul> | </ul> | |||
<t>For example:</t> | <t>For example:</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
Content-Digest: \ | Content-Digest: \ | |||
sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | |||
yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>The <tt>Dictionary</tt> type can be used, for example, to attach multip le digests | <t>The Dictionary type can be used, for example, to attach multiple digest s | |||
calculated using different hashing algorithms in order to support a population | calculated using different hashing algorithms in order to support a population | |||
of endpoints with different or evolving capabilities. Such an approach could | of endpoints with different or evolving capabilities. Such an approach could | |||
support transitions away from weaker algorithms (see <xref target="sec-agility"/ >).</t> | support transitions away from weaker algorithms (see <xref target="sec-agility"/ >).</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
Content-Digest: \ | Content-Digest: \ | |||
sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\ | sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\ | |||
sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | |||
yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>A recipient <bcp14>MAY</bcp14> ignore any or all digests. Application-s pecific behavior or | <t>A recipient <bcp14>MAY</bcp14> ignore any or all digests. Application-s pecific behavior or | |||
local policy <bcp14>MAY</bcp14> set additional constraints on the processing and validation | local policy <bcp14>MAY</bcp14> set additional constraints on the processing and validation | |||
practices of the conveyed digests. | practices of the conveyed digests. | |||
The security considerations covers some of the issues related to | The security considerations cover some of the issues related to | |||
ignoring digests (see <xref target="sec-agility"/>) | ignoring digests (see <xref target="sec-agility"/>) | |||
and validating multiple digests (see <xref target="sec-exhaustion"/>).</t> | and validating multiple digests (see <xref target="sec-exhaustion"/>).</t> | |||
<t>A sender <bcp14>MAY</bcp14> send a digest without | <t>A sender <bcp14>MAY</bcp14> send a digest without | |||
knowing whether the recipient supports a given hashing algorithm, or even knowin | knowing whether the recipient supports a given hashing algorithm. A sender <bcp1 | |||
g | 4>MAY</bcp14> send a digest if it knows the recipient will ignore it.</t> | |||
that the recipient will ignore it.</t> | ||||
<t><tt>Content-Digest</tt> can be sent in a trailer section. | <t><tt>Content-Digest</tt> can be sent in a trailer section. | |||
In this case, | In this case, | |||
<tt>Content-Digest</tt> <bcp14>MAY</bcp14> be merged into the header section; se e <xref section="6.5.1" sectionFormat="of" target="RFC9110"/>.</t> | <tt>Content-Digest</tt> <bcp14>MAY</bcp14> be merged into the header section; se e <xref section="6.5.1" sectionFormat="of" target="RFC9110"/>.</t> | |||
</section> | </section> | |||
<section anchor="representation-digest"> | <section anchor="representation-digest"> | |||
<name>The Repr-Digest Field</name> | <name>The <tt>Repr-Digest</tt> Field</name> | |||
<t>The <tt>Repr-Digest</tt> HTTP field can be used in requests and respons es to | <t>The <tt>Repr-Digest</tt> HTTP field can be used in requests and respons es to | |||
communicate digests that are calculated using a hashing algorithm applied 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> | 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 | <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 | 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 | 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 | dependent on other transformations (e.g., transfer codings for HTTP/1.1; see | |||
<xref section="6.1" sectionFormat="of" target="RFC9112"/>). To help illustrate H TTP representation concepts, | <xref section="6.1" sectionFormat="of" target="RFC9112"/>). To help illustrate H TTP representation concepts, | |||
several examples are provided in <xref target="resource-representation"/>.</t> | several examples are provided in <xref target="resource-representation"/>.</t> | |||
<t>When a message has no representation data it is still possible to asser t that no | <t>When a message has no representation data, it is still possible to asse rt that no | |||
representation data was sent by computing the digest on an empty | representation data was sent by computing the digest on an empty | |||
string (see <xref target="usage-in-signatures"/>).</t> | string (see <xref target="usage-in-signatures"/>).</t> | |||
<t><tt>Repr-Digest</tt> is a <tt>Dictionary</tt> (see <xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>) where each:</t> | <t><tt>Repr-Digest</tt> is a Dictionary (see <xref section="3.2" sectionFo rmat="of" target="RFC8941"/>), where each:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>key conveys the hashing algorithm (see <xref target="algorithms"/>) | <li>key conveys the hashing algorithm (see <xref target="algorithms"/>) | |||
used to compute the digest;</li> | used to compute the digest;</li> | |||
<li>value is a <tt>Byte Sequence</tt>, that conveys an encoded version o f the byte | <li>value is a Byte Sequence that conveys an encoded version of the byte | |||
output produced by the digest calculation.</li> | output produced by the digest calculation.</li> | |||
</ul> | </ul> | |||
<t>For example:</t> | <t>For example:</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | |||
yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>The <tt>Dictionary</tt> type can be used, for example, to attach multip le digests | <t>The Dictionary type can be used to attach multiple digests | |||
calculated using different hashing algorithms in order to support a population | calculated using different hashing algorithms in order to support a population | |||
of endpoints with different or evolving capabilities. Such an approach could | of endpoints with different or evolving capabilities. Such an approach could | |||
support transitions away from weaker algorithms (see <xref target="sec-agility"/ >).</t> | support transitions away from weaker algorithms (see <xref target="sec-agility"/ >).</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\ | sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\ | |||
sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | |||
yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>A recipient <bcp14>MAY</bcp14> ignore any or all digests. Application-s pecific behavior or | <t>A recipient <bcp14>MAY</bcp14> ignore any or all digests. Application-s pecific behavior or | |||
local policy <bcp14>MAY</bcp14> set additional constraints on the processing and validation | local policy <bcp14>MAY</bcp14> set additional constraints on the processing and validation | |||
practices of the conveyed digests. | practices of the conveyed digests. | |||
The security considerations covers some of the issues related to | The security considerations cover some of the issues related to | |||
ignoring digests (see <xref target="sec-agility"/>) | ignoring digests (see <xref target="sec-agility"/>) | |||
and validating multiple digests (see <xref target="sec-exhaustion"/>).</t> | and validating multiple digests (see <xref target="sec-exhaustion"/>).</t> | |||
<t>A sender <bcp14>MAY</bcp14> send a digest without knowing whether the | <t>A sender <bcp14>MAY</bcp14> send a digest without knowing whether the r | |||
recipient supports a given hashing algorithm, or even knowing that the recipient | ecipient supports a given hashing algorithm. A sender <bcp14>MAY</bcp14> send a | |||
will ignore it.</t> | digest if it knows the recipient will ignore it.</t> | |||
<t><tt>Repr-Digest</tt> can be sent in a trailer section. | <t><tt>Repr-Digest</tt> can be sent in a trailer section. | |||
In this case, | 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> | <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"> | <section anchor="state-changing-requests"> | |||
<name>Using Repr-Digest in State-Changing Requests</name> | <name>Using <tt>Repr-Digest</tt> in State-Changing Requests</name> | |||
<t>When the representation enclosed in a state-changing request | <t>When the representation enclosed in a state-changing request | |||
does not describe the target resource, | does not describe the target resource, | |||
the representation digest <bcp14>MUST</bcp14> be computed on the | the representation digest <bcp14>MUST</bcp14> be computed on the | |||
representation data. | representation data. | |||
This is the only possible choice because representation digest requires complete | This is the only possible choice because representation digest requires complete | |||
representation metadata (see <xref target="representation-digest"/>).</t> | representation metadata (see <xref target="representation-digest"/>).</t> | |||
<t>In responses,</t> | <t>In responses,</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>if the representation describes the status of the request, | <li>if the representation describes the status of the request, | |||
<tt>Repr-Digest</tt> <bcp14>MUST</bcp14> be computed on the enclosed representat ion | <tt>Repr-Digest</tt> <bcp14>MUST</bcp14> be computed on the enclosed representat ion | |||
(see <xref target="post-referencing-status"/>);</li> | (see <xref target="post-referencing-status"/>);</li> | |||
<li>if there is a referenced resource | <li>if there is a referenced resource, <tt>Repr-Digest</tt> | |||
<tt>Repr-Digest</tt> <bcp14>MUST</bcp14> be computed on the selected representat | <bcp14>MUST</bcp14> be computed on the selected representation of | |||
ion of the referenced resource | the referenced resource even if that is different from the target | |||
even if that is different from the target resource. | resource. This might or might not result in computing | |||
That might or might not result in computing <tt>Repr-Digest</tt> on the enclose | <tt>Repr-Digest</tt> on the enclosed representation.</li> | |||
d representation.</li> | ||||
</ul> | </ul> | |||
<t>The latter case is done according to the HTTP semantics of the given | <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"/>). | 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 | In contrast, the <tt>Location</tt> header field does not affect <tt>Repr-Digest< /tt> because | |||
it is not representation metadata.</t> | it is not representation metadata.</t> | |||
<t>For example, in <tt>PATCH</tt> requests, the representation digest | <t>For example, in PATCH requests, the representation digest | |||
will be computed on the patch document | will be computed on the patch document | |||
because the representation metadata refers to the patch document and not | because the representation metadata refers to the patch document and not | |||
to the target resource (see <xref section="2" sectionFormat="of" target="PATCH"/ >). | the target resource (see <xref section="2" sectionFormat="of" target="RFC5789"/> ). | |||
In responses, instead, the representation digest will be computed on the selecte d | In responses, instead, the representation digest will be computed on the selecte d | |||
representation of the patched resource.</t> | representation of the patched resource.</t> | |||
</section> | </section> | |||
<section anchor="digest-and-content-location"> | <section anchor="digest-and-content-location"> | |||
<name>Repr-Digest and Content-Location in Responses</name> | <name><tt>Repr-Digest</tt> and Content-Location in Responses</name> | |||
<t>When a state-changing method returns the <tt>Content-Location</tt> he ader field, the | <t>When a state-changing method returns the <tt>Content-Location</tt> he ader field, the | |||
enclosed representation refers to the resource identified by its value and | enclosed representation refers to the resource identified by its value and | |||
<tt>Repr-Digest</tt> is computed accordingly. | <tt>Repr-Digest</tt> is computed accordingly. | |||
An example is given in <xref target="post-not-request-uri"/>.</t> | An example is given in <xref target="post-not-request-uri"/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="want-fields"> | <section anchor="want-fields"> | |||
<name>Integrity preference fields</name> | <name>Integrity Preference Fields</name> | |||
<t>Senders can indicate their interest in Integrity fields and hashing alg orithm | <t>Senders can indicate their interest in Integrity fields and hashing alg orithm | |||
preferences using the | preferences using the | |||
<tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt> fields. These can be u sed in both | <tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt> HTTP fields. These can be used in both | |||
requests and responses.</t> | requests and responses.</t> | |||
<t><tt>Want-Content-Digest</tt> indicates that the sender would like to re | ||||
ceive a content digest | <t><tt>Want-Content-Digest</tt> indicates that the sender would like to | |||
on messages associated with the request URI and representation metadata, using | receive (via the <tt>Content-Digest</tt> field) a content digest on messages | |||
the <tt>Content-Digest</tt> field.</t> | associated with the request URI and representation metadata. | |||
<t><tt>Want-Repr-Digest</tt> indicates that the sender would like to recei | ||||
ve a representation digest | <tt>Want-Repr-Digest</tt> indicates that the sender would like to receive | |||
on messages associated with the request URI and representation metadata, using | (via the <tt>Repr-Digest</tt> field) a representation digest on messages | |||
the <tt>Repr-Digest</tt> field.</t> | associated with the request URI and representation metadata. | |||
</t> | ||||
<t>If <tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt> are used i n a response, it | <t>If <tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt> are used i n a response, it | |||
indicates that the server would like the client to provide the respective | indicates that the server would like the client to provide the respective | |||
Integrity field on future requests.</t> | Integrity field on future requests.</t> | |||
<t>Integrity preference fields are only a hint. The receiver of the field can | <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 | 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 | 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 | a protocol error if preferences are ignored. Applications that use Integrity | |||
fields and Integrity preferences can define expectations or constraints that | fields and Integrity preferences can define expectations or constraints that | |||
operate in addition to this specification. Ignored preferences are an | operate in addition to this specification. Ignored preferences are an | |||
application-specific concern.</t> | application-specific concern.</t> | |||
<t><tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt> are of type <tt>Dictionary</tt> | <t><tt>Want-Content-Digest</tt> and <tt>Want-Repr-Digest</tt> are of type Dictionary | |||
where each:</t> | where each:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>key conveys the hashing algorithm (see <xref target="algorithms"/>); </li> | <li>key conveys the hashing algorithm (see <xref target="algorithms"/>); </li> | |||
<li>value is an <tt>Integer</tt> (<xref section="3.3.1" sectionFormat="o f" target="STRUCTURED-FIELDS"/>) | <li>value is an <tt>Integer</tt> (<xref section="3.3.1" sectionFormat="o f" target="RFC8941"/>) | |||
that conveys an ascending, relative, weighted preference. | that conveys an ascending, relative, weighted preference. | |||
It must be in the range 0 to 10 inclusive. | It must be in the range 0 to 10 inclusive. | |||
1 is the least preferred, 10 is the most preferred, | 1 is the least preferred, 10 is the most preferred, | |||
and a value of 0 means "not acceptable".</li> | and a value of 0 means "not acceptable".</li> | |||
</ul> | </ul> | |||
<t>Examples:</t> | <t>Examples:</t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
Want-Repr-Digest: sha-256=1 | Want-Repr-Digest: sha-256=1 | |||
Want-Repr-Digest: sha-512=3, sha-256=10, unixsum=0 | Want-Repr-Digest: sha-512=3, sha-256=10, unixsum=0 | |||
Want-Content-Digest: sha-256=1 | Want-Content-Digest: sha-256=1 | |||
skipping to change at line 405 ¶ | skipping to change at line 387 ¶ | |||
<section anchor="algorithms"> | <section anchor="algorithms"> | |||
<name>Hash Algorithm Considerations and Registration</name> | <name>Hash Algorithm Considerations and Registration</name> | |||
<t>There are a wide variety of hashing algorithms that can be used for the purposes | <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 | of integrity. The choice of algorithm depends on several factors such as the | |||
integrity use case, implementation needs or constraints, or application design | integrity use case, implementation needs or constraints, or application design | |||
and workflows.</t> | and workflows.</t> | |||
<t>An initial set of algorithms will be registered with IANA in the "Hash | <t>An initial set of algorithms will be registered with IANA in the "Hash | |||
Algorithms for HTTP Digest Fields" registry; see | Algorithms for HTTP Digest Fields" registry; see | |||
<xref target="establish-hash-algorithm-registry"/>. Additional algorithms can be registered | <xref target="establish-hash-algorithm-registry"/>. Additional algorithms can be registered | |||
in accordance with the policies set out in this section.</t> | in accordance with the policies set out in this section.</t> | |||
<t>Each algorithm has a status field, which is intended to provide an aid to | <t>Each algorithm has a status field that is intended to provide an aid to | |||
implementation selection.</t> | implementation selection.</t> | |||
<t>Algorithms with a status value of "Active" are suitable for many purpos es and | <t>Algorithms with a status value of "Active" are suitable for many purpos es and | |||
it is <bcp14>RECOMMENDED</bcp14> that applications use these algorithms. These c an be used in | it is <bcp14>RECOMMENDED</bcp14> that applications use these algorithms. These c an be used in | |||
adversarial situations where hash functions might need to provide resistance to | adversarial situations where hash functions might need to provide resistance to | |||
collision, first-preimage and second-preimage attacks. For adversarial | collision, first-preimage, and second-preimage attacks. | |||
situations, selecting which of the "Active" algorithms are acceptable will | ||||
depend on the level of protection the circumstances demand. | For adversarial situations, selection of the acceptable "Active" algorithms | |||
More considerations are presented in <xref target="sec-agility"/>.</t> | 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 t hese | <t>Algorithms with a status value of "Deprecated" either provide none of t hese | |||
properties, or are known to be weak (see <xref target="NO-MD5"/> and <xref targe t="NO-SHA"/>). These | properties or are known to be weak (see <xref target="RFC6151"/> and <xref targe t="RFC6194"/>). These | |||
algorithms <bcp14>MAY</bcp14> be used to preserve integrity against corruption, but <bcp14>MUST NOT</bcp14> be | 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 | used in a potentially adversarial setting, for example, when signing Integrity | |||
fields' values for authenticity. Permitting the use of these algorithms can help | fields' values for authenticity. | |||
some applications, for example, those that previously used <xref target="RFC3230 | ||||
"/>, are | Permitting the use of these algorithms can help some applications (such as | |||
migrating to this specification (<xref target="migrating"/>), and have existing | those that previously used <xref target="RFC3230"/>, are migrating to this sp | |||
stored | ecification | |||
collections of computed digest values avoid undue operational overhead caused by | (<xref target="migrating"/>), and have existing stored collections of compute | |||
recomputation using other more-secure algorithms. Such applications are not | d 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 | exempt from the requirements in this section. Furthermore, applications without | |||
such legacy or history ought to follow the guidance for using algorithms with | such legacy or history ought to follow the guidance for using algorithms with | |||
the status value "Active".</t> | the status value "Active".</t> | |||
<t>Discussion of algorithm agility is presented in <xref target="sec-agili ty"/>.</t> | <t>Discussion of algorithm agility is presented in <xref target="sec-agili ty"/>.</t> | |||
<t>Registration requests for the "Hash Algorithms for HTTP Digest Fields" registry | <t>Registration requests for the "Hash Algorithms for HTTP Digest Fields" registry | |||
use the Specification Required policy (<xref section="4.6" sectionFormat="of" ta rget="RFC8126"/>). Requests | use the Specification Required policy (<xref section="4.6" sectionFormat="of" ta rget="RFC8126"/>). Requests | |||
should use the following template:</t> | should use the following template:</t> | |||
<ul spacing="normal"> | <dl> | |||
<li>Algorithm Key: the Structured Fields key value used in | <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> | <tt>Content-Digest</tt>, <tt>Repr-Digest</tt>, <tt>Want-Content-Digest</tt>, or <tt>Want-Repr-Digest</tt> | |||
field Dictionary member keys</li> | field Dictionary member keys.</dd> | |||
<li> | <dt>Status:</dt><dd>The status of the algorithm. The options are:</dd> | |||
<t>Status: the status of the algorithm. The options are: | <dt></dt><dd> | |||
</t> | <dl spacing="normal"> | |||
<ul spacing="normal"> | <dt>"Active":</dt><dd>Algorithms without known problems</dd> | |||
<li>"Active" - for algorithms without known problems,</li> | <dt>"Provisional":</dt><dd>Unproven algorithms</dd> | |||
<li>"Provisional" - for unproven algorithms,</li> | <dt>"Deprecated":</dt><dd>Deprecated or insecure algorithms</dd> | |||
<li>"Deprecated" - for deprecated or insecure algorithms,</li> | </dl> | |||
</ul> | </dd> | |||
</li> | <dt>Description:</dt><dd>A short description of the algorithm.</dd> | |||
<li>Description: a short description of the algorithm</li> | <dt>Reference(s):</dt><dd>Pointer(s) to the primary document(s) defining | |||
<li>Reference(s): pointer(s) to the primary document(s) defining the Alg | the Algorithm | |||
orithm | Key and technical details of the algorithm.</dd> | |||
Key and technical details of the algorithm</li> | </dl> | |||
</ul> | ||||
<t>When reviewing registration requests, the designated expert(s) should p ay | <t>When reviewing registration requests, the designated expert(s) should p ay | |||
attention to the requested status. The status value should reflect | attention to the requested status. The status value should reflect | |||
standardization status and the broad opinion of relevant interest groups such as | standardization status and the broad opinion of relevant interest groups such as | |||
the IETF or security-related SDOs. The "Active" status is not suitable for an | the IETF or security-related Standards Development Organizations (SDOs). The "Ac tive" status is not suitable for an | |||
algorithm that is known to be weak, broken, or experimental. If a registration | algorithm that is known to be weak, broken, or experimental. If a registration | |||
request attempts to register such an algorithm as "Active", the designated | request attempts to register such an algorithm as "Active", the designated | |||
expert(s) should suggest an alternative status of "Deprecated" or "Provisional". </t> | expert(s) should suggest an alternative status of "Deprecated" or "Provisional". </t> | |||
<t>When reviewing registration requests, the designated expert(s) cannot u se a | <t>When reviewing registration requests, the designated expert(s) cannot u se a | |||
status of "Deprecated" or "Provisional" as grounds for rejection.</t> | status of "Deprecated" or "Provisional" as grounds for rejection.</t> | |||
<t>Requests to update or change the fields in an existing registration are | <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 | permitted. For example, this could allow for the transition of an algorithm | |||
status from "Active" to "Deprecated" as the security environment evolves.</t> | status from "Active" to "Deprecated" as the security environment evolves.</t> | |||
</section> | </section> | |||
<section anchor="security"> | <section anchor="security"> | |||
<name>Security Considerations</name> | <name>Security Considerations</name> | |||
<section anchor="sec-limitations"> | <section anchor="sec-limitations"> | |||
<name>HTTP Messages Are Not Protected In Full</name> | <name>HTTP Messages Are Not Protected in Full</name> | |||
<t>This document specifies a data integrity mechanism that protects HTTP | <t>This document specifies a data integrity mechanism that protects HTTP | |||
representation data or content, but not HTTP header and trailer fields, from | representation data or content, but not HTTP header and trailer fields, from | |||
certain kinds of corruption.</t> | certain kinds of corruption.</t> | |||
<t>Integrity fields are not intended to be a general protection against malicious tampering with | <t>Integrity fields are not intended to be a general protection against malicious tampering with | |||
HTTP messages. | HTTP messages. | |||
In the absence of additional security mechanisms, | In the absence of additional | |||
an on-path, malicious actor can remove or recalculate and substitute a digest | security mechanisms, an on-path malicious actor can either remove | |||
value. | 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 | This attack can be mitigated by combining mechanisms described in this | |||
document with other approaches such | document with other approaches such | |||
as transport-layer security or digital signatures (for example, HTTP Message | as Transport Layer Security (TLS) or digital signatures (for example, HTTP Messa | |||
Signatures <xref target="SIGNATURES"/>).</t> | ge | |||
Signatures <xref target="RFC9421"/>).</t> | ||||
</section> | </section> | |||
<section anchor="end-to-end-integrity"> | <section anchor="end-to-end-integrity"> | |||
<name>End-to-End Integrity</name> | <name>End-to-End Integrity</name> | |||
<t>Integrity fields can help detect representation data or content modif ication due to implementation errors, | <t>Integrity fields can help detect representation data or content modif ication due to implementation errors, | |||
undesired "transforming proxies" (see <xref section="7.7" sectionFormat="of" tar get="RFC9110"/>) | undesired "transforming proxies" (see <xref section="7.7" sectionFormat="of" tar get="RFC9110"/>), | |||
or other actions as the data passes across multiple hops or system boundaries. | 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 | Even a simple mechanism for end-to-end representation data integrity is valuable | |||
because a user agent can validate that resource retrieval succeeded before handi ng off to an | because a user agent can validate that resource retrieval succeeded before handi ng off to an | |||
HTML parser, video player, etc. for parsing.</t> | HTML parser, video player, etc., for parsing.</t> | |||
<t>Note that using these mechanisms alone does not provide end-to-end in tegrity of HTTP messages over | <t>Note that using these mechanisms alone does not provide end-to-end in tegrity of HTTP messages over | |||
multiple hops, since metadata could be manipulated at any stage. Methods to prot ect | multiple hops since metadata could be manipulated at any stage. Methods to prote ct | |||
metadata are discussed in <xref target="usage-in-signatures"/>.</t> | metadata are discussed in <xref target="usage-in-signatures"/>.</t> | |||
</section> | </section> | |||
<section anchor="usage-in-signatures"> | <section anchor="usage-in-signatures"> | |||
<name>Usage in Signatures</name> | <name>Usage in Signatures</name> | |||
<t>Digital signatures are widely used together with checksums to provide the | <t>Digital signatures are widely used together with checksums to provide the | |||
certain identification of the origin of a message <xref target="NIST800-32"/>. S uch signatures | certain identification of the origin of a message <xref target="FIPS186-5"/>. Su ch signatures | |||
can protect one or more HTTP fields and there are additional considerations when | can protect one or more HTTP fields and there are additional considerations when | |||
Integrity fields are included in this set.</t> | Integrity fields are included in this set.</t> | |||
<t>There are no restrictions placed on the type or format of digital sig nature that | <t>There are no restrictions placed on the type or format of digital sig nature that | |||
Integrity fields can be used with. One possible approach is to combine them with | Integrity fields can be used with. One possible approach is to combine them with | |||
HTTP Message Signatures <xref target="SIGNATURES"/>.</t> | HTTP Message Signatures <xref target="RFC9421"/>.</t> | |||
<t>Digests explicitly | <t>Digests explicitly | |||
depend on the "representation metadata" (e.g., the values of <tt>Content-Type</t t>, | depend on the "representation metadata" (e.g., the values of <tt>Content-Type</t t>, | |||
<tt>Content-Encoding</tt> etc.). A signature that protects Integrity fields but not other | <tt>Content-Encoding</tt>, etc.). A signature that protects Integrity fields but not other | |||
"representation metadata" can expose the communication to tampering. For | "representation metadata" can expose the communication to tampering. For | |||
example, an actor could manipulate the <tt>Content-Type</tt> field-value and cau se a | example, an actor could manipulate the <tt>Content-Type</tt> field-value and cau se a | |||
digest validation failure at the recipient, preventing the application from | digest validation failure at the recipient, preventing the application from | |||
accessing the representation. Such an attack consumes the resources of both | accessing the representation. Such an attack consumes the resources of both | |||
endpoints. See also <xref target="digest-and-content-location"/>.</t> | endpoints. See also <xref target="digest-and-content-location"/>.</t> | |||
<t>Signatures are likely to be deemed an adversarial setting when applyi ng | <t>Signatures are likely to be deemed an adversarial setting when applyi ng | |||
Integrity fields; see <xref target="algorithms"/>. <tt>Repr-Digest</tt> offers a n interesting | Integrity fields; see <xref target="algorithms"/>. <tt>Repr-Digest</tt> offers a n interesting | |||
possibility when combined with signatures. In the scenario where there is no | 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 | 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 | and, if signed, can help the recipient detect if content was added either as a r | |||
result of accident or purposeful manipulation. The opposite scenario is also | esult of accident or purposeful manipulation. The opposite scenario is also | |||
supported; including an Integrity field for content, and signing it, can help a | supported; including an Integrity field for content and signing it can help a | |||
recipient detect where the content was removed.</t> | recipient detect where the content was removed.</t> | |||
<t>Any mangling of Integrity fields, including digests' de-duplication | <t>Any mangling of Integrity fields might affect signature validation. Examples | |||
or combining different field values (see <xref section="5.2" sectionFormat="of" | of such mangling include de-duplicating digests or combining different field val | |||
target="RFC9110"/>) | ues (see <xref section="5.2" sectionFormat="of" target="RFC9110"/>).</t> | |||
might affect signature validation.</t> | ||||
</section> | </section> | |||
<section anchor="usage-in-trailer-fields"> | <section anchor="usage-in-trailer-fields"> | |||
<name>Usage in Trailer Fields</name> | <name>Usage in Trailer Fields</name> | |||
<t>Before sending Integrity fields in a trailer section, the sender | <t>Before sending Integrity fields in a trailer section, the sender | |||
should consider that intermediaries are explicitly allowed to drop any trailer | should consider that intermediaries are explicitly allowed to drop any trailer | |||
(see <xref section="6.5.2" sectionFormat="of" target="RFC9110"/>).</t> | (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. | <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 validatio n, possibly leading to | Eager processing of content before the trailer section prevents digest validatio n, possibly leading to | |||
processing of invalid data.</t> | processing of invalid data.</t> | |||
<t>One of the benefits of using Integrity fields in a trailer section is that it | <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 | 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 | design a hashing algorithm that requires processing of content in such a way | |||
that would negate these benefits. For example, Merkle Integrity Content Encoding | that would negate these benefits. For example, Merkle Integrity Content Encoding | |||
<xref target="I-D.thomson-http-mice"/> requires content to be processed in rever se order. | <xref target="I-D.thomson-http-mice"/> requires content to be processed in rever se order. | |||
This means the complete data needs to be available, which means there is | This means the complete data needs to be available, which means there is | |||
negligible processing difference in sending an Integrity field in a header or | negligible processing difference in sending an Integrity field in a header versu | |||
trailer section.</t> | s | |||
a trailer section.</t> | ||||
</section> | </section> | |||
<section anchor="variations-within-content-encoding"> | <section anchor="variations-within-content-encoding"> | |||
<name>Variations Within Content Encoding</name> | <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 generall y not communicated as representation metadata. For instance, different compressi on levels would all use the same "Content-Encoding: gzip" field. Other examples include where encoding relies on nonces or timestamps, such as the aes128gcm con tent coding defined in <xref target="RFC8188"/>.</t> | <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 generall y not communicated as representation metadata. For instance, different compressi on levels would all use the same "Content-Encoding: gzip" field. Other examples include where encoding relies on nonces or timestamps, such as the aes128gcm con tent 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" | <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> | unless the whole content is persisted.</t> | |||
</section> | </section> | |||
<section anchor="sec-agility"> | <section anchor="sec-agility"> | |||
<name>Algorithm Agility</name> | <name>Algorithm Agility</name> | |||
<t>The security properties of hashing algorithms are not fixed. | <t>The security properties of hashing algorithms are not fixed. | |||
Algorithm Agility (see <xref target="RFC7696"/>) is achieved by providing implem entations with flexibility | Algorithm agility (see <xref target="RFC7696"/>) is achieved by providing implem entations with flexibility | |||
to choose hashing algorithms from the IANA Hash Algorithms for HTTP Digest Field s registry; see | to choose hashing algorithms from the IANA Hash Algorithms for HTTP Digest Field s registry; see | |||
<xref target="establish-hash-algorithm-registry"/>.</t> | <xref target="establish-hash-algorithm-registry"/>.</t> | |||
<t>Transition from weak algorithms is supported | <t>Transition from weak algorithms is supported | |||
by negotiation of hashing algorithm using <tt>Want-Content-Digest</tt> or <tt>Wa nt-Repr-Digest</tt> (see <xref target="want-fields"/>) | by negotiation of hashing algorithm using <tt>Want-Content-Digest</tt> or <tt>Wa nt-Repr-Digest</tt> (see <xref target="want-fields"/>) | |||
or by sending multiple digests from which the receiver chooses. | or by sending multiple digests from which the receiver chooses. | |||
A receiver that depends on a digest for security will be vulnerable | A receiver that depends on a digest for security will be vulnerable | |||
to attacks on the weakest algorithm it is willing to accept. | to attacks on the weakest algorithm it is willing to accept. | |||
Endpoints are advised that sending multiple values consumes resources, | Endpoints are advised that sending multiple values consumes resources that may b | |||
which may be wasted if the receiver ignores them (see <xref target="representati | e wasted if the receiver ignores them (see <xref target="representation-digest"/ | |||
on-digest"/>).</t> | >).</t> | |||
<t>While algorithm agility allows the migration to stronger algorithms | <t>While algorithm agility allows the migration to stronger algorithms, | |||
it does not prevent the use of weaker algorithms. | it does not prevent the use of weaker algorithms. | |||
Integrity fields do not provide any mitigations for downgrade or substitution | Integrity fields do not provide any mitigations for downgrade or substitution | |||
attacks (see Section 1 of <xref target="RFC6211"/>) of the hashing algorithm. | attacks (see <xref target="RFC6211" sectionFormat="of" section="1"/>) of the has hing algorithm. | |||
To protect against such attacks, endpoints could restrict their set of supported algorithms | To protect against such attacks, endpoints could restrict their set of supported algorithms | |||
to stronger ones and protect the fields value by using TLS and/or digital signat ures.</t> | to stronger ones and protect the fields' values by using TLS and/or digital sign atures.</t> | |||
</section> | </section> | |||
<section anchor="sec-exhaustion"> | <section anchor="sec-exhaustion"> | |||
<name>Resource exhaustion</name> | <name>Resource Exhaustion</name> | |||
<t>Integrity fields validation consumes computational resources. | <t>Integrity field validation consumes computational resources. | |||
In order to avoid resource exhaustion, implementations can restrict | In order to avoid resource exhaustion, implementations can restrict | |||
validation of the algorithm types, number of validations, or the size of content . | validation of the algorithm types, the number of validations, or the size of con tent. | |||
In these cases, skipping validation entirely or ignoring validation failure of a more-preferred algorithm | 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> | leaves the possibility of a downgrade attack (see <xref target="sec-agility"/>). </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="iana-considerations"> | <section anchor="iana-considerations"> | |||
<name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
<section anchor="http-field-name-registration"> | <section anchor="http-field-name-registration"> | |||
<name>HTTP Field Name Registration</name> | <name>HTTP Field Name Registration</name> | |||
<t>IANA is asked to update the | <t>IANA has updated the | |||
"Hypertext Transfer Protocol (HTTP) Field Name Registry" registry | "Hypertext Transfer Protocol (HTTP) Field Name Registry" | |||
(<xref target="RFC9110"/>) according to the table below:</t> | <xref target="RFC9110"/> as shown in the table below:</t> | |||
<table> | <table> | |||
<name>Hypertext Transfer Protocol (HTTP) Field | ||||
Name Registry Update</name> | ||||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Field Name</th> | <th align="left">Field Name</th> | |||
<th align="left">Status</th> | <th align="left">Status</th> | |||
<th align="left">Reference</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">Content-Digest</td> | <td align="left"><tt>Content-Digest</tt></td> | |||
<td align="left">permanent</td> | <td align="left">permanent</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="content-digest"/> of this document</td> | <xref target="content-digest"/> of RFC 9530</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Repr-Digest</td> | <td align="left"><tt>Repr-Digest</tt></td> | |||
<td align="left">permanent</td> | <td align="left">permanent</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="representation-digest"/> of this document</td> | <xref target="representation-digest"/> of RFC 9530</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Want-Content-Digest</td> | <td align="left"><tt>Want-Content-Digest</tt></td> | |||
<td align="left">permanent</td> | <td align="left">permanent</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="want-fields"/> of this document</td> | <xref target="want-fields"/> of RFC 9530</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Want-Repr-Digest</td> | <td align="left"><tt>Want-Repr-Digest</tt></td> | |||
<td align="left">permanent</td> | <td align="left">permanent</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="want-fields"/> of this document</td> | <xref target="want-fields"/> of RFC 9530</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Digest</td> | <td align="left"><tt>Digest</tt></td> | |||
<td align="left">obsoleted</td> | <td align="left">obsoleted</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC3230"/>, <xref target="obsolete-3230"/> of this document</td> | <xref target="RFC3230"/>, <xref target="obsolete-3230"/> of RFC 9530</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Want-Digest</td> | <td align="left"><tt>Want-Digest</tt></td> | |||
<td align="left">obsoleted</td> | <td align="left">obsoleted</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC3230"/>, <xref target="obsolete-3230"/> of this document</td> | <xref target="RFC3230"/>, <xref target="obsolete-3230"/> of RFC 9530</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
<section anchor="establish-hash-algorithm-registry"> | <section anchor="establish-hash-algorithm-registry"> | |||
<name>Establish the Hash Algorithms for HTTP Digest Fields Registry</nam | <name>Creation of the Hash Algorithms for HTTP Digest Fields Registry</n | |||
e> | ame> | |||
<t>IANA is requested to create the new "Hash Algorithms for HTTP Digest | <t>IANA has created the new "Hash Algorithms for HTTP Digest Fields" | |||
Fields" | registry at <eref brackets="angle" target="https://www.iana.org/assignments/http | |||
registry at <eref target="https://www.iana.org/assignments/http-digest-hash-alg/ | -digest-hash-alg/"/> and | |||
">https://www.iana.org/assignments/http-digest-hash-alg/</eref> and | populated it with the entries in <xref target="iana-hash-algorithm-table"/>. The | |||
populate it with the entries in <xref target="iana-hash-algorithm-table"/>. The | procedure for | |||
procedure for | ||||
new registrations is provided in <xref target="algorithms"/>.</t> | new registrations is provided in <xref target="algorithms"/>.</t> | |||
<table anchor="iana-hash-algorithm-table"> | <table anchor="iana-hash-algorithm-table"> | |||
<name>Initial Hash Algorithms</name> | <name>Initial Hash Algorithms</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Algorithm Key</th> | <th align="left">Algorithm Key</th> | |||
<th align="left">Status</th> | <th align="left">Status</th> | |||
<th align="left">Description</th> | <th align="left">Description</th> | |||
<th align="left">Reference(s)</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">sha-512</td> | <td align="left">sha-512</td> | |||
<td align="left">Active</td> | <td align="left">Active</td> | |||
<td align="left">The SHA-512 algorithm.</td> | <td align="left">The SHA-512 algorithm.</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC6234"/>, <xref target="RFC4648"/>, this documen t.</td> | <xref target="RFC6234"/>, <xref target="RFC4648"/>, RFC 9530</td > | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">sha-256</td> | <td align="left">sha-256</td> | |||
<td align="left">Active</td> | <td align="left">Active</td> | |||
<td align="left">The SHA-256 algorithm.</td> | <td align="left">The SHA-256 algorithm.</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC6234"/>, <xref target="RFC4648"/>, this documen t.</td> | <xref target="RFC6234"/>, <xref target="RFC4648"/>, RFC 9530</td > | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">md5</td> | <td align="left">md5</td> | |||
<td align="left">Deprecated</td> | <td align="left">Deprecated</td> | |||
<td align="left">The MD5 algorithm. It is vulnerable to collision attacks; see <xref target="NO-MD5"/> and <xref target="CMU-836068"/></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"> | <td align="left"> | |||
<xref target="RFC1321"/>, <xref target="RFC4648"/>, this documen t.</td> | <xref target="RFC1321"/>, <xref target="RFC4648"/>, RFC 9530</td > | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">sha</td> | <td align="left">sha</td> | |||
<td align="left">Deprecated</td> | <td align="left">Deprecated</td> | |||
<td align="left">The SHA-1 algorithm. It is vulnerable to collisio n attacks; see <xref target="NO-SHA"/> and <xref target="IACR-2020-014"/></td> | <td align="left">The SHA-1 algorithm. It is vulnerable to collisio n attacks; see <xref target="RFC6194"/> and <xref target="IACR-2020-014"/></td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC3174"/>, <xref target="RFC4648"/>, <xref target ="RFC6234"/> this document.</td> | <xref target="RFC3174"/>, <xref target="RFC4648"/>, <xref target ="RFC6234"/>, RFC 9530</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">unixsum</td> | <td align="left">unixsum</td> | |||
<td align="left">Deprecated</td> | <td align="left">Deprecated</td> | |||
<td align="left">The algorithm used by the UNIX "sum" command.</td > | <td align="left">The algorithm used by the UNIX "sum" command.</td > | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC4648"/>, <xref target="RFC6234"/>, <xref target ="UNIX"/>, this document.</td> | <xref target="RFC4648"/>, <xref target="RFC6234"/>, <xref target ="UNIX"/>, RFC 9530</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">unixcksum</td> | <td align="left">unixcksum</td> | |||
<td align="left">Deprecated</td> | <td align="left">Deprecated</td> | |||
<td align="left">The algorithm used by the UNIX "cksum" command.</ td> | <td align="left">The algorithm used by the UNIX "cksum" command.</ td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC4648"/>, <xref target="RFC6234"/>, <xref target ="UNIX"/>, this document.</td> | <xref target="RFC4648"/>, <xref target="RFC6234"/>, <xref target ="UNIX"/>, RFC 9530</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">adler</td> | <td align="left">adler</td> | |||
<td align="left">Deprecated</td> | <td align="left">Deprecated</td> | |||
<td align="left">The ADLER32 algorithm.</td> | <td align="left">The ADLER32 algorithm.</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC1950"/>, this document.</td> | <xref target="RFC1950"/>, RFC 9530</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">crc32c</td> | <td align="left">crc32c</td> | |||
<td align="left">Deprecated</td> | <td align="left">Deprecated</td> | |||
<td align="left">The CRC32c algorithm.</td> | <td align="left">The CRC32c algorithm.</td> | |||
<td align="left"> | <td align="left"><xref target="RFC9260" sectionFormat="of" section | |||
<xref target="RFC9260"/> appendix A, this document.</td> | ="A"/>, RFC 9530</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
<section anchor="deprecate-the-hypertext-transfer-protocol-http-digest-alg orithm-values-registry"> | <section anchor="deprecate-the-hypertext-transfer-protocol-http-digest-alg orithm-values-registry"> | |||
<name>Deprecate the Hypertext Transfer Protocol (HTTP) Digest Algorithm Values Registry</name> | <name>Deprecate the Hypertext Transfer Protocol (HTTP) Digest Algorithm Values Registry</name> | |||
<t>IANA is requested to deprecate the "Hypertext Transfer Protocol (HTTP ) Digest | <t>IANA has deprecated the "Hypertext Transfer Protocol (HTTP) Digest | |||
Algorithm Values" registry at | Algorithm Values" registry at | |||
<eref target="https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml"> | <eref brackets="angle" target="https://www.iana.org/assignments/http-dig-alg/"/> | |||
https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml</eref> and repl | and replaced the note on that registry with the following text:</t> | |||
ace the note on this registry with the following text:</t> | <blockquote>This registry is deprecated since it lists the algorithm | |||
<ul empty="true"> | s that can be used | |||
<li> | with the <tt>Digest</tt> and <tt>Want-Digest</tt> fields defined in <xref target | |||
<t>"This registry is deprecated since it lists the algorithms that c | ="RFC3230"/>, which has been obsoleted by | |||
an be used | RFC 9530. While registration is not closed, new registrations | |||
with the Digest and Want-Digest fields defined in | are encouraged to use the <eref target="https://www.iana.org/assignments/http-di | |||
<xref target="RFC3230"/><eref target="https://www.iana.org/">https://www.iana.or | gest-hash-alg/">Hash Algorithms for HTTP Digest | |||
g/</eref>, which has been obsoleted by | Fields</eref> registry instead.</blockquote> | |||
[rfc-to-be-this-document]. While registration is not closed, new registrations | ||||
are encouraged to use the [Hash Algorithms for HTTP Digest | ||||
Fields]<eref target="https://www.iana.org/assignments/http-digest-hash-alg/">htt | ||||
ps://www.iana.org/assignments/http-digest-hash-alg/</eref> registry | ||||
instead.</t> | ||||
</li> | ||||
</ul> | ||||
</section> | </section> | |||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<displayreference target="RFC9110" to="HTTP"/> | <displayreference target="RFC9110" to="HTTP"/> | |||
<displayreference target="RFC9112" to="HTTP/1.1"/> | <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> | <references> | |||
<name>References</name> | <name>References</name> | |||
<references> | <references> | |||
<name>Normative References</name> | <name>Normative References</name> | |||
<reference anchor="RFC1321"> | ||||
<front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1321.xml" | |||
<title>The MD5 Message-Digest Algorithm</title> | /> | |||
<author fullname="R. Rivest" initials="R." surname="Rivest"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3174.xml" | |||
<date month="April" year="1992"/> | /> | |||
<abstract> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1950.xml" | |||
<t>This document describes the MD5 message-digest algorithm. The a | /> | |||
lgorithm takes as input a message of arbitrary length and produces as output a 1 | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml" | |||
28-bit "fingerprint" or "message digest" of the input. This memo provides inform | /> | |||
ation for the Internet community. It does not specify an Internet standard.</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml" | |||
</abstract> | /> | |||
</front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml" | |||
<seriesInfo name="RFC" value="1321"/> | /> | |||
<seriesInfo name="DOI" value="10.17487/RFC1321"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7405.xml" | |||
</reference> | /> | |||
<reference anchor="RFC3174"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8792.xml" | |||
<front> | /> | |||
<title>US Secure Hash Algorithm 1 (SHA1)</title> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml" | |||
<author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3 | /> | |||
rd"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml" | |||
<author fullname="P. Jones" initials="P." surname="Jones"/> | /> | |||
<date month="September" year="2001"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml" | |||
<abstract> | /> | |||
<t>The purpose of this document is to make the SHA-1 (Secure Hash | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8941.xml" | |||
Algorithm 1) hash algorithm conveniently available to the Internet community. Th | /> | |||
is memo provides information for the Internet community.</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml" | |||
</abstract> | /> | |||
</front> | ||||
<seriesInfo name="RFC" value="3174"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3174"/> | ||||
</reference> | ||||
<reference anchor="RFC1950"> | ||||
<front> | ||||
<title>ZLIB Compressed Data Format Specification version 3.3</title> | ||||
<author fullname="P. Deutsch" initials="P." surname="Deutsch"/> | ||||
<author fullname="J-L. Gailly" surname="J-L. Gailly"/> | ||||
<date month="May" year="1996"/> | ||||
<abstract> | ||||
<t>This specification defines a lossless compressed data format. T | ||||
his memo provides information for the Internet community. This memo does not spe | ||||
cify an Internet standard of any kind.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="1950"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC1950"/> | ||||
</reference> | ||||
<reference anchor="RFC4648"> | ||||
<front> | ||||
<title>The Base16, Base32, and Base64 Data Encodings</title> | ||||
<author fullname="S. Josefsson" initials="S." surname="Josefsson"/> | ||||
<date month="October" year="2006"/> | ||||
<abstract> | ||||
<t>This document describes the commonly used base 64, base 32, and | ||||
base 16 encoding schemes. It also discusses the use of line-feeds in encoded da | ||||
ta, use of padding in encoded data, use of non-alphabet characters in encoded da | ||||
ta, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRA | ||||
CK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4648"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4648"/> | ||||
</reference> | ||||
<reference anchor="RFC5234"> | ||||
<front> | ||||
<title>Augmented BNF for Syntax Specifications: ABNF</title> | ||||
<author fullname="D. Crocker" initials="D." role="editor" surname="C | ||||
rocker"/> | ||||
<author fullname="P. Overell" initials="P." surname="Overell"/> | ||||
<date month="January" year="2008"/> | ||||
<abstract> | ||||
<t>Internet technical specifications often need to define a formal | ||||
syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Au | ||||
gmented BNF (ABNF), has been popular among many Internet specifications. The cur | ||||
rent specification documents ABNF. It balances compactness and simplicity with r | ||||
easonable representational power. The differences between standard BNF and ABNF | ||||
involve naming rules, repetition, alternatives, order-independence, and value ra | ||||
nges. This specification also supplies additional rule definitions and encoding | ||||
for a core lexical analyzer of the type common to several Internet specification | ||||
s. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="STD" value="68"/> | ||||
<seriesInfo name="RFC" value="5234"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5234"/> | ||||
</reference> | ||||
<reference anchor="RFC6234"> | ||||
<front> | ||||
<title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</ | ||||
title> | ||||
<author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3 | ||||
rd"/> | ||||
<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="RFC7405"> | ||||
<front> | ||||
<title>Case-Sensitive String Support in ABNF</title> | ||||
<author fullname="P. Kyzivat" initials="P." surname="Kyzivat"/> | ||||
<date month="December" year="2014"/> | ||||
<abstract> | ||||
<t>This document extends the base definition of ABNF (Augmented Ba | ||||
ckus-Naur Form) to include a way to specify US-ASCII string literals that are ma | ||||
tched in a case-sensitive manner.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7405"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7405"/> | ||||
</reference> | ||||
<reference anchor="FOLDING"> | ||||
<front> | ||||
<title>Handling Long Lines in Content of Internet-Drafts and RFCs</t | ||||
itle> | ||||
<author fullname="K. Watsen" initials="K." surname="Watsen"/> | ||||
<author fullname="E. Auerswald" initials="E." surname="Auerswald"/> | ||||
<author fullname="A. Farrel" initials="A." surname="Farrel"/> | ||||
<author fullname="Q. Wu" initials="Q." surname="Wu"/> | ||||
<date month="June" year="2020"/> | ||||
<abstract> | ||||
<t>This document defines two strategies for handling long lines in | ||||
width-bounded text content. One strategy, called the "single backslash" strateg | ||||
y, is based on the historical use of a single backslash ('\') character to indic | ||||
ate where line-folding has occurred, with the continuation occurring with the fi | ||||
rst character that is not a space character (' ') on the next line. The second s | ||||
trategy, called the "double backslash" strategy, extends the first strategy by a | ||||
dding a second backslash character to identify where the continuation begins and | ||||
is thereby able to handle cases not supported by the first strategy. Both strat | ||||
egies use a self-describing header enabling automated reconstitution of the orig | ||||
inal content.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8792"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8792"/> | ||||
</reference> | ||||
<reference anchor="RFC9110"> | ||||
<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="R | ||||
eschke"/> | ||||
<date month="June" year="2022"/> | ||||
<abstract> | ||||
<t>The Hypertext Transfer Protocol (HTTP) is a stateless applicati | ||||
on-level protocol for distributed, collaborative, hypertext information systems. | ||||
This document describes the overall architecture of HTTP, establishes common te | ||||
rminology, 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, 7 | ||||
232, 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="RFC2119"> | ||||
<front> | ||||
<title>Key words for use in RFCs to Indicate Requirement Levels</tit | ||||
le> | ||||
<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 sig | ||||
nify the requirements in the specification. These words are often capitalized. T | ||||
his document defines these words as they should be interpreted in IETF documents | ||||
. This document specifies an Internet Best Current Practices for the Internet Co | ||||
mmunity, 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</ti | ||||
tle> | ||||
<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 protoco | ||||
l 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="STRUCTURED-FIELDS"> | ||||
<front> | ||||
<title>Structured Field Values for HTTP</title> | ||||
<author fullname="M. Nottingham" initials="M." surname="Nottingham"/ | ||||
> | ||||
<author fullname="P-H. Kamp" surname="P-H. Kamp"/> | ||||
<date month="February" year="2021"/> | ||||
<abstract> | ||||
<t>This document describes a set of data types and associated algo | ||||
rithms that are intended to make it easier and safer to define and handle HTTP h | ||||
eader and trailer fields, known as "Structured Fields", "Structured Headers", or | ||||
"Structured Trailers". It is intended for use by specifications of new HTTP fie | ||||
lds that wish to use a common syntax that is more restrictive than traditional H | ||||
TTP field values.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8941"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8941"/> | ||||
</reference> | ||||
<reference anchor="RFC8126"> | ||||
<front> | ||||
<title>Guidelines for Writing an IANA Considerations Section in RFCs | ||||
</title> | ||||
<author fullname="M. Cotton" initials="M." surname="Cotton"/> | ||||
<author fullname="B. Leiba" initials="B." surname="Leiba"/> | ||||
<author fullname="T. Narten" initials="T." surname="Narten"/> | ||||
<date month="June" year="2017"/> | ||||
<abstract> | ||||
<t>Many protocols make use of points of extensibility that use con | ||||
stants to identify various protocol parameters. To ensure that the values in the | ||||
se fields do not have conflicting uses and to promote interoperability, their al | ||||
locations are often coordinated by a central record keeper. For IETF protocols, | ||||
that role is filled by the Internet Assigned Numbers Authority (IANA).</t> | ||||
<t>To make assignments in a given registry prudently, guidance des | ||||
cribing the conditions under which new values should be assigned, as well as whe | ||||
n and how modifications to existing values can be made, is needed. This document | ||||
defines a framework for the documentation of these guidelines by specification | ||||
authors, in order to assure that the provided guidance for the IANA Consideratio | ||||
ns is clear and addresses the various issues that are likely in the operation of | ||||
a registry.</t> | ||||
<t>This is the third edition of this document; it obsoletes RFC 52 | ||||
26.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="26"/> | ||||
<seriesInfo name="RFC" value="8126"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8126"/> | ||||
</reference> | ||||
</references> | </references> | |||
<references> | <references> | |||
<name>Informative References</name> | <name>Informative References</name> | |||
<reference anchor="RFC3230"> | ||||
<front> | ||||
<title>Instance Digests in HTTP</title> | ||||
<author fullname="J. Mogul" initials="J." surname="Mogul"/> | ||||
<author fullname="A. Van Hoff" initials="A." surname="Van Hoff"/> | ||||
<date month="January" year="2002"/> | ||||
<abstract> | ||||
<t>HTTP/1.1 defines a Content-MD5 header that allows a server to i | ||||
nclude a digest of the response body. However, this is specifically defined to c | ||||
over the body of the actual message, not the contents of the full file (which mi | ||||
ght be quite different, if the response is a Content-Range, or uses a delta enco | ||||
ding). Also, the Content-MD5 is limited to one specific digest algorithm; other | ||||
algorithms, such as SHA-1 (Secure Hash Standard), may be more appropriate in som | ||||
e circumstances. Finally, HTTP/1.1 provides no explicit mechanism by which a cli | ||||
ent may request a digest. This document proposes HTTP extensions that solve thes | ||||
e problems. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3230"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3230"/> | ||||
</reference> | ||||
<reference anchor="RFC9112"> | ||||
<front> | ||||
<title>HTTP/1.1</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="R | ||||
eschke"/> | ||||
<date month="June" year="2022"/> | ||||
<abstract> | ||||
<t>The Hypertext Transfer Protocol (HTTP) is a stateless applicati | ||||
on-level protocol for distributed, collaborative, hypertext information systems. | ||||
This document specifies the HTTP/1.1 message syntax, message parsing, connectio | ||||
n management, and related security concerns.</t> | ||||
<t>This document obsoletes portions of RFC 7230.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="STD" value="99"/> | ||||
<seriesInfo name="RFC" value="9112"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9112"/> | ||||
</reference> | ||||
<reference anchor="PATCH"> | ||||
<front> | ||||
<title>PATCH Method for HTTP</title> | ||||
<author fullname="L. Dusseault" initials="L." surname="Dusseault"/> | ||||
<author fullname="J. Snell" initials="J." surname="Snell"/> | ||||
<date month="March" year="2010"/> | ||||
<abstract> | ||||
<t>Several applications extending the Hypertext Transfer Protocol | ||||
(HTTP) require a feature to do partial resource modification. The existing HTTP | ||||
PUT method only allows a complete replacement of a document. This proposal adds | ||||
a new HTTP method, PATCH, to modify an existing HTTP resource. [STANDARDS-TRACK] | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5789"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5789"/> | ||||
</reference> | ||||
<reference anchor="NO-MD5"> | ||||
<front> | ||||
<title>Updated Security Considerations for the MD5 Message-Digest an | ||||
d the HMAC-MD5 Algorithms</title> | ||||
<author fullname="S. Turner" initials="S." surname="Turner"/> | ||||
<author fullname="L. Chen" initials="L." surname="Chen"/> | ||||
<date month="March" year="2011"/> | ||||
<abstract> | ||||
<t>This document updates the security considerations for the MD5 m | ||||
essage digest algorithm. It also updates the security considerations for HMAC-MD | ||||
5. This document is not an Internet Standards Track specification; it is publish | ||||
ed for informational purposes.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6151"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6151"/> | ||||
</reference> | ||||
<reference anchor="NO-SHA"> | ||||
<front> | ||||
<title>Security Considerations for the SHA-0 and SHA-1 Message-Diges | ||||
t Algorithms</title> | ||||
<author fullname="T. Polk" initials="T." surname="Polk"/> | ||||
<author fullname="L. Chen" initials="L." surname="Chen"/> | ||||
<author fullname="S. Turner" initials="S." surname="Turner"/> | ||||
<author fullname="P. Hoffman" initials="P." surname="Hoffman"/> | ||||
<date month="March" year="2011"/> | ||||
<abstract> | ||||
<t>This document includes security considerations for the SHA-0 an | ||||
d SHA-1 message digest algorithm. This document is not an Internet Standards Tra | ||||
ck specification; it is published for informational purposes.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6194"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6194"/> | ||||
</reference> | ||||
<reference anchor="SIGNATURES"> | ||||
<front> | ||||
<title>HTTP Message Signatures</title> | ||||
<author fullname="Annabelle Backman" initials="A." surname="Backman" | ||||
> | ||||
<organization>Amazon</organization> | ||||
</author> | ||||
<author fullname="Justin Richer" initials="J." surname="Richer"> | ||||
<organization>Bespoke Engineering</organization> | ||||
</author> | ||||
<author fullname="Manu Sporny" initials="M." surname="Sporny"> | ||||
<organization>Digital Bazaar</organization> | ||||
</author> | ||||
<date day="2" month="May" year="2023"/> | ||||
<abstract> | ||||
<t> This document describes a mechanism for creating, encoding, | ||||
and | ||||
verifying digital signatures or message authentication codes over | ||||
components of an HTTP message. This mechanism supports use cases | ||||
where the full HTTP message may not be known to the signer, and where | ||||
the message may be transformed (e.g., by intermediaries) before | ||||
reaching the verifier. This document also describes a means for | ||||
requesting that a signature be applied to a subsequent HTTP message | ||||
in an ongoing HTTP exchange. | ||||
</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3230.xml" | |||
</abstract> | /> | |||
</front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9112.xml" | |||
<seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-message-si | /> | |||
gnatures-17"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5789.xml" | |||
</reference> | /> | |||
<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="edito | ||||
r"> | ||||
<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"> | <reference anchor="UNIX"> | |||
<front> | <front> | |||
<title>The Single UNIX Specification, Version 2 - 6 Vol Set for UNIX 98</title> | <title>The Single UNIX Specification, Version 2 - 6 Vol Set for UNIX 98</title> | |||
<author> | <author> | |||
<organization>The Open Group</organization> | <organization>The Open Group</organization> | |||
</author> | </author> | |||
<date year="1997" month="February"/> | <date year="1998" month="January"/> | |||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="NIST800-32" target="https://nvlpubs.nist.gov/nistpubs | ||||
/Legacy/SP/nistspecialpublication800-32.pdf"> | <reference anchor="FIPS186-5" target="https://nvlpubs.nist.gov/nistpubs/ | |||
FIPS/NIST.FIPS.186-5.pdf"> | ||||
<front> | <front> | |||
<title>Introduction to Public Key Technology and the Federal PKI Inf rastructure</title> | <title>Digital Signature Standard (DSS)</title> | |||
<author> | <author> | |||
<organization>National Institute of Standards and Technology, U.S. Department of Commerce</organization> | <organization>National Institute of Standards and Technology (NIST )</organization> | |||
</author> | </author> | |||
<date year="2001" month="February"/> | <date year="2023" month="February"/> | |||
</front> | </front> | |||
<seriesInfo name="FIPS PUB" value="186-5"/> | ||||
<seriesInfo name="DOI" value="10.6028/NIST.FIPS.186-5"/> | ||||
</reference> | </reference> | |||
<reference anchor="CMU-836068" target="https://www.kb.cert.org/vuls/id/8 36068/"> | <reference anchor="CMU-836068" target="https://www.kb.cert.org/vuls/id/8 36068/"> | |||
<front> | <front> | |||
<title>MD5 Vulnerable to collision attacks</title> | <title>MD5 vulnerable to collision attacks</title> | |||
<author> | <author> | |||
<organization>Carnegie Mellon University, Software Engineering Ins titute</organization> | <organization>Carnegie Mellon University, Software Engineering Ins titute</organization> | |||
</author> | </author> | |||
<date year="2008" month="December" day="31"/> | <date year="2008" month="December"/> | |||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="IACR-2020-014" target="https://eprint.iacr.org/2020/0 14.pdf"> | <reference anchor="IACR-2020-014" target="https://eprint.iacr.org/2020/0 14.pdf"> | |||
<front> | <front> | |||
<title>SHA-1 is a Shambles</title> | <title>SHA-1 is a Shambles</title> | |||
<author initials="G." surname="Leurent"> | <author initials="G." surname="Leurent"> | |||
<organization>Inria, France</organization> | ||||
</author> | </author> | |||
<author initials="T." surname="Peyrin"> | <author initials="T." surname="Peyrin"> | |||
<organization>Nanyang Technological University, Singapore; Temasek Laboratories, Singapore</organization> | ||||
</author> | </author> | |||
<date year="2020" month="January" day="05"/> | <date year="2020" month="January"/> | |||
</front> | ||||
</reference> | ||||
<reference anchor="TLS"> | ||||
<front> | ||||
<title>The Transport Layer Security (TLS) Protocol Version 1.3</titl | ||||
e> | ||||
<author fullname="E. Rescorla" initials="E." surname="Rescorla"/> | ||||
<date month="August" year="2018"/> | ||||
<abstract> | ||||
<t>This document specifies version 1.3 of the Transport Layer Secu | ||||
rity (TLS) protocol. TLS allows client/server applications to communicate over t | ||||
he Internet in a way that is designed to prevent eavesdropping, tampering, and m | ||||
essage forgery.</t> | ||||
<t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 50 | ||||
77, 5246, and 6961. This document also specifies new requirements for TLS 1.2 im | ||||
plementations.</t> | ||||
</abstract> | ||||
</front> | </front> | |||
<seriesInfo name="RFC" value="8446"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8446"/> | ||||
</reference> | </reference> | |||
<reference anchor="I-D.thomson-http-mice"> | ||||
<front> | ||||
<title>Merkle Integrity Content Encoding</title> | ||||
<author fullname="Martin Thomson" initials="M." surname="Thomson"> | ||||
<organization>Mozilla</organization> | ||||
</author> | ||||
<author fullname="Jeffrey Yasskin" initials="J." surname="Yasskin"> | ||||
<organization>Google</organization> | ||||
</author> | ||||
<date day="13" month="August" year="2018"/> | ||||
<abstract> | ||||
<t> This memo introduces a content-coding for HTTP that provides | ||||
progressive integrity for message contents. This integrity | ||||
protection can be evaluated on a partial representation, allowing a | ||||
recipient to process a message as it is delivered while retaining | ||||
strong integrity protection. | ||||
</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml" | |||
</abstract> | /> | |||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-thomson-http-mice-03"/> | <!-- [I-D.thomson-http-mice] IESG state Expired --> | |||
</reference> | ||||
<reference anchor="RFC8188"> | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D.thomson | |||
<front> | -http-mice.xml"/> | |||
<title>Encrypted Content-Encoding for HTTP</title> | ||||
<author fullname="M. Thomson" initials="M." surname="Thomson"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8188.xml" | |||
<date month="June" year="2017"/> | /> | |||
<abstract> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7696.xml" | |||
<t>This memo introduces a content coding for HTTP that allows mess | /> | |||
age payloads to be encrypted.</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6211.xml" | |||
</abstract> | /> | |||
</front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9260.xml" | |||
<seriesInfo name="RFC" value="8188"/> | /> | |||
<seriesInfo name="DOI" value="10.17487/RFC8188"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7396.xml" | |||
</reference> | /> | |||
<reference anchor="RFC7696"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml" | |||
<front> | /> | |||
<title>Guidelines for Cryptographic Algorithm Agility and Selecting | ||||
Mandatory-to-Implement Algorithms</title> | </references> | |||
<author fullname="R. Housley" initials="R." surname="Housley"/> | ||||
<date month="November" year="2015"/> | ||||
<abstract> | ||||
<t>Many IETF protocols use cryptographic algorithms to provide con | ||||
fidentiality, integrity, authentication, or digital signature. Communicating pee | ||||
rs must support a common set of cryptographic algorithms for these mechanisms to | ||||
work properly. This memo provides guidelines to ensure that protocols have the | ||||
ability to migrate from one mandatory-to-implement algorithm suite to another ov | ||||
er time.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="201"/> | ||||
<seriesInfo name="RFC" value="7696"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7696"/> | ||||
</reference> | ||||
<reference anchor="RFC6211"> | ||||
<front> | ||||
<title>Cryptographic Message Syntax (CMS) Algorithm Identifier Prote | ||||
ction Attribute</title> | ||||
<author fullname="J. Schaad" initials="J." surname="Schaad"/> | ||||
<date month="April" year="2011"/> | ||||
<abstract> | ||||
<t>The Cryptographic Message Syntax (CMS), unlike X.509/PKIX certi | ||||
ficates, is vulnerable to algorithm substitution attacks. In an algorithm substi | ||||
tution attack, the attacker changes either the algorithm being used or the param | ||||
eters of the algorithm in order to change the result of a signature verification | ||||
process. In X.509 certificates, the signature algorithm is protected because it | ||||
is duplicated in the TBSCertificate.signature field with the proviso that the v | ||||
alidator is to compare both fields as part of the signature validation process. | ||||
This document defines a new attribute that contains a copy of the relevant algor | ||||
ithm identifiers so that they are protected by the signature or authentication p | ||||
rocess. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6211"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6211"/> | ||||
</reference> | ||||
<reference anchor="RFC9260"> | ||||
<front> | ||||
<title>Stream Control Transmission Protocol</title> | ||||
<author fullname="R. Stewart" initials="R." surname="Stewart"/> | ||||
<author fullname="M. Tüxen" initials="M." surname="Tüxen"/> | ||||
<author fullname="K. Nielsen" initials="K." surname="Nielsen"/> | ||||
<date month="June" year="2022"/> | ||||
<abstract> | ||||
<t>This document describes the Stream Control Transmission Protoco | ||||
l (SCTP) and obsoletes RFC 4960. It incorporates the specification of the chunk | ||||
flags registry from RFC 6096 and the specification of the I bit of DATA chunks f | ||||
rom RFC 7053. Therefore, RFCs 6096 and 7053 are also obsoleted by this document. | ||||
In addition, RFCs 4460 and 8540, which describe errata for SCTP, are obsoleted | ||||
by this document.</t> | ||||
<t>SCTP was originally designed to transport Public Switched Telep | ||||
hone Network (PSTN) signaling messages over IP networks. It is also suited to be | ||||
used for other applications, for example, WebRTC.</t> | ||||
<t>SCTP is a reliable transport protocol operating on top of a con | ||||
nectionless packet network, such as IP. It offers the following services to its | ||||
users:</t> | ||||
<t>The design of SCTP includes appropriate congestion avoidance be | ||||
havior and resistance to flooding and masquerade attacks.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="9260"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9260"/> | ||||
</reference> | ||||
<reference anchor="RFC7396"> | ||||
<front> | ||||
<title>JSON Merge Patch</title> | ||||
<author fullname="P. Hoffman" initials="P." surname="Hoffman"/> | ||||
<author fullname="J. Snell" initials="J." surname="Snell"/> | ||||
<date month="October" year="2014"/> | ||||
<abstract> | ||||
<t>This specification defines the JSON merge patch format and proc | ||||
essing rules. The merge patch format is primarily intended for use with the HTTP | ||||
PATCH method as a means of describing a set of modifications to a target resour | ||||
ce's content.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7396"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7396"/> | ||||
</reference> | ||||
<reference anchor="RFC7807"> | ||||
<front> | ||||
<title>Problem Details for HTTP APIs</title> | ||||
<author fullname="M. Nottingham" initials="M." surname="Nottingham"/ | ||||
> | ||||
<author fullname="E. Wilde" initials="E." surname="Wilde"/> | ||||
<date month="March" year="2016"/> | ||||
<abstract> | ||||
<t>This document defines a "problem detail" as a way to carry mach | ||||
ine- readable details of errors in a HTTP response to avoid the need to define n | ||||
ew error response formats for HTTP APIs.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7807"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7807"/> | ||||
</reference> | ||||
</references> | </references> | |||
</references> | ||||
<?line 722?> | <?line 722?> | |||
<section anchor="resource-representation"> | <section anchor="resource-representation"> | |||
<name>Resource Representation and Representation Data</name> | <name>Resource Representation and Representation Data</name> | |||
<t>This section following examples show how representation metadata, conte | <t>The following examples show how representation metadata, content | |||
nt | transformations, and methods impact the message and content. These examples a | |||
transformations, and method impacts on the message and content. These examples a | ||||
not exhaustive.</t> | not exhaustive.</t> | |||
<t>Unless otherwise indicated, the examples are based on the JSON object < tt>{"hello": | <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 charact ers | "world"}</tt> followed by an LF. When the content contains non-printable charact ers | |||
(e.g., when it is encoded) it is shown as a sequence of hex-encoded bytes.</t> | (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 met | <t>Consider a client that wishes to upload a JSON object using the PUT met | |||
hod. It | hod. | |||
could do this using the application/json content type without any content | ||||
It | ||||
could do this using the application/json <tt>Content-Type</tt> without any conte | ||||
nt | ||||
coding.</t> | coding.</t> | |||
<figure> | <figure> | |||
<name>Request containing a JSON object without any content coding</name> | <name>Request Containing a JSON Object without Any Content Coding</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
PUT /entries/1234 HTTP/1.1 | PUT /entries/1234 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Length: 19 | Content-Length: 19 | |||
{"hello": "world"} | {"hello": "world"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>However, the use of content coding is quite common. The client could al so upload | <t>However, the use of content coding is quite common. The client could al so upload | |||
the same data with a gzip coding (<xref section="8.4.1.3" sectionFormat="of" tar get="RFC9110"/>). Note that in | the same data with a GZIP coding (<xref section="8.4.1.3" sectionFormat="of" tar get="RFC9110"/>). Note that in | |||
this case, the <tt>Content-Length</tt> contains a larger value due to the coding | this case, the <tt>Content-Length</tt> contains a larger value due to the coding | |||
overheads.</t> | overheads.</t> | |||
<figure anchor="ex-put-gz"> | <figure anchor="ex-put-gz"> | |||
<name>Request containing a gzip-encoded JSON object</name> | <name>Request Containing a GZIP-Encoded JSON Object</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
PUT /entries/1234 HTTP/1.1 | PUT /entries/1234 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Encoding: gzip | Content-Encoding: gzip | |||
Content-Length: 39 | Content-Length: 39 | |||
1F 8B 08 00 88 41 37 64 00 FF | 1F 8B 08 00 88 41 37 64 00 FF | |||
AB 56 CA 48 CD C9 C9 57 B2 52 | AB 56 CA 48 CD C9 C9 57 B2 52 | |||
50 2A CF 2F CA 49 51 AA E5 02 | 50 2A CF 2F CA 49 51 AA E5 02 | |||
00 D9 E4 31 E7 13 00 00 00 | 00 D9 E4 31 E7 13 00 00 00 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>Sending the gzip coded data without indicating it via <tt>Content-Encod ing</tt> means | <t>Sending the GZIP-coded data without indicating it via <tt>Content-Encod ing</tt> means | |||
that the content is malformed. In this case, the server can reply with an error. </t> | that the content is malformed. In this case, the server can reply with an error. </t> | |||
<figure> | <figure> | |||
<name>Request containing malformed JSON</name> | <name>Request Containing Malformed JSON</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
PUT /entries/1234 HTTP/1.1 | PUT /entries/1234 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Length: 39 | Content-Length: 39 | |||
1F 8B 08 00 88 41 37 64 00 FF | 1F 8B 08 00 88 41 37 64 00 FF | |||
AB 56 CA 48 CD C9 C9 57 B2 52 | AB 56 CA 48 CD C9 C9 57 B2 52 | |||
50 2A CF 2F CA 49 51 AA E5 02 | 50 2A CF 2F CA 49 51 AA E5 02 | |||
00 D9 E4 31 E7 13 00 00 00 | 00 D9 E4 31 E7 13 00 00 00 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>An error response for a malformed content</name> | <name>An Error Response for Malformed Content</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>A Range-Request affects the transferred message content. In this exampl e, the | <t>A Range-Request affects the transferred message content. In this exampl e, the | |||
client is accessing the resource at <tt>/entries/1234</tt>, which is the JSON ob ject | client is accessing the resource at <tt>/entries/1234</tt>, which is the JSON ob ject | |||
<tt>{"hello": "world"}</tt> followed by an LF. However, the client has indicated a | <tt>{"hello": "world"}</tt> followed by an LF. However, the client has indicated a | |||
preferred content coding and a specific byte range.</t> | preferred content coding and a specific byte range.</t> | |||
<figure> | <figure> | |||
<name>Request for partial content</name> | <name>Request for Partial Content</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
GET /entries/1234 HTTP/1.1 | GET /entries/1234 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Accept-Encoding: gzip | Accept-Encoding: gzip | |||
Range: bytes=1-7 | Range: bytes=1-7 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>The server satisfies the client request by responding with a partial | <t>The server satisfies the client request by responding with a partial | |||
representation (equivalent to the first 10 of the JSON object displayed in whole | representation (equivalent to the first 10 bytes of the JSON object displayed in whole | |||
in <xref target="ex-put-gz"/>).</t> | in <xref target="ex-put-gz"/>).</t> | |||
<figure> | <figure> | |||
<name>Partial response from a gzip-encoded representation</name> | <name>Partial Response from a GZIP-Encoded Representation</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 206 Partial Content | HTTP/1.1 206 Partial Content | |||
Content-Encoding: gzip | Content-Encoding: gzip | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Range: bytes 0-9/39 | Content-Range: bytes 0-9/39 | |||
1F 8B 08 00 A5 B4 BD 62 02 FF | 1F 8B 08 00 A5 B4 BD 62 02 FF | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>Aside from content coding or range requests, the method can also affect the | <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 | transferred message content. For example, the response to a HEAD request does | |||
not carry content but in this example case does include a Content-Length; see | not carry content, but this example case includes <tt>Content-Length</tt>; see | |||
<xref section="8.6" sectionFormat="of" target="RFC9110"/>.</t> | <xref section="8.6" sectionFormat="of" target="RFC9110"/>.</t> | |||
<figure> | <figure> | |||
<name>HEAD request</name> | <name>HEAD Request</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HEAD /entries/1234 HTTP/1.1 | HEAD /entries/1234 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Accept: application/json | Accept: application/json | |||
Accept-Encoding: gzip | Accept-Encoding: gzip | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response to HEAD request (empty content)</name> | <name>Response to HEAD Request (Empty Content)</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Encoding: gzip | Content-Encoding: gzip | |||
Content-Length: 39 | Content-Length: 39 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>Finally, the semantics of a response might decouple the target URI | <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 | 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-L | request directed to <tt>/authors/</tt>, but the response includes a <tt>Content- | |||
ocation</tt> | Location</tt> | |||
header field that indicates the enclosed representation refers to the | header field indicating that the enclosed representation refers to the | |||
resource available at <tt>/authors/123</tt>. Note that <tt>Content-Length</tt> i s not sent | resource available at <tt>/authors/123</tt>. Note that <tt>Content-Length</tt> i s not sent | |||
in this example.</t> | in this example.</t> | |||
<figure> | <figure> | |||
<name>POST request</name> | <name>POST Request</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
POST /authors/ HTTP/1.1 | POST /authors/ HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Accept: application/json | Accept: application/json | |||
Content-Type: application/json | Content-Type: application/json | |||
{"author": "Camilleri"} | {"author": "Camilleri"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with Content-Location header</name> | <name>Response with Content-Location Header</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Location: /authors/123 | Content-Location: /authors/123 | |||
Location: /authors/123 | Location: /authors/123 | |||
{"id": "123", "author": "Camilleri"} | {"id": "123", "author": "Camilleri"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="examples-unsolicited"> | <section anchor="examples-unsolicited"> | |||
<name>Examples of Unsolicited Digest</name> | <name>Examples of Unsolicited <tt>Digest</tt></name> | |||
<t>The following examples demonstrate interactions where a server responds with a | <t>The following examples demonstrate interactions where a server responds with a | |||
<tt>Content-Digest</tt> or <tt>Repr-Digest</tt> fields even though the client di d not solicit one using | <tt>Content-Digest</tt> or <tt>Repr-Digest</tt> field, even though the client di d not solicit one using | |||
<tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt>.</t> | <tt>Want-Content-Digest</tt> or <tt>Want-Repr-Digest</tt>.</t> | |||
<t>Some examples include JSON objects in the content. | <t>Some examples include JSON objects in the content. | |||
For presentation purposes, objects that fit completely within the line-length li mits | For presentation purposes, objects that fit completely within the line-length li mits | |||
are presented on a single line using compact notation with no leading space. | 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 | Objects that would exceed line-length limits are presented across multiple lines | |||
(one line per key-value pair) with 2 spaces of leading indentation.</t> | (one line per key-value pair) with two spaces of leading indentation.</t> | |||
<t>Checksum mechanisms defined in this document are media-type agnostic | <t>Checksum mechanisms defined in this document are media-type agnostic | |||
and do not provide canonicalization algorithms for specific formats. | and do not provide canonicalization algorithms for specific formats. | |||
Examples are calculated inclusive of any space. | Examples are calculated inclusive of any space. | |||
While examples can include both fields, | While examples can include both fields, | |||
<tt>Content-Digest</tt> and <tt>Repr-Digest</tt> can be returned independently.< /t> | <tt>Content-Digest</tt> and <tt>Repr-Digest</tt> can be returned independently.< /t> | |||
<section anchor="example-full-representation"> | <section anchor="example-full-representation"> | |||
<name>Server Returns Full Representation Data</name> | <name>Server Returns Full Representation Data</name> | |||
<t>In this example, the message content conveys complete representation data. | <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 > | 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 a n LF, and thus have the same value.</t> | are both computed over the JSON object <tt>{"hello": "world"}</tt> followed by a n LF; thus, they have the same value.</t> | |||
<figure> | <figure> | |||
<name>GET request for an item</name> | <name>GET Request for an Item</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
GET /items/123 HTTP/1.1 | GET /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with identical Repr-Digest and Content-Digest</name> | <name>Response with Identical <tt>Repr-Digest</tt> and <tt>Content-Dig est</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Length: 19 | Content-Length: 19 | |||
Content-Digest: \ | Content-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | |||
skipping to change at line 1361 ¶ | skipping to change at line 1018 ¶ | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="server-returns-no-representation-data"> | <section anchor="server-returns-no-representation-data"> | |||
<name>Server Returns No Representation Data</name> | <name>Server Returns No Representation Data</name> | |||
<t>In this example, a HEAD request is used to retrieve the checksum | <t>In this example, a HEAD request is used to retrieve the checksum | |||
of a resource.</t> | of a resource.</t> | |||
<t>The response <tt>Content-Digest</tt> field-value is computed on empty content. | <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>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> | <tt>{"hello": "world"}</tt> followed by an LF, which is not shown because there is no content.</t> | |||
<figure> | <figure> | |||
<name>HEAD request for an item</name> | <name>HEAD Request for an Item</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HEAD /items/123 HTTP/1.1 | HEAD /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with both Content-Digest and Digest; empty content</nam e> | <name>Response with Both <tt>Content-Digest</tt> and <tt>Digest</tt> ( Empty Content)</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Digest: \ | Content-Digest: \ | |||
sha-256=:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=: | sha-256=:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=: | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="server-returns-partial-representation-data"> | <section anchor="server-returns-partial-representation-data"> | |||
<name>Server Returns Partial Representation Data</name> | <name>Server Returns Partial Representation Data</name> | |||
<t>In this example, the client makes a range request and the server resp onds with | <t>In this example, the client makes a range request and the server resp onds with | |||
partial content.</t> | partial content.</t> | |||
<figure> | <figure> | |||
<name>Request for partial content</name> | <name>Request for Partial Content</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
GET /items/123 HTTP/1.1 | GET /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Range: bytes=10-18 | Range: bytes=10-18 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Partial response with both Content-Digest and Repr-Digest</name> | <name>Partial Response with Both <tt>Content-Digest</tt> and <tt>Repr- Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
HTTP/1.1 206 Partial Content | HTTP/1.1 206 Partial Content | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Range: bytes 10-18/19 | Content-Range: bytes 10-18/19 | |||
Content-Digest: \ | Content-Digest: \ | |||
sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=: | sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=: | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | |||
"world"} | "world"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>In the response message above, note that the | <t>In the response message above, note that the | |||
<tt>Repr-Digest</tt> and <tt>Content-Digests</tt> are different. | <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 | 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 is</t> | <tt>{"hello": "world"}</tt> followed by an LF, and the field appears as follows: </t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | |||
]]></sourcecode> | ]]></sourcecode> | |||
<t>However, since the message content is constrained to bytes 10-18, | <t>However, since the message content is constrained to bytes 10-18, | |||
the <tt>Content-Digest</tt> field-value is calculated over the | the <tt>Content-Digest</tt> field-value is calculated over the | |||
sequence <tt>"world"}</tt> followed by an LF, thus resulting in</t> | sequence <tt>"world"}</tt> followed by an LF, thus resulting in the following:< /t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
Content-Digest: \ | Content-Digest: \ | |||
sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=: | sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=: | |||
]]></sourcecode> | ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="client-and-server-provide-full-representation-data"> | <section anchor="client-and-server-provide-full-representation-data"> | |||
<name>Client and Server Provide Full Representation Data</name> | <name>Client and Server Provide Full Representation Data</name> | |||
<t>The request contains a <tt>Repr-Digest</tt> field-value calculated on the enclosed | <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 th at advertises the | representation. It also includes an <tt>Accept-Encoding: br</tt> header field th at advertises that the | |||
client supports Brotli encoding.</t> | client supports Brotli encoding.</t> | |||
<t>The response includes a <tt>Content-Encoding: br</tt> that indicates the selected | <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 theref ore | representation is Brotli-encoded. The <tt>Repr-Digest</tt> field-value is theref ore | |||
different compared to the request.</t> | different compared to the request.</t> | |||
<t>For presentation purposes, the response body is displayed as a sequen ce of | <t>For presentation purposes, the response body is displayed as a sequen ce of | |||
hex-encoded bytes because it contains non-printable characters.</t> | hex-encoded bytes because it contains non-printable characters.</t> | |||
<figure> | <figure> | |||
<name>PUT Request with Digest</name> | <name>PUT Request with <tt>Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
PUT /items/123 HTTP/1.1 | PUT /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Content-Type: application/json | Content-Type: application/json | |||
Accept-Encoding: br | Accept-Encoding: br | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg=: | |||
{"hello": "world"} | {"hello": "world"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with Digest of encoded response</name> | <name>Response with <tt>Digest</tt> of Encoded Response</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Location: /items/123 | Content-Location: /items/123 | |||
Content-Encoding: br | Content-Encoding: br | |||
Content-Length: 23 | Content-Length: 23 | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=: | sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=: | |||
8B 08 80 7B 22 68 65 6C 6C 6F | 8B 08 80 7B 22 68 65 6C 6C 6F | |||
22 3A 20 22 77 6F 72 6C 64 22 | 22 3A 20 22 77 6F 72 6C 64 22 | |||
7D 0A 03 | 7D 0A 03 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="client-provides-full-representation-data-server-provides- no-representation-data"> | <section anchor="client-provides-full-representation-data-server-provides- no-representation-data"> | |||
<name>Client Provides Full Representation Data, Server Provides No Repre sentation Data</name> | <name>Client Provides Full Representation Data and Server Provides No Re presentation Data</name> | |||
<t>The request <tt>Repr-Digest</tt> field-value is calculated on the enc losed content, which | <t>The request <tt>Repr-Digest</tt> field-value is calculated on the enc losed content, which | |||
is the JSON object <tt>{"hello": "world"}</tt> followed by an LF</t> | is the JSON object <tt>{"hello": "world"}</tt> followed by an LF.</t> | |||
<t>The response <tt>Repr-Digest</tt> field-value | <t>The response <tt>Repr-Digest</tt> field-value | |||
depends on the representation metadata header fields, including | depends on the representation metadata header fields, including | |||
<tt>Content-Encoding: br</tt> even when the response does not contain content.</ t> | <tt>Content-Encoding: br</tt>, even when the response does not contain content.< /t> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
PUT /items/123 HTTP/1.1 | PUT /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Length: 19 | Content-Length: 19 | |||
Accept-Encoding: br | Accept-Encoding: br | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==: | |||
{"hello": "world"} | {"hello": "world"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
<figure> | <figure> | |||
<name>Empty response with Digest</name> | <name>Empty Response with <tt>Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 204 No Content | HTTP/1.1 204 No Content | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Encoding: br | Content-Encoding: br | |||
Repr-Digest: sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=: | Repr-Digest: sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=: | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="client-and-server-provide-full-representation-data-1"> | <section anchor="client-and-server-provide-full-representation-data-1"> | |||
<name>Client and Server Provide Full Representation Data</name> | <name>Client and Server Provide Full Representation Data</name> | |||
<t>The response contains two digest values using different algorithms.</ t> | <t>The response contains two digest values using different algorithms.</ t> | |||
<t>For presentation purposes, the response body is displayed as a sequen ce of | <t>For presentation purposes, the response body is displayed as a sequen ce of | |||
hex-encoded bytes because it contains non-printable characters.</t> | hex-encoded bytes because it contains non-printable characters.</t> | |||
<figure> | <figure> | |||
<name>PUT Request with Digest</name> | <name>PUT Request with <tt>Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
PUT /items/123 HTTP/1.1 | PUT /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Content-Type: application/json | Content-Type: application/json | |||
Accept-Encoding: br | Accept-Encoding: br | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==: | |||
{"hello": "world"} | {"hello": "world"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with Digest of Encoded Content</name> | <name>Response with <tt>Digest</tt> of Encoded Content</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Encoding: br | Content-Encoding: br | |||
Content-Location: /items/123 | Content-Location: /items/123 | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\ | sha-256=:d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk=:,\ | |||
sha-512=:db7fdBbgZMgX1Wb2MjA8zZj+rSNgfmDCEEXM8qLWfpfoNY0sCpHAzZbj\ | sha-512=:db7fdBbgZMgX1Wb2MjA8zZj+rSNgfmDCEEXM8qLWfpfoNY0sCpHAzZbj\ | |||
09X1/7HAb7Od5Qfto4QpuBsFbUO3dQ==: | 09X1/7HAb7Od5Qfto4QpuBsFbUO3dQ==: | |||
8B 08 80 7B 22 68 65 6C 6C 6F | 8B 08 80 7B 22 68 65 6C 6C 6F | |||
22 3A 20 22 77 6F 72 6C 64 22 | 22 3A 20 22 77 6F 72 6C 64 22 | |||
7D 0A 03 | 7D 0A 03 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="post-not-request-uri"> | <section anchor="post-not-request-uri"> | |||
<name>POST Response does not Reference the Request URI</name> | <name>POST Response Does Not Reference the Request URI</name> | |||
<t>The request <tt>Repr-Digest</tt> field-value is computed on the enclo sed representation | <t>The request <tt>Repr-Digest</tt> field-value is computed on the enclo sed representation | |||
(see <xref target="state-changing-requests"/>), which is the JSON object <tt>{"t itle": "New | (see <xref target="state-changing-requests"/>), which is the JSON object <tt>{"t itle": "New | |||
Title"}</tt> followed by an LF.</t> | Title"}</tt> followed by an LF.</t> | |||
<t>The representation enclosed in the response is a multiline JSON objec t followed by an LF. | <t>The representation enclosed in the response is a multiline JSON objec t followed by an LF. | |||
It refers to the resource identified by | It refers to the resource identified by | |||
<tt>Content-Location</tt> (see <xref section="6.4.2" sectionFormat="of" target=" RFC9110"/>); | <tt>Content-Location</tt> (see <xref section="6.4.2" sectionFormat="of" target=" RFC9110"/>); | |||
an application can thus use <tt>Repr-Digest</tt> in association with the resourc e | thus, an application can use <tt>Repr-Digest</tt> in association with the resour ce | |||
referenced by <tt>Content-Location</tt>.</t> | referenced by <tt>Content-Location</tt>.</t> | |||
<figure> | <figure> | |||
<name>POST Request with Digest</name> | <name>POST Request with <tt>Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
POST /books HTTP/1.1 | POST /books HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Content-Type: application/json | Content-Type: application/json | |||
Accept: application/json | Accept: application/json | |||
Accept-Encoding: identity | Accept-Encoding: identity | |||
Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=: | Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=: | |||
{"title": "New Title"} | {"title": "New Title"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with Digest of Resource</name> | <name>Response with <tt>Digest</tt> of Resource</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
Content-Type: application/json | Content-Type: application/json | |||
Content-Location: /books/123 | Content-Location: /books/123 | |||
Location: /books/123 | Location: /books/123 | |||
Repr-Digest: sha-256=:uVSlinTTdQUwm2On4k8TJUikGN1bf/Ds8WPX4oe0h9I=: | Repr-Digest: sha-256=:uVSlinTTdQUwm2On4k8TJUikGN1bf/Ds8WPX4oe0h9I=: | |||
{ | { | |||
"id": "123", | "id": "123", | |||
"title": "New Title" | "title": "New Title" | |||
skipping to change at line 1597 ¶ | skipping to change at line 1250 ¶ | |||
<name>POST Response Describes the Request Status</name> | <name>POST Response Describes the Request Status</name> | |||
<t>The request <tt>Repr-Digest</tt> field-value is computed on the enclo sed representation (see | <t>The request <tt>Repr-Digest</tt> field-value is computed on the enclo sed representation (see | |||
<xref target="state-changing-requests"/>), which is the JSON object <tt>{"title" : "New | <xref target="state-changing-requests"/>), which is the JSON object <tt>{"title" : "New | |||
Title"}</tt> followed by an LF.</t> | Title"}</tt> followed by an LF.</t> | |||
<t>The representation enclosed in the response describes the status of t he request, | <t>The representation enclosed in the response describes the status of t he request, | |||
so <tt>Repr-Digest</tt> is computed on that enclosed representation. It is a mul tiline | so <tt>Repr-Digest</tt> is computed on that enclosed representation. It is a mul tiline | |||
JSON object followed by an LF.</t> | JSON object followed by an LF.</t> | |||
<t>Response <tt>Repr-Digest</tt> has no explicit relation with the resou rce referenced by | <t>Response <tt>Repr-Digest</tt> has no explicit relation with the resou rce referenced by | |||
<tt>Location</tt>.</t> | <tt>Location</tt>.</t> | |||
<figure> | <figure> | |||
<name>POST Request with Digest</name> | <name>POST Request with <tt>Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
POST /books HTTP/1.1 | POST /books HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Content-Type: application/json | Content-Type: application/json | |||
Accept: application/json | Accept: application/json | |||
Accept-Encoding: identity | Accept-Encoding: identity | |||
Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=: | Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=: | |||
{"title": "New Title"} | {"title": "New Title"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with Digest of Representation</name> | <name>Response with <tt>Digest</tt> of Representation</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
Content-Type: application/json | Content-Type: application/json | |||
Repr-Digest: sha-256=:yXIGDTN5VrfoyisKlXgRKUHHMs35SNtyC3szSz1dbO8=: | Repr-Digest: sha-256=:yXIGDTN5VrfoyisKlXgRKUHHMs35SNtyC3szSz1dbO8=: | |||
Location: /books/123 | Location: /books/123 | |||
{ | { | |||
"status": "created", | "status": "created", | |||
"id": "123", | "id": "123", | |||
"ts": 1569327729, | "ts": 1569327729, | |||
"instance": "/books/123" | "instance": "/books/123" | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="digest-with-patch"> | <section anchor="digest-with-patch"> | |||
<name>Digest with PATCH</name> | <name><tt>Digest</tt> with PATCH</name> | |||
<t>This case is analogous to a POST request where the target resource re flects the | <t>This case is analogous to a POST request where the target resource re flects the | |||
target URI.</t> | target URI.</t> | |||
<t>The PATCH request uses the <tt>application/merge-patch+json</tt> medi a type defined in | <t>The PATCH request uses the <tt>application/merge-patch+json</tt> medi a type defined in | |||
<xref target="RFC7396"/>. <tt>Repr-Digest</tt> is calculated on the content, whi ch corresponds to the | <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 b y an | patch document and is the JSON object <tt>{"title": "New Title"}</tt> followed b y an | |||
LF.</t> | LF.</t> | |||
<t>The response <tt>Repr-Digest</tt> field-value is computed on the comp lete representation of the patched | <t>The response <tt>Repr-Digest</tt> field-value is computed on the comp lete representation of the patched | |||
resource. It is a multiline JSON object followed by an LF.</t> | resource. It is a multiline JSON object followed by an LF.</t> | |||
<figure anchor="fig-patch"> | <figure anchor="fig-patch"> | |||
<name>PATCH Request with Digest</name> | <name>PATCH Request with <tt>Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
PATCH /books/123 HTTP/1.1 | PATCH /books/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Content-Type: application/merge-patch+json | Content-Type: application/merge-patch+json | |||
Accept: application/json | Accept: application/json | |||
Accept-Encoding: identity | Accept-Encoding: identity | |||
Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=: | Repr-Digest: sha-256=:mEkdbO7Srd9LIOegftO0aBX+VPTVz7/CSHes2Z27gc4=: | |||
{"title": "New Title"} | {"title": "New Title"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with Digest of Representation</name> | <name>Response with <tt>Digest</tt> of Representation</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Repr-Digest: sha-256=:uVSlinTTdQUwm2On4k8TJUikGN1bf/Ds8WPX4oe0h9I=: | Repr-Digest: sha-256=:uVSlinTTdQUwm2On4k8TJUikGN1bf/Ds8WPX4oe0h9I=: | |||
{ | { | |||
"id": "123", | "id": "123", | |||
"title": "New Title" | "title": "New Title" | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>Note that a <tt>204 No Content</tt> response without content but with | <t>Note that a <tt>204 No Content</tt> response without content, but wit | |||
the same | h the same | |||
<tt>Repr-Digest</tt> field-value would have been legitimate too. | <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 conte nt.</t> | In that case, <tt>Content-Digest</tt> would have been computed on an empty conte nt.</t> | |||
</section> | </section> | |||
<section anchor="error-responses"> | <section anchor="error-responses"> | |||
<name>Error responses</name> | <name>Error Responses</name> | |||
<t>In error responses, the representation data does not necessarily refe r to the | <t>In error responses, the representation data does not necessarily refe r to the | |||
target resource. Instead, it refers to the representation of the error.</t> | 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 | <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 | 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 | and the server generates a 404 response with a body that describes the error in | |||
accordance with <xref target="RFC7807"/>.</t> | accordance with <xref target="RFC9457"/>.</t> | |||
<t>The response <tt>Repr-Digest</tt> field-value is computed on this enc losed representation. | <t>The response <tt>Repr-Digest</tt> field-value is computed on this enc losed representation. | |||
It is a multiline JSON object followed by an LF.</t> | It is a multiline JSON object followed by an LF.</t> | |||
<figure> | <figure> | |||
<name>Response with Digest of Error Representation</name> | <name>Response with <tt>Digest</tt> of Error Representation</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 404 Not Found | HTTP/1.1 404 Not Found | |||
Content-Type: application/problem+json | Content-Type: application/problem+json | |||
Repr-Digest: sha-256=:EXB0S2VF2H7ijkAVJkH1Sm0pBho0iDZcvVUHHXTTZSA=: | Repr-Digest: sha-256=:EXB0S2VF2H7ijkAVJkH1Sm0pBho0iDZcvVUHHXTTZSA=: | |||
{ | { | |||
"title": "Not Found", | "title": "Not Found", | |||
"detail": "Cannot PATCH a non-existent resource", | "detail": "Cannot PATCH a non-existent resource", | |||
"status": 404 | "status": 404 | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="use-with-trailer-fields-and-transfer-coding"> | <section anchor="use-with-trailer-fields-and-transfer-coding"> | |||
<name>Use with Trailer Fields and Transfer Coding</name> | <name>Use with Trailer Fields and Transfer Coding</name> | |||
<t>An origin server sends <tt>Repr-Digest</tt> as trailer field, so it c an calculate digest-value | <t>An origin server sends <tt>Repr-Digest</tt> as trailer field, so it c an calculate digest-value | |||
while streaming content and thus mitigate resource consumption. | while streaming content and thus mitigate resource consumption. | |||
The <tt>Repr-Digest</tt> field-value is the same as in <xref target="example-ful l-representation"/> because <tt>Repr-Digest</tt> is designed to | The <tt>Repr-Digest</tt> field-value is the same as in <xref target="example-ful l-representation"/> because <tt>Repr-Digest</tt> is designed to | |||
be independent of the use of one or more transfer codings (see <xref target="rep resentation-digest"/>).</t> | be independent of the use of one or more transfer codings (see <xref target="rep resentation-digest"/>).</t> | |||
<t>In the response content below, the string "\r\n" represent the bytes CRLF.</t> | <t>In the response content below, the string "\r\n" represents the CRLF bytes.</t> | |||
<figure> | <figure> | |||
<name>GET Request</name> | <name>GET Request</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
GET /items/123 HTTP/1.1 | GET /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Chunked Response with Digest</name> | <name>Chunked Response with <tt>Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Transfer-Encoding: chunked | Transfer-Encoding: chunked | |||
Trailer: Digest | Trailer: Repr-Digest | |||
8\r\n | 8\r\n | |||
{"hello"\r\n | {"hello"\r\n | |||
8\r\n | 8\r\n | |||
: "world\r\n | : "world\r\n | |||
3\r\n | 3\r\n | |||
"}\n\r\n | "}\n\r\n | |||
0\r\n | 0\r\n | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:\r\n | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:\r\n | |||
skipping to change at line 1725 ¶ | skipping to change at line 1377 ¶ | |||
8\r\n | 8\r\n | |||
{"hello"\r\n | {"hello"\r\n | |||
8\r\n | 8\r\n | |||
: "world\r\n | : "world\r\n | |||
3\r\n | 3\r\n | |||
"}\n\r\n | "}\n\r\n | |||
0\r\n | 0\r\n | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:\r\n | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==:\r\n | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="examples-solicited"> | <section anchor="examples-solicited"> | |||
<name>Examples of Want-Repr-Digest Solicited Digest</name> | <name>Examples of <tt>Want-Repr-Digest</tt> Solicited <tt>Digest</tt></nam e> | |||
<t>The following examples demonstrate interactions where a client solicits a | <t>The following examples demonstrate interactions where a client solicits a | |||
<tt>Repr-Digest</tt> using <tt>Want-Repr-Digest</tt>. | <tt>Repr-Digest</tt> using <tt>Want-Repr-Digest</tt>. | |||
The behavior of <tt>Content-Digest</tt> and <tt>Want-Content-Digest</tt> is iden tical.</t> | The behavior of <tt>Content-Digest</tt> and <tt>Want-Content-Digest</tt> is iden tical.</t> | |||
<t>Some examples include JSON objects in the content. | <t>Some examples include JSON objects in the content. | |||
For presentation purposes, objects that fit completely within the line-length li mits | For presentation purposes, objects that fit completely within the line-length li mits | |||
are presented on a single line using compact notation with no leading space. | 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 | Objects that would exceed line-length limits are presented across multiple lines | |||
(one line per key-value pair) with 2 spaces of leading indentation.</t> | (one line per key-value pair) with two spaces of leading indentation.</t> | |||
<t>Checksum mechanisms described in this document are media-type agnostic | <t>Checksum mechanisms described in this document are media-type agnostic | |||
and do not provide canonicalization algorithms for specific formats. | and do not provide canonicalization algorithms for specific formats. | |||
Examples are calculated inclusive of any space.</t> | Examples are calculated inclusive of any space.</t> | |||
<section anchor="server-selects-clients-least-preferred-algorithm"> | <section anchor="server-selects-clients-least-preferred-algorithm"> | |||
<name>Server Selects Client's Least Preferred Algorithm</name> | <name>Server Selects Client's Least Preferred Algorithm</name> | |||
<t>The client requests a digest, preferring "sha". The server is free to reply with | <t>The client requests a digest and prefers "sha". The server is free to reply with | |||
"sha-256" anyway.</t> | "sha-256" anyway.</t> | |||
<figure> | <figure> | |||
<name>GET Request with Want-Repr-Digest</name> | <name>GET Request with <tt>Want-Repr-Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
GET /items/123 HTTP/1.1 | GET /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Want-Repr-Digest: sha-256=3, sha=10 | Want-Repr-Digest: sha-256=3, sha=10 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with Different Algorithm</name> | <name>Response with Different Algorithm</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Repr-Digest: \ | Repr-Digest: \ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==: | |||
{"hello": "world"} | {"hello": "world"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="ex-server-selects-unsupported-algorithm"> | <section anchor="ex-server-selects-unsupported-algorithm"> | |||
<name>Server Selects Algorithm Unsupported by Client</name> | <name>Server Selects Algorithm Unsupported by Client</name> | |||
<t>The client requests a "sha" digest because that is the only algorithm it | <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" | supports. The server is not obliged to produce a response containing a "sha" | |||
digest, it instead uses a different algorithm.</t> | digest; it instead uses a different algorithm.</t> | |||
<figure> | <figure> | |||
<name>GET Request with Want-Repr-Digest</name> | <name>GET Request with <tt>Want-Repr-Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
GET /items/123 HTTP/1.1 | GET /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Want-Repr-Digest: sha=10 | Want-Repr-Digest: sha=10 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response with Unsupported Algorithm</name> | <name>Response with Unsupported Algorithm</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/json | Content-Type: application/json | |||
Repr-Digest: \ | Repr-Digest: \ | |||
skipping to change at line 1803 ¶ | skipping to change at line 1452 ¶ | |||
yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | |||
{"hello": "world"} | {"hello": "world"} | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="server-does-not-support-client-algorithm-and-returns-an-e rror"> | <section anchor="server-does-not-support-client-algorithm-and-returns-an-e rror"> | |||
<name>Server Does Not Support Client Algorithm and Returns an Error</nam e> | <name>Server Does Not Support Client Algorithm and Returns an Error</nam e> | |||
<t><xref target="ex-server-selects-unsupported-algorithm"/> is an exampl e where a server ignores | <t><xref target="ex-server-selects-unsupported-algorithm"/> is an exampl e where a server ignores | |||
the client's preferred digest algorithm. | the client's preferred digest algorithm. | |||
Alternatively a server can also reject | Alternatively, a server can also reject | |||
the request and return a response with | the request and return a response with | |||
error status code such as 4xx or 5xx. | an error status code such as 4xx or 5xx. | |||
This specification does not prescribe | This specification does not prescribe | |||
any requirement on status code selection; | any requirement on status code selection; | |||
the follow example illustrates one possible | the following example illustrates one possible | |||
option.</t> | option.</t> | |||
<t>In this example, the client requests a "sha" <tt>Repr-Digest</tt>, an d the server returns an | <t>In this example, the client requests a "sha" <tt>Repr-Digest</tt>, an d the server returns an | |||
error with problem details <xref target="RFC7807"/> contained in the content. Th e problem | error with problem details <xref target="RFC9457"/> contained in the content. Th e problem | |||
details contain a list of the hashing algorithms that the server supports. This | 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 | is purely an example; this specification does not define any format or | |||
requirements for such content.</t> | requirements for such content.</t> | |||
<figure> | <figure> | |||
<name>GET Request with Want-Repr-Digest</name> | <name>GET Request with <tt>Want-Repr-Digest</tt></name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
GET /items/123 HTTP/1.1 | GET /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
Want-Repr-Digest: sha=10 | Want-Repr-Digest: sha=10 | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure> | <figure> | |||
<name>Response advertising the supported algorithms</name> | <name>Response Advertising the Supported Algorithms</name> | |||
<sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
Content-Type: application/problem+json | Content-Type: application/problem+json | |||
{ | { | |||
"title": "Bad Request", | "title": "Bad Request", | |||
"detail": "Supported hashing algorithms: sha-256, sha-512", | "detail": "Supported hashing algorithms: sha-256, sha-512", | |||
"status": 400 | "status": 400 | |||
} | } | |||
]]></sourcecode> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sample-digest-values"> | <section anchor="sample-digest-values"> | |||
<name>Sample Digest Values</name> | <name>Sample <tt>Digest</tt> Values</name> | |||
<t>This section shows examples of digest values for different hashing algo rithms. | <t>This section shows examples of digest values for different hashing algo rithms. | |||
The input value is the JSON object <tt>{"hello": "world"}</tt>. The digest value s are | The input value is the JSON object <tt>{"hello": "world"}</tt>. The digest value s are | |||
each produced by running the relevant hashing algorithm over the input and | each produced by running the relevant hashing algorithm over the input and | |||
running the output bytes through <tt>Byte Sequence</tt> serialization; see <xref | running the output bytes through Byte Sequence serialization; see <xref section= | |||
section="4.1.8" sectionFormat="of" target="STRUCTURED-FIELDS"/>.</t> | "4.1.8" sectionFormat="of" target="RFC8941"/>.</t> | |||
<artwork><![CDATA[ | <sourcecode><![CDATA[ | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
sha-512 - :WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm+\ | sha-512 - :WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm+\ | |||
AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==: | AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==: | |||
sha-256 - :X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=: | sha-256 - :X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=: | |||
md5 - :Sd/dVLAcvNLSq16eXua5uQ==: | md5 - :Sd/dVLAcvNLSq16eXua5uQ==: | |||
sha - :07CavjDP4u3/TungoUHJO/Wzr4c=: | sha - :07CavjDP4u3/TungoUHJO/Wzr4c=: | |||
unixsum - :GQU=: | unixsum - :GQU=: | |||
unixcksum - :7zsHAA==: | unixcksum - :7zsHAA==: | |||
adler - :OZkGFw==: | adler - :OZkGFw==: | |||
crc32c - :Q3lHIA==: | crc32c - :Q3lHIA==: | |||
]]></artwork> | ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="migrating"> | <section anchor="migrating"> | |||
<name>Migrating from RFC 3230</name> | <name>Migrating from RFC 3230</name> | |||
<t>HTTP digests are computed by applying a hashing algorithm to input data . | <t>HTTP digests are computed by applying a hashing algorithm to input data . | |||
RFC 3230 defined the input data as an "instance", a term it also defined. | <xref target="RFC3230"/> defined the input data as an "instance", a term it also | |||
The concept of instance has since been superseded by the HTTP semantic term "rep | defined. | |||
resentation". | The concept of an instance has since been superseded by the HTTP semantic term " | |||
It is understood that some implementations of RFC 3230 | representation". | |||
It is understood that some implementations of <xref target="RFC3230"/> | ||||
mistook "instance" to mean HTTP content. | mistook "instance" to mean HTTP content. | |||
Using content for the Digest field is an error | Using content for the <tt>Digest</tt> field is an error | |||
that leads to interoperability problems between peers that implement RFC 3230.</ | that leads to interoperability problems between peers that implement <xref targe | |||
t> | t="RFC3230"/>.</t> | |||
<t>RFC 3230 was only ever intended | <t><xref target="RFC3230"/> was only ever intended | |||
to use what HTTP now defines as selected representation data. | to use what HTTP now defines as selected representation data. | |||
The semantic concept of digest and representation are explained | The semantic concept of digest and representation are explained | |||
alongside the definition of <xref target="representation-digest">the Repr-Digest | alongside the definition of the <tt>Repr-Digest</tt> field (<xref target="repres | |||
field</xref>.</t> | entation-digest"/>).</t> | |||
<t>While the syntax of Digest and Repr-Digest are different, | <t>While the syntax of <tt>Digest</tt> and <tt>Repr-Digest</tt> are differ | |||
the considerations and examples this document gives for Repr-Digest | ent, | |||
apply equally to Digest because they operate on the same input data; | 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 fo rmat="counter" target="security"/> and <xref format="counter" target="usage-in-s ignatures"/>.</t> | see Sections <xref format="counter" target="state-changing-requests"/>, <xref fo rmat="counter" target="security"/> and <xref format="counter" target="usage-in-s ignatures"/>.</t> | |||
<t>RFC 3230 could never communicate | <t><xref target="RFC3230"/> could never communicate | |||
the digest of HTTP message content in the Digest field; | the digest of HTTP message content in the <tt>Digest</tt> field; | |||
Content-Digest now provides that capability.</t> | <tt>Content-Digest</tt> now provides that capability.</t> | |||
<t>RFC 3230 allowed algorithms to define their output encoding format for | <t><xref target="RFC3230"/> allowed algorithms to define their output enco | |||
use with | ding format for use with | |||
the Digest field. This resulted in a mix of formats such as base64, hex or | the <tt>Digest</tt> field. This resulted in a mix of formats such as base64, hex | |||
decimal. By virtue of using Structured fields, Content-Digest and Repr-Digest | , 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> | use only a single encoding format. Further explanation and examples are provided in <xref target="sample-digest-values"/>.</t> | |||
</section> | </section> | |||
<section numbered="false" anchor="acknowledgements"> | <section numbered="false" anchor="acknowledgements"> | |||
<name>Acknowledgements</name> | <name>Acknowledgements</name> | |||
<t>This document is based on ideas from <xref target="RFC3230"/>, so thank s | <t>This document is based on ideas from <xref target="RFC3230"/>, so thank s | |||
to Jeff Mogul and Arthur Van Hoff for their great work. | to <contact fullname="Jeff Mogul"/> and <contact fullname="Arthur Van Hoff"/> fo | |||
The original idea of refreshing RFC3230 arose from an interesting | r their great work. | |||
discussion with Mark Nottingham, Jeffrey Yasskin, and Martin Thomson when review | The original idea of refreshing <xref target="RFC3230"/> arose from an interesti | |||
ing | ng | |||
discussion with <contact fullname="Mark Nottingham"/>, <contact fullname="Jeffre | ||||
y Yasskin"/>, and <contact fullname="Martin Thomson"/> when reviewing | ||||
the MICE content coding.</t> | the MICE content coding.</t> | |||
<t>Thanks to Julian Reschke for his valuable contributions to this documen t, | <t>Thanks to <contact fullname="Julian Reschke"/> for his valuable contrib utions to this document, | |||
and to the following contributors that have helped improve this specification by reporting bugs, | 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: | asking smart questions, drafting or reviewing text, and evaluating open issues: | |||
Mike Bishop, | <contact fullname="Mike Bishop"/>, | |||
Brian Campbell, | <contact fullname="Brian Campbell"/>, | |||
Matthew Kerwin, | <contact fullname="Matthew Kerwin"/>, | |||
James Manger, | <contact fullname="James Manger"/>, | |||
Tommy Pauly, | <contact fullname="Tommy Pauly"/>, | |||
Sean Turner, | <contact fullname="Sean Turner"/>, | |||
Justin Richer, | <contact fullname="Justin Richer"/>, | |||
and Erik Wilde.</t> | and <contact fullname="Erik Wilde"/>.</t> | |||
</section> | ||||
<section numbered="false" removeInRFC="true" anchor="code-samples"> | ||||
<name>Code Samples</name> | ||||
<t>How can I generate and validate the digest values, computed over the JS | ||||
ON object | ||||
<tt>{"hello": "world"}</tt> followed by an LF, shown in the examples throughout | ||||
this | ||||
document?</t> | ||||
<t>The following python3 code can be used to generate digests for JSON obj | ||||
ects | ||||
using SHA algorithms for a range of encodings. Note that these are formatted as | ||||
base64. This function could be adapted to other algorithms and should take into | ||||
account their specific formatting rules.</t> | ||||
<artwork><![CDATA[ | ||||
import base64, json, hashlib, brotli, logging | ||||
log = logging.getLogger() | ||||
def digest_bytes(bytes_, algorithm=hashlib.sha256): | ||||
checksum_bytes = algorithm(bytes_).digest() | ||||
log.warning("Log bytes: \n[%r]", bytes_) | ||||
return base64.encodebytes(checksum_bytes).strip() | ||||
def digest(bytes_, encoding=lambda x: x, algorithm=hashlib.sha256): | ||||
content_encoded = encoding(bytes_) | ||||
return digest_bytes(content_encoded, algorithm) | ||||
bytes_ = b'{"hello": "world"}\n' | ||||
print("Encoding | hashing algorithm | digest-value") | ||||
print("Identity | sha256 |", digest(bytes_)) | ||||
# Encoding | hashing algorithm | digest-value | ||||
# Identity | sha256 | RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg= | ||||
print("Encoding | hashing algorithm | digest-value") | ||||
print("Brotli | sha256 |", digest(bytes_, encoding=brotli.compress)) | ||||
# Encoding | hashing algorithm | digest-value | ||||
# Brotli | sha256 | d435Qo+nKZ+gLcUHn7GQtQ72hiBVAgqoLsZnZPiTGPk= | ||||
print("Encoding | hashing algorithm | digest-value") | ||||
print("Identity | sha512 |", digest(bytes_, algorithm=hashlib.sha512)) | ||||
print("Brotli | sha512 |", digest(bytes_, algorithm=hashlib.sha512, | ||||
encoding=brotli.compress)) | ||||
# Encoding | hashing algorithm | digest-value | ||||
# Identity | sha512 |b'YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP' | ||||
# '+pgk4vf2aCsyRZOtw8MjkM7iw7yZ/WkppmM44T3qg==' | ||||
# Brotli | sha512 | b'db7fdBbgZMgX1Wb2MjA8zZj+rSNgfmDCEEXM8qLWfpfoNY' | ||||
# '0sCpHAzZbj09X1/7HAb7Od5Qfto4QpuBsFbUO3dQ==' | ||||
]]></artwork> | ||||
</section> | ||||
<section numbered="false" removeInRFC="true" anchor="changes"> | ||||
<name>Changes</name> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
12"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-12</name> | ||||
<ul spacing="normal"> | ||||
<li>Be clearer that applications can enforce additional requirements w | ||||
rt digest</li> | ||||
<li>Change algorithm status names: s/standard/active, s/insecure/depre | ||||
cated</li> | ||||
<li>Remove "reserved" algorithm status</li> | ||||
<li>Provide clear guidance about the use of standard or deprecated alg | ||||
orithms</li> | ||||
<li>Editorial or minor changes</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
11"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-11</name> | ||||
<ul spacing="normal"> | ||||
<li>Editorial or minor changes</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
10"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-10</name> | ||||
<ul spacing="normal"> | ||||
<li>Editorial or minor changes</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
09"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-09</name> | ||||
<ul spacing="normal"> | ||||
<li>Editorial or minor changes</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
08"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-08</name> | ||||
<ul spacing="normal"> | ||||
<li>Add note about migrating from RFC 3230. #1968, #1971</li> | ||||
<li>Clarify what Want-* means in responses. #2097</li> | ||||
<li>Editorial changes to structure and to align to HTTP style guide.</ | ||||
li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
07"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-07</name> | ||||
<ul spacing="normal"> | ||||
<li>Introduced Repr-Digest and Want-Repr-Digest, and deprecated | ||||
Digest and Want-Digest. Use of Structured Fields. #1993, #1919</li> | ||||
<li>IANA refactoring. #1983</li> | ||||
<li>No normative text in security considerations. #1972</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
06"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-06</name> | ||||
<ul spacing="normal"> | ||||
<li>Remove id-sha-256 and id-sha-512 from the list of supported algori | ||||
thms #855</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
05"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-05</name> | ||||
<ul spacing="normal"> | ||||
<li>Reboot digest-algorithm values registry #1567</li> | ||||
<li>Add Content-Digest #1542</li> | ||||
<li>Remove SRI section #1478</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
04"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-04</name> | ||||
<ul spacing="normal"> | ||||
<li>Improve SRI section #1354</li> | ||||
<li>About duplicate digest-algorithms #1221</li> | ||||
<li>Improve security considerations #852</li> | ||||
<li>md5 and sha deprecation references #1392</li> | ||||
<li>Obsolete 3230 #1395</li> | ||||
<li>Editorial #1362</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
03"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-03</name> | ||||
<ul spacing="normal"> | ||||
<li>Reference semantics-12</li> | ||||
<li>Detail encryption quirks</li> | ||||
<li>Details on Algorithm agility #1250</li> | ||||
<li>Obsolete parameters #850</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
02"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-02</name> | ||||
<ul spacing="normal"> | ||||
<li>Deprecate SHA-1 #1154</li> | ||||
<li>Avoid id-* with encrypted content</li> | ||||
<li>Digest is independent of MESSAGING and HTTP/1.1 is not normative # | ||||
1215</li> | ||||
<li>Identity is not a valid field value for content-encoding #1223</li | ||||
> | ||||
<li>Mention trailers #1157</li> | ||||
<li>Reference httpbis-semantics #1156</li> | ||||
<li>Add contentMD5 as an obsoleted digest-algorithm #1249</li> | ||||
<li>Use lowercase digest-algorithms names in the doc and in the digest | ||||
-algorithm IANA table.</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
01"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-01</name> | ||||
<ul spacing="normal"> | ||||
<li>Digest of error responses is computed on the error representation- | ||||
data #1004</li> | ||||
<li>Effect of HTTP semantics on payload and message body moved to appe | ||||
ndix #1122</li> | ||||
<li>Editorial refactoring, moving headers sections up. #1109-#1112, #1 | ||||
116, | ||||
#1117, #1122-#1124</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" anchor="since-draft-ietf-httpbis-digest-headers- | ||||
00"> | ||||
<name>Since draft-ietf-httpbis-digest-headers-00</name> | ||||
<ul spacing="normal"> | ||||
<li>Align title with document name</li> | ||||
<li>Add id-sha-* algorithm examples #880</li> | ||||
<li>Reference <xref target="RFC6234"/> and <xref target="RFC3174"/> in | ||||
stead of FIPS-1</li> | ||||
<li>Deprecate MD5</li> | ||||
<li>Obsolete ADLER-32 but don't forbid it #828</li> | ||||
<li>Update CRC32C value in IANA table #828</li> | ||||
<li>Use when acting on resources (POST, PATCH) #853</li> | ||||
<li>Added Relationship with SRI, draft Use Cases #868, #971</li> | ||||
<li>Warn about the implications of <tt>Content-Location</tt></li> | ||||
</ul> | ||||
</section> | ||||
</section> | </section> | |||
</back> | </back> | |||
<!-- ##markdown-source: | ||||
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 | ||||
hVtw0Z4oL+uk4jlAL6+th7/8/j3K3Cvv30uCU7FDtFuempmdQsbidFjWeaNT | ||||
Htj0kP9B5cq+BUs4BA6VsVodO+2rVJz3TJwdu18hHaVmv5UofnOeAgBCF9FX | ||||
bVNZVy03RCJ3wrhFmcyryrxq4qI8KgY2s0x2qvNmD6ICOlQsTDFwDMQwOujI | ||||
3fjs42A7MTF500ksUYW+1yQ6TMgO/BWyFr4t+ZpZZOSeVoeSxcAZoWwzOLeU | ||||
onpKVoBoGEpXsR4szLYemFBlU32krqQ5Jx+f81UQtYTL4JXKj2EKU5pL9twl | ||||
zgmSorLulkVVt8JKBjcVKejzn4tNZDwvToaNZwPsLCdMlWSAZBLZ7s22j3G1 | ||||
kYHN6uK1YCFb901uaSKqd3aVUILz2y0sh3IusVpv8c6EVjo2pTsl7EFhqah1 | ||||
BND5xdnlNjax22nuHewe7pybMhH3ZI6mwGtTa7356s3Oqfcyml97Pdj3OtP1 | ||||
8Sh+17l+/io+e794ubd9tbfc7iymN6+/v/BOR9//qtwykp3ubWew9SpKDsKf | ||||
gdqtbR0fTwNv6L88vDm73R1d7L96ffPiNrglVmeqvdKsr5fXdzd+P4mvf/89 | ||||
ufGzdD06eXH24njp5NXOZTx99X6rv3bdnWzsbJ3u4rtYwLUpk26e+/MwQ6d3 | ||||
c3x4/nt7NXg98VYmP5k58ucW1ra9m3c7p8uTpfmLSTSIL/dfnMy/+pAs9/BZ | ||||
U7+U1vP8p0vzHes+Tb259iHd73RoXK71ySNvnry5fr7He5KqnPTD5k9Lw/0D | ||||
ep7yEwD9j7grAhwAWXXxBLDcIYiTI/PLJ5ZVbJ8K0nOMERSNl9JKrr6NUizI | ||||
xlm7dnzjWsuxkTtlEtvOfZBojMb2WygUEqeV9/hK9bC5zDjjziv8Brm8OVWF | ||||
7PVw8bEJkp9XV6W9mIobPHipYeGcMd1ik9ckzeLYNLlADb/cIoCDfGhXahTi | ||||
09fOBhAAmKXM01rqf5m6RkLTH9qtQmkkGBJ9aHZUhVMGKKwaW794UsXfNKiH | ||||
LWe3uOtxQG4Akt3Ncu0qMVzAHAN2giOxPiC5CJcDoFJSV/IWB6CFRyA1MOip | ||||
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 | ||||
Mnq/rLjvRvfmZer/H/C73Dak7QAA | ||||
</rfc> | </rfc> | |||
End of changes. 231 change blocks. | ||||
1514 lines changed or deleted | 472 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |