draft-ietf-httpbis-digest-headers-13.txt | draft-ietf-httpbis-digest-headers-latest.txt | |||
---|---|---|---|---|
HTTP Working Group R. Polli | Internet Engineering Task Force (IETF) R. Polli | |||
Internet-Draft Team Digitale, Italian Government | Request for Comments: 9530 Team Digitale, Italian Government | |||
Obsoletes: 3230 (if approved) L. Pardue | Obsoletes: 3230 L. Pardue | |||
Intended status: Standards Track Cloudflare | Category: Standards Track Cloudflare | |||
Expires: January 11, 2024 July 10, 2023 | ISSN: 2070-1721 November 20, 2024 | |||
Digest Fields | Digest Fields | |||
draft-ietf-httpbis-digest-headers-13 | ||||
Abstract | Abstract | |||
This document defines HTTP fields that support integrity digests. | This document defines HTTP fields that support integrity digests. | |||
The Content-Digest field can be used for the integrity of HTTP | The Content-Digest field can be used for the integrity of HTTP | |||
message content. The Repr-Digest field can be used for the integrity | message content. The Repr-Digest field can be used for the integrity | |||
of HTTP representations. Want-Content-Digest and Want-Repr-Digest | of HTTP representations. Want-Content-Digest and Want-Repr-Digest | |||
can be used to indicate a sender's interest and preferences for | can be used to indicate a sender's interest and preferences for | |||
receiving the respective Integrity fields. | receiving the respective Integrity fields. | |||
skipping to change at page 1, line 42 ¶ | skipping to change at page 1, line 41 ¶ | |||
Discussion of this document takes place on the HTTP Working Group | Discussion of this document takes place on the HTTP Working Group | |||
mailing list (<mailto:ietf-http-wg@w3.org>), which is archived at | mailing list (<mailto:ietf-http-wg@w3.org>), which is archived at | |||
<https://lists.w3.org/Archives/Public/ietf-http-wg/>. Working Group | <https://lists.w3.org/Archives/Public/ietf-http-wg/>. Working Group | |||
information can be found at <https://httpwg.org/>. | information can be found at <https://httpwg.org/>. | |||
Source for this draft and an issue tracker can be found at | Source for this draft and an issue tracker can be found at | |||
<https://github.com/httpwg/http-extensions/labels/digest-headers>. | <https://github.com/httpwg/http-extensions/labels/digest-headers>. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on January 11, 2024. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9530. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2023 IETF Trust and the persons identified as the | Copyright (c) 2024 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Document Structure . . . . . . . . . . . . . . . . . . . 4 | 1.1. Document Structure . . . . . . . . . . . . . . . . . . . 4 | |||
1.2. Concept Overview . . . . . . . . . . . . . . . . . . . . 5 | 1.2. Concept Overview . . . . . . . . . . . . . . . . . . . . 4 | |||
1.3. Obsoleting RFC 3230 . . . . . . . . . . . . . . . . . . . 6 | 1.3. Obsoleting RFC 3230 . . . . . . . . . . . . . . . . . . . 5 | |||
1.4. Notational Conventions . . . . . . . . . . . . . . . . . 6 | 1.4. Notational Conventions . . . . . . . . . . . . . . . . . 6 | |||
2. The Content-Digest Field . . . . . . . . . . . . . . . . . . 7 | 2. The Content-Digest Field . . . . . . . . . . . . . . . . . . 7 | |||
3. The Repr-Digest Field . . . . . . . . . . . . . . . . . . . . 8 | 3. The Repr-Digest Field . . . . . . . . . . . . . . . . . . . . 8 | |||
3.1. Using Repr-Digest in State-Changing Requests . . . . . . 10 | 3.1. Using Repr-Digest in State-Changing Requests . . . . . . 9 | |||
3.2. Repr-Digest and Content-Location in Responses . . . . . . 10 | 3.2. Repr-Digest and Content-Location in Responses . . . . . . 10 | |||
4. Integrity preference fields . . . . . . . . . . . . . . . . . 11 | 4. Integrity Preference Fields . . . . . . . . . . . . . . . . . 10 | |||
5. Hash Algorithm Considerations and Registration . . . . . . . 11 | 5. Hash Algorithm Considerations and Registration . . . . . . . 11 | |||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 13 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 13 | |||
6.1. HTTP Messages Are Not Protected In Full . . . . . . . . . 13 | 6.1. HTTP Messages Are Not Protected in Full . . . . . . . . . 13 | |||
6.2. End-to-End Integrity . . . . . . . . . . . . . . . . . . 14 | 6.2. End-to-End Integrity . . . . . . . . . . . . . . . . . . 13 | |||
6.3. Usage in Signatures . . . . . . . . . . . . . . . . . . . 14 | 6.3. Usage in Signatures . . . . . . . . . . . . . . . . . . . 13 | |||
6.4. Usage in Trailer Fields . . . . . . . . . . . . . . . . . 15 | 6.4. Usage in Trailer Fields . . . . . . . . . . . . . . . . . 14 | |||
6.5. Variations Within Content Encoding . . . . . . . . . . . 15 | 6.5. Variations within Content-Encoding . . . . . . . . . . . 14 | |||
6.6. Algorithm Agility . . . . . . . . . . . . . . . . . . . . 15 | 6.6. Algorithm Agility . . . . . . . . . . . . . . . . . . . . 15 | |||
6.7. Resource exhaustion . . . . . . . . . . . . . . . . . . . 16 | 6.7. Resource Exhaustion . . . . . . . . . . . . . . . . . . . 15 | |||
7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 16 | 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 16 | |||
7.1. HTTP Field Name Registration . . . . . . . . . . . . . . 16 | 7.1. HTTP Field Name Registration . . . . . . . . . . . . . . 16 | |||
7.2. Establish the Hash Algorithms for HTTP Digest Fields | 7.2. Creation of the Hash Algorithms for HTTP Digest Fields | |||
Registry . . . . . . . . . . . . . . . . . . . . . . . . 17 | Registry . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
7.3. Deprecate the Hypertext Transfer Protocol (HTTP) Digest | 7.3. Deprecate the Hypertext Transfer Protocol (HTTP) Digest | |||
Algorithm Values Registry . . . . . . . . . . . . . . . . 18 | Algorithm Values Registry . . . . . . . . . . . . . . . . 17 | |||
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 18 | 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
8.1. Normative References . . . . . . . . . . . . . . . . . . 18 | 8.1. Normative References . . . . . . . . . . . . . . . . . . 18 | |||
8.2. Informative References . . . . . . . . . . . . . . . . . 19 | 8.2. Informative References . . . . . . . . . . . . . . . . . 19 | |||
8.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 21 | ||||
Appendix A. Resource Representation and Representation Data . . 21 | Appendix A. Resource Representation and Representation Data . . 21 | |||
Appendix B. Examples of Unsolicited Digest . . . . . . . . . . . 24 | Appendix B. Examples of Unsolicited Digest . . . . . . . . . . . 24 | |||
B.1. Server Returns Full Representation Data . . . . . . . . . 25 | B.1. Server Returns Full Representation Data . . . . . . . . . 24 | |||
B.2. Server Returns No Representation Data . . . . . . . . . . 25 | B.2. Server Returns No Representation Data . . . . . . . . . . 25 | |||
B.3. Server Returns Partial Representation Data . . . . . . . 26 | B.3. Server Returns Partial Representation Data . . . . . . . 26 | |||
B.4. Client and Server Provide Full Representation Data . . . 27 | B.4. Client and Server Provide Full Representation Data . . . 27 | |||
B.5. Client Provides Full Representation Data, Server Provides | B.5. Client Provides Full Representation Data and Server | |||
No Representation Data . . . . . . . . . . . . . . . . . 28 | Provides No Representation Data . . . . . . . . . . . . . 28 | |||
B.6. Client and Server Provide Full Representation Data . . . 29 | B.6. Client and Server Provide Full Representation Data . . . 29 | |||
B.7. POST Response does not Reference the Request URI . . . . 29 | B.7. POST Response Does Not Reference the Request URI . . . . 29 | |||
B.8. POST Response Describes the Request Status . . . . . . . 30 | B.8. POST Response Describes the Request Status . . . . . . . 30 | |||
B.9. Digest with PATCH . . . . . . . . . . . . . . . . . . . . 31 | B.9. Digest with PATCH . . . . . . . . . . . . . . . . . . . . 31 | |||
B.10. Error responses . . . . . . . . . . . . . . . . . . . . . 32 | B.10. Error Responses . . . . . . . . . . . . . . . . . . . . . 32 | |||
B.11. Use with Trailer Fields and Transfer Coding . . . . . . . 33 | B.11. Use with Trailer Fields and Transfer Coding . . . . . . . 33 | |||
Appendix C. Examples of Want-Repr-Digest Solicited Digest . . . 34 | Appendix C. Examples of Want-Repr-Digest Solicited Digest . . . 34 | |||
C.1. Server Selects Client's Least Preferred Algorithm . . . . 34 | C.1. Server Selects Client's Least Preferred Algorithm . . . . 34 | |||
C.2. Server Selects Algorithm Unsupported by Client . . . . . 35 | C.2. Server Selects Algorithm Unsupported by Client . . . . . 35 | |||
C.3. Server Does Not Support Client Algorithm and Returns an | C.3. Server Does Not Support Client Algorithm and Returns an | |||
Error . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | Error . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
Appendix D. Sample Digest Values . . . . . . . . . . . . . . . . 36 | Appendix D. Sample Digest Values . . . . . . . . . . . . . . . . 36 | |||
Appendix E. Migrating from RFC 3230 . . . . . . . . . . . . . . 37 | Appendix E. Migrating from RFC 3230 . . . . . . . . . . . . . . 37 | |||
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 38 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
Code Samples . . . . . . . . . . . . . . . . . . . . . . . . . . 38 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 | ||||
H.1. Since draft-ietf-httpbis-digest-headers-12 . . . . . . . 39 | ||||
H.2. Since draft-ietf-httpbis-digest-headers-11 . . . . . . . 40 | ||||
H.3. Since draft-ietf-httpbis-digest-headers-10 . . . . . . . 40 | ||||
H.4. Since draft-ietf-httpbis-digest-headers-09 . . . . . . . 40 | ||||
H.5. Since draft-ietf-httpbis-digest-headers-08 . . . . . . . 40 | ||||
H.6. Since draft-ietf-httpbis-digest-headers-07 . . . . . . . 40 | ||||
H.7. Since draft-ietf-httpbis-digest-headers-06 . . . . . . . 40 | ||||
H.8. Since draft-ietf-httpbis-digest-headers-05 . . . . . . . 40 | ||||
H.9. Since draft-ietf-httpbis-digest-headers-04 . . . . . . . 41 | ||||
H.10. Since draft-ietf-httpbis-digest-headers-03 . . . . . . . 41 | ||||
H.11. Since draft-ietf-httpbis-digest-headers-02 . . . . . . . 41 | ||||
H.12. Since draft-ietf-httpbis-digest-headers-01 . . . . . . . 42 | ||||
H.13. Since draft-ietf-httpbis-digest-headers-00 . . . . . . . 42 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 42 | ||||
1. Introduction | 1. Introduction | |||
HTTP does not define the means to protect the data integrity of | HTTP does not define the means to protect the data integrity of | |||
content or representations. When HTTP messages are transferred | content or representations. When HTTP messages are transferred | |||
between endpoints, lower layer features or properties such as TCP | between endpoints, lower-layer features or properties such as TCP | |||
checksums or TLS records [TLS] can provide some integrity protection. | checksums or TLS records [TLS] can provide some integrity protection. | |||
However, transport-oriented integrity provides a limited utility | However, transport-oriented integrity provides a limited utility | |||
because it is opaque to the application layer and only covers the | because it is opaque to the application layer and only covers the | |||
extent of a single connection. HTTP messages often travel over a | extent of a single connection. HTTP messages often travel over a | |||
chain of separate connections. In between connections there is a | chain of separate connections. In between connections, there is a | |||
possibility for data corruption. An HTTP integrity mechanism can | possibility for data corruption. An HTTP integrity mechanism can | |||
provide the means for endpoints, or applications using HTTP, to | provide the means for endpoints, or applications using HTTP, to | |||
detect data corruption and make a choice about how to act on it. An | detect data corruption and make a choice about how to act on it. An | |||
example use case is to aid fault detection and diagnosis across | example use case is to aid fault detection and diagnosis across | |||
system boundaries. | system boundaries. | |||
This document defines two digest integrity mechanisms for HTTP. | This document defines two digest integrity mechanisms for HTTP. | |||
First, content integrity, which acts on conveyed content (Section 6.4 | First, content integrity, which acts on conveyed content (Section 6.4 | |||
of [HTTP]). Second, representation data integrity, which acts on | of [HTTP]). Second, representation data integrity, which acts on | |||
representation data (Section 8.1 of [HTTP]). This supports advanced | representation data (Section 8.1 of [HTTP]). This supports advanced | |||
use cases such as validating the integrity of a resource that was | use cases, such as validating the integrity of a resource that was | |||
reconstructed from parts retrieved using multiple requests or | reconstructed from parts retrieved using multiple requests or | |||
connections. | connections. | |||
This document obsoletes RFC 3230 and therefore the Digest and Want- | This document obsoletes [RFC3230] and therefore the Digest and Want- | |||
Digest HTTP fields; see Section 1.3. | Digest HTTP fields; see Section 1.3. | |||
1.1. Document Structure | 1.1. Document Structure | |||
This document is structured as follows: | This document is structured as follows: | |||
o New request and response header and trailer field definitions. | o New request and response header and trailer field definitions. | |||
* Section 2 (Content-Digest), | * Section 2 (Content-Digest), | |||
* Section 3 (Repr-Digest), and | * Section 3 (Repr-Digest), and | |||
* Section 4 (Want-Content-Digest and Want-Repr-Digest). | * Section 4 (Want-Content-Digest and Want-Repr-Digest). | |||
o Considerations specific to representation data integrity. | o Considerations specific to representation data integrity. | |||
* Section 3.1 (State-changing requests), | * Section 3.1 (State-changing requests), | |||
* Section 3.2 (Content-Location), | * Section 3.2 (Content-Location), | |||
* Appendix A contains worked examples of Representation data in | * Appendix A contains worked examples of representation data in | |||
message exchanges, and | message exchanges, and | |||
* Appendix B and Appendix C contain worked examples of Repr- | * Appendixes B and C contain worked examples of Repr-Digest and | |||
Digest and Want-Repr-Digest fields in message exchanges. | Want-Repr-Digest fields in message exchanges. | |||
o Section 5 presents hash algorithm considerations and defines | o Section 5 presents hash algorithm considerations and defines | |||
registration procedures for future entries. | registration procedures for future entries. | |||
1.2. Concept Overview | 1.2. Concept Overview | |||
The HTTP fields defined in this document can be used for HTTP | The HTTP fields defined in this document can be used for HTTP | |||
integrity. Senders choose a hashing algorithm and calculate a digest | integrity. Senders choose a hashing algorithm and calculate a digest | |||
from an input related to the HTTP message. The algorithm identifier | from an input related to the HTTP message. The algorithm identifier | |||
and digest are transmitted in an HTTP field. Receivers can validate | and digest are transmitted in an HTTP field. Receivers can validate | |||
skipping to change at page 5, line 37 ¶ | skipping to change at page 5, line 12 ¶ | |||
trailer field is defined to support digests of content (Section 6.4 | trailer field is defined to support digests of content (Section 6.4 | |||
of [HTTP]); see Section 2. | of [HTTP]); see Section 2. | |||
For more advanced use cases, the "Repr-Digest" request and response | For more advanced use cases, the "Repr-Digest" request and response | |||
header and trailer field (Section 3) is defined. It contains a | header and trailer field (Section 3) is defined. It contains a | |||
digest value computed by applying a hashing algorithm to selected | digest value computed by applying a hashing algorithm to selected | |||
representation data (Section 8.1 of [HTTP]). Basing "Repr-Digest" on | representation data (Section 8.1 of [HTTP]). Basing "Repr-Digest" on | |||
the selected representation makes it straightforward to apply it to | the selected representation makes it straightforward to apply it to | |||
use cases where the message content requires some sort of | use cases where the message content requires some sort of | |||
manipulation to be considered as representation of the resource or | manipulation to be considered as representation of the resource or | |||
content conveys a partial representation of a resource, such as Range | the content conveys a partial representation of a resource, such as | |||
Requests (see Section 14 of [HTTP]). | range requests (see Section 14 of [HTTP]). | |||
"Content-Digest" and "Repr-Digest" support hashing algorithm agility. | "Content-Digest" and "Repr-Digest" support hashing algorithm agility. | |||
The "Want-Content-Digest" and "Want-Repr-Digest" fields allow | The "Want-Content-Digest" and "Want-Repr-Digest" fields allow | |||
endpoints to express interest in "Content-Digest" and "Repr-Digest" | endpoints to express interest in "Content-Digest" and "Repr-Digest", | |||
respectively, and to express algorithm preferences in either. | respectively, and to express algorithm preferences in either. | |||
"Content-Digest" and "Repr-Digest" are collectively termed Integrity | "Content-Digest" and "Repr-Digest" are collectively termed "Integrity | |||
fields. "Want-Content-Digest" and "Want-Repr-Digest" are | fields". "Want-Content-Digest" and "Want-Repr-Digest" are | |||
collectively termed Integrity preference fields. | collectively termed "Integrity preference fields". | |||
Integrity fields are tied to the "Content-Encoding" and "Content- | Integrity fields are tied to the "Content-Encoding" and "Content- | |||
Type" header fields. Therefore, a given resource may have multiple | Type" header fields. Therefore, a given resource may have multiple | |||
different digest values when transferred with HTTP. | different digest values when transferred with HTTP. | |||
Integrity fields apply to HTTP message content or HTTP | Integrity fields apply to HTTP message content or HTTP | |||
representations. They do not apply to HTTP messages or fields. | representations. They do not apply to HTTP messages or fields. | |||
However, they can be combined with other mechanisms that protect | However, they can be combined with other mechanisms that protect | |||
metadata, such as digital signatures, in order to protect the phases | metadata, such as digital signatures, in order to protect the phases | |||
of an HTTP exchange in whole or in part. For example, HTTP Message | of an HTTP exchange in whole or in part. For example, HTTP Message | |||
Signatures [SIGNATURES] could be used to sign Integrity fields, thus | Signatures [SIGNATURES] could be used to sign Integrity fields, thus | |||
providing coverage for HTTP content or representation data. | providing coverage for HTTP content or representation data. | |||
This specification does not define means for authentication, | This specification does not define means for authentication, | |||
authorization, or privacy. | authorization, or privacy. | |||
1.3. Obsoleting RFC 3230 | 1.3. Obsoleting RFC 3230 | |||
[RFC3230] defined the "Digest" and "Want-Digest" HTTP fields for HTTP | [RFC3230] defined the "Digest" and "Want-Digest" HTTP fields for HTTP | |||
integrity. It also coined the term "instance" and "instance | integrity. It also coined the terms "instance" and "instance | |||
manipulation" in order to explain concepts that are now more | manipulation" in order to explain concepts, such as selected | |||
universally defined, and implemented, as HTTP semantics such as | representation data (Section 8.1 of [HTTP]), that are now more | |||
selected representation data (Section 8.1 of [HTTP]). | universally defined and implemented as HTTP semantics. | |||
Experience has shown that implementations of [RFC3230] have | Experience has shown that implementations of [RFC3230] have | |||
interpreted the meaning of "instance" inconsistently, leading to | interpreted the meaning of "instance" inconsistently, leading to | |||
interoperability issues. The most common issue relates to the | interoperability issues. The most common issue relates to the | |||
mistake of calculating the digest using (what we now call) message | mistake of calculating the digest using (what we now call) message | |||
content, rather than using (what we now call) representation data as | content, rather than using (what we now call) representation data as | |||
was originally intended. Interestingly, time has also shown that a | was originally intended. Interestingly, time has also shown that a | |||
digest of message content can be beneficial for some use cases. So | digest of message content can be beneficial for some use cases, so it | |||
it is difficult to detect if non-conformance to [RFC3230] is | is difficult to detect if non-conformance to [RFC3230] is intentional | |||
intentional or unintentional. | or unintentional. | |||
In order to address potential inconsistencies and ambiguity across | In order to address potential inconsistencies and ambiguity across | |||
implementations of "Digest" and "Want-Digest", this document | implementations of "Digest" and "Want-Digest", this document | |||
obsoletes [RFC3230]. The Integrity fields (Sections 2 and 3) and | obsoletes [RFC3230]. The Integrity fields (Sections 2 and 3) and | |||
Integrity preference fields (Section 4) defined in this document are | Integrity preference fields (Section 4) defined in this document are | |||
better aligned with current HTTP semantics and have names that more | better aligned with current HTTP semantics and have names that more | |||
clearly articulate the intended usages. | clearly articulate the intended usages. | |||
1.4. Notational Conventions | 1.4. Notational Conventions | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
This document uses the Augmented BNF defined in [RFC5234] and updated | This document uses the Augmented BNF defined in [RFC5234] and updated | |||
by [RFC7405]. This includes the rules: CR (carriage return), LF | by [RFC7405]. This includes the rules CR (carriage return), LF (line | |||
(line feed), and CRLF (CR LF). | feed), and CRLF (CR LF). | |||
This document uses the following terminology from Section 3 of | This document uses the following terminology from Section 3 of | |||
[STRUCTURED-FIELDS] to specify syntax and parsing: Boolean, Byte | [STRUCTURED-FIELDS] to specify syntax and parsing: Boolean, Byte | |||
Sequence, Dictionary, Integer, and List. | Sequence, Dictionary, Integer, and List. | |||
The definitions "representation", "selected representation", | The definitions "representation", "selected representation", | |||
"representation data", "representation metadata", "user agent", and | "representation data", "representation metadata", "user agent", and | |||
"content" in this document are to be interpreted as described in | "content" in this document are to be interpreted as described in | |||
[HTTP]. | [HTTP]. | |||
This document uses the line folding strategies described in | This document uses the line folding strategies described in | |||
[FOLDING]. | [FOLDING]. | |||
Hashing algorithm names respect the casing used in their definition | Hashing algorithm names respect the casing used in their definition | |||
document (e.g., SHA-1, CRC32c). | document (e.g., SHA-1, CRC32c). | |||
HTTP messages indicate hashing algorithms using an Algorithm Key | HTTP messages indicate hashing algorithms using an Algorithm Key | |||
(algorithms). Where the document refers to an Algorithm Key in | (algorithms). Where the document refers to an Algorithm Key in | |||
prose, it is quoted (e.g., "sha", "crc32c"). | prose, it is quoted (e.g., "sha", "crc32c"). | |||
The term "checksum" describes the output of the application of an | The term "checksum" describes the output of applying an algorithm to | |||
algorithm to a sequence of bytes, whereas "digest" is only used in | a sequence of bytes, whereas "digest" is only used in relation to the | |||
relation to the value contained in the fields. | value contained in the fields. | |||
Integrity fields: collective term for "Content-Digest" and "Repr- | "Integrity fields" is the collective term for "Content-Digest" and | |||
Digest" | "Repr-Digest". | |||
Integrity preference fields: collective term for "Want-Repr-Digest" | "Integrity preference fields" is the collective term for "Want-Repr- | |||
and "Want-Content-Digest" | Digest" and "Want-Content-Digest". | |||
2. The Content-Digest Field | 2. The Content-Digest Field | |||
The "Content-Digest" HTTP field can be used in requests and responses | The "Content-Digest" HTTP field can be used in requests and responses | |||
to communicate digests that are calculated using a hashing algorithm | to communicate digests that are calculated using a hashing algorithm | |||
applied to the actual message content (see Section 6.4 of [HTTP]). | applied to the actual message content (see Section 6.4 of [HTTP]). | |||
It is a "Dictionary" (see Section 3.2 of [STRUCTURED-FIELDS]) where | It is a "Dictionary" (see Section 3.2 of [STRUCTURED-FIELDS]), where | |||
each: | each: | |||
o key conveys the hashing algorithm (see Section 5) used to compute | o key conveys the hashing algorithm (see Section 5) used to compute | |||
the digest; | the digest; | |||
o value is a "Byte Sequence" (Section 3.3.5 of [STRUCTURED-FIELDS]), | o value is a "Byte Sequence" (Section 3.3.5 of [STRUCTURED-FIELDS]) | |||
that conveys an encoded version of the byte output produced by the | that conveys an encoded version of the byte output produced by the | |||
digest calculation. | digest calculation. | |||
For example: | For example: | |||
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==: | |||
skipping to change at page 8, line 27 ¶ | skipping to change at page 7, line 47 ¶ | |||
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==: | |||
A recipient MAY ignore any or all digests. Application-specific | A recipient MAY ignore any or all digests. Application-specific | |||
behavior or local policy MAY set additional constraints on the | behavior or local policy MAY set additional constraints on the | |||
processing and validation practices of the conveyed digests. The | processing and validation practices of the conveyed digests. The | |||
security considerations covers some of the issues related to ignoring | security considerations cover some of the issues related to ignoring | |||
digests (see Section 6.6) and validating multiple digests (see | digests (see Section 6.6) and validating multiple digests (see | |||
Section 6.7). | Section 6.7). | |||
A sender MAY send a digest without knowing whether the recipient | A sender MAY send a digest without knowing whether the recipient | |||
supports a given hashing algorithm, or even knowing that the | supports a given hashing algorithm. A sender MAY send a digest if it | |||
recipient will ignore it. | knows the recipient will ignore it. | |||
"Content-Digest" can be sent in a trailer section. In this case, | "Content-Digest" can be sent in a trailer section. In this case, | |||
"Content-Digest" MAY be merged into the header section; see | "Content-Digest" MAY be merged into the header section; see | |||
Section 6.5.1 of [HTTP]. | Section 6.5.1 of [HTTP]. | |||
3. The Repr-Digest Field | 3. The Repr-Digest Field | |||
The "Repr-Digest" HTTP field can be used in requests and responses to | The "Repr-Digest" HTTP field can be used in requests and responses to | |||
communicate digests that are calculated using a hashing algorithm | communicate digests that are calculated using a hashing algorithm | |||
applied to the entire selected representation data (see Section 8.1 | applied to the entire selected representation data (see Section 8.1 | |||
of [HTTP]). | of [HTTP]). | |||
Representations take into account the effect of the HTTP semantics on | Representations take into account the effect of the HTTP semantics on | |||
messages. For example, the content can be affected by Range Requests | messages. For example, the content can be affected by range requests | |||
or methods such as HEAD, while the way the content is transferred "on | or methods, such as HEAD, while the way the content is transferred | |||
the wire" is dependent on other transformations (e.g., transfer | "on the wire" is dependent on other transformations (e.g., transfer | |||
codings for HTTP/1.1 - see Section 6.1 of [RFC9112]). To help | codings for HTTP/1.1; see Section 6.1 of [RFC9112]). To help | |||
illustrate HTTP representation concepts, several examples are | illustrate HTTP representation concepts, several examples are | |||
provided in Appendix A. | provided in Appendix A. | |||
When a message has no representation data it is still possible to | When a message has no representation data, it is still possible to | |||
assert that no representation data was sent by computing the digest | assert that no representation data was sent by computing the digest | |||
on an empty string (see Section 6.3). | on an empty string (see Section 6.3). | |||
"Repr-Digest" is a "Dictionary" (see Section 3.2 of | "Repr-Digest" is a "Dictionary" (see Section 3.2 of | |||
[STRUCTURED-FIELDS]) where each: | [STRUCTURED-FIELDS]), where each: | |||
o key conveys the hashing algorithm (see Section 5) used to compute | o key conveys the hashing algorithm (see Section 5) used to compute | |||
the digest; | the digest; | |||
o value is a "Byte Sequence", that conveys an encoded version of the | o value is a "Byte Sequence" that conveys an encoded version of the | |||
byte output produced by the digest calculation. | byte output produced by the digest calculation. | |||
For example: | For example: | |||
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==: | |||
The "Dictionary" type can be used, for example, to attach multiple | The "Dictionary" type can be used to attach multiple digests | |||
digests calculated using different hashing algorithms in order to | calculated using different hashing algorithms in order to support a | |||
support a population of endpoints with different or evolving | population of endpoints with different or evolving capabilities. | |||
capabilities. Such an approach could support transitions away from | ||||
weaker algorithms (see Section 6.6). | Such an approach could support transitions away from weaker | |||
algorithms (see Section 6.6). | ||||
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==: | |||
A recipient MAY ignore any or all digests. Application-specific | A recipient MAY ignore any or all digests. Application-specific | |||
behavior or local policy MAY set additional constraints on the | behavior or local policy MAY set additional constraints on the | |||
processing and validation practices of the conveyed digests. The | processing and validation practices of the conveyed digests. The | |||
security considerations covers some of the issues related to ignoring | security considerations cover some of the issues related to ignoring | |||
digests (see Section 6.6) and validating multiple digests (see | digests (see Section 6.6) and validating multiple digests (see | |||
Section 6.7). | Section 6.7). | |||
A sender MAY send a digest without knowing whether the recipient | A sender MAY send a digest without knowing whether the recipient | |||
supports a given hashing algorithm, or even knowing that the | supports a given hashing algorithm. A sender MAY send a digest if it | |||
recipient will ignore it. | knows the recipient will ignore it. | |||
"Repr-Digest" can be sent in a trailer section. In this case, "Repr- | "Repr-Digest" can be sent in a trailer section. In this case, "Repr- | |||
Digest" MAY be merged into the header section; see Section 6.5.1 of | Digest" MAY be merged into the header section; see Section 6.5.1 of | |||
[HTTP]. | [HTTP]. | |||
3.1. Using Repr-Digest in State-Changing Requests | 3.1. Using Repr-Digest in State-Changing Requests | |||
When the representation enclosed in a state-changing request does not | When the representation enclosed in a state-changing request does not | |||
describe the target resource, the representation digest MUST be | describe the target resource, the representation digest MUST be | |||
computed on the representation data. This is the only possible | computed on the representation data. This is the only possible | |||
choice because representation digest requires complete representation | choice because representation digest requires complete representation | |||
metadata (see Section 3). | metadata (see Section 3). | |||
In responses, | In responses, | |||
o if the representation describes the status of the request, "Repr- | o if the representation describes the status of the request, "Repr- | |||
Digest" MUST be computed on the enclosed representation (see | Digest" MUST be computed on the enclosed representation (see | |||
Appendix B.8); | Appendix B.8); | |||
o if there is a referenced resource "Repr-Digest" MUST be computed | o if there is a referenced resource, "Repr-Digest" MUST be computed | |||
on the selected representation of the referenced resource even if | on the selected representation of the referenced resource even if | |||
that is different from the target resource. That might or might | that is different from the target resource. This might or might | |||
not result in computing "Repr-Digest" on the enclosed | not result in computing "Repr-Digest" on the enclosed | |||
representation. | representation. | |||
The latter case is done according to the HTTP semantics of the given | The latter case is done according to the HTTP semantics of the given | |||
method, for example using the "Content-Location" header field (see | method, for example, using the "Content-Location" header field (see | |||
Section 8.7 of [HTTP]). In contrast, the "Location" header field | Section 8.7 of [HTTP]). In contrast, the "Location" header field | |||
does not affect "Repr-Digest" because it is not representation | does not affect "Repr-Digest" because it is not representation | |||
metadata. | metadata. | |||
For example, in "PATCH" requests, the representation digest will be | For example, in "PATCH" requests, the representation digest will be | |||
computed on the patch document because the representation metadata | computed on the patch document because the representation metadata | |||
refers to the patch document and not to the target resource (see | refers to the patch document and not the target resource (see | |||
Section 2 of [PATCH]). In responses, instead, the representation | Section 2 of [PATCH]). In responses, instead, the representation | |||
digest will be computed on the selected representation of the patched | digest will be computed on the selected representation of the patched | |||
resource. | resource. | |||
3.2. Repr-Digest and Content-Location in Responses | 3.2. Repr-Digest and Content-Location in Responses | |||
When a state-changing method returns the "Content-Location" header | When a state-changing method returns the "Content-Location" header | |||
field, the enclosed representation refers to the resource identified | field, the enclosed representation refers to the resource identified | |||
by its value and "Repr-Digest" is computed accordingly. An example | by its value and "Repr-Digest" is computed accordingly. An example | |||
is given in Appendix B.7. | is given in Appendix B.7. | |||
4. Integrity preference fields | 4. Integrity Preference Fields | |||
Senders can indicate their interest in Integrity fields and hashing | Senders can indicate their interest in Integrity fields and hashing | |||
algorithm preferences using the "Want-Content-Digest" or "Want-Repr- | algorithm preferences using the "Want-Content-Digest" or "Want-Repr- | |||
Digest" fields. These can be used in both requests and responses. | Digest" HTTP fields. These can be used in both requests and | |||
responses. | ||||
"Want-Content-Digest" indicates that the sender would like to receive | "Want-Content-Digest" indicates that the sender would like to receive | |||
a content digest on messages associated with the request URI and | (via the Content-Digest field) a content digest on messages | |||
representation metadata, using the "Content-Digest" field. | associated with the request URI and representation metadata. "Want- | |||
Repr-Digest" indicates that the sender would like to receive (via the | ||||
"Want-Repr-Digest" indicates that the sender would like to receive a | Repr-Digest field) a representation digest on messages associated | |||
representation digest on messages associated with the request URI and | with the request URI and representation metadata. | |||
representation metadata, using the "Repr-Digest" field. | ||||
If "Want-Content-Digest" or "Want-Repr-Digest" are used in a | If "Want-Content-Digest" or "Want-Repr-Digest" are used in a | |||
response, it indicates that the server would like the client to | response, it indicates that the server would like the client to | |||
provide the respective Integrity field on future requests. | provide the respective Integrity field on future requests. | |||
Integrity preference fields are only a hint. The receiver of the | Integrity preference fields are only a hint. The receiver of the | |||
field can ignore it and send an Integrity field using any algorithm | field can ignore it and send an Integrity field using any algorithm | |||
or omit the field entirely, for example see Appendix C.2. It is not | or omit the field entirely; for example, see Appendix C.2. It is not | |||
a protocol error if preferences are ignored. Applications that use | a protocol error if preferences are ignored. Applications that use | |||
Integrity fields and Integrity preferences can define expectations or | Integrity fields and Integrity preferences can define expectations or | |||
constraints that operate in addition to this specification. Ignored | constraints that operate in addition to this specification. Ignored | |||
preferences are an application-specific concern. | preferences are an application-specific concern. | |||
"Want-Content-Digest" and "Want-Repr-Digest" are of type "Dictionary" | "Want-Content-Digest" and "Want-Repr-Digest" are of type "Dictionary" | |||
where each: | where each: | |||
o key conveys the hashing algorithm (see Section 5); | o key conveys the hashing algorithm (see Section 5); | |||
o value is an "Integer" (Section 3.3.1 of [STRUCTURED-FIELDS]) that | o value is an "Integer" (Section 3.3.1 of [STRUCTURED-FIELDS]) that | |||
conveys an ascending, relative, weighted preference. It must be | conveys an ascending, relative, weighted preference. It must be | |||
in the range 0 to 10 inclusive. 1 is the least preferred, 10 is | in the range 0 to 10 inclusive. 1 is the least preferred, 10 is | |||
the most preferred, and a value of 0 means "not acceptable". | the most preferred, and a value of 0 means "not acceptable". | |||
Examples: | Examples: | |||
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 page 12, line 12 ¶ | skipping to change at page 11, line 28 ¶ | |||
There are a wide variety of hashing algorithms that can be used for | There are a wide variety of hashing algorithms that can be used for | |||
the purposes of integrity. The choice of algorithm depends on | the purposes of integrity. The choice of algorithm depends on | |||
several factors such as the integrity use case, implementation needs | several factors such as the integrity use case, implementation needs | |||
or constraints, or application design and workflows. | or constraints, or application design and workflows. | |||
An initial set of algorithms will be registered with IANA in the | An initial set of algorithms will be registered with IANA in the | |||
"Hash Algorithms for HTTP Digest Fields" registry; see Section 7.2. | "Hash Algorithms for HTTP Digest Fields" registry; see Section 7.2. | |||
Additional algorithms can be registered in accordance with the | Additional algorithms can be registered in accordance with the | |||
policies set out in this section. | policies set out in this section. | |||
Each algorithm has a status field, which is intended to provide an | Each algorithm has a status field that is intended to provide an aid | |||
aid to implementation selection. | to implementation selection. | |||
Algorithms with a status value of "Active" are suitable for many | Algorithms with a status value of "Active" are suitable for many | |||
purposes and it is RECOMMENDED that applications use these | purposes and it is RECOMMENDED that applications use these | |||
algorithms. These can be used in adversarial situations where hash | algorithms. These can be used in adversarial situations where hash | |||
functions might need to provide resistance to collision, first- | functions might need to provide resistance to collision, first- | |||
preimage and second-preimage attacks. For adversarial situations, | preimage, and second-preimage attacks. For adversarial situations, | |||
selecting which of the "Active" algorithms are acceptable will depend | selection of the acceptable "Active" algorithms will depend on the | |||
on the level of protection the circumstances demand. More | level of protection the circumstances demand. More considerations | |||
considerations are presented in Section 6.6. | are presented in Section 6.6. | |||
Algorithms with a status value of "Deprecated" either provide none of | Algorithms with a status value of "Deprecated" either provide none of | |||
these properties, or are known to be weak (see [NO-MD5] and | these properties or are known to be weak (see [NO-MD5] and [NO-SHA]). | |||
[NO-SHA]). These algorithms MAY be used to preserve integrity | These algorithms MAY be used to preserve integrity against | |||
against corruption, but MUST NOT be used in a potentially adversarial | corruption, but MUST NOT be used in a potentially adversarial | |||
setting; for example, when signing Integrity fields' values for | setting, for example, when signing Integrity fields' values for | |||
authenticity. Permitting the use of these algorithms can help some | authenticity. Permitting the use of these algorithms can help some | |||
applications, for example, those that previously used [RFC3230], are | applications (such as those that previously used [RFC3230], are | |||
migrating to this specification (Appendix E), and have existing | migrating to this specification (Appendix E), and have existing | |||
stored collections of computed digest values avoid undue operational | stored collections of computed digest values) avoid undue operational | |||
overhead caused by recomputation using other more-secure algorithms. | overhead caused by recomputation using other more-secure algorithms. | |||
Such applications are not exempt from the requirements in this | Such applications are not exempt from the requirements in this | |||
section. Furthermore, applications without such legacy or history | section. Furthermore, applications without such legacy or history | |||
ought to follow the guidance for using algorithms with the status | ought to follow the guidance for using algorithms with the status | |||
value "Active". | value "Active". | |||
Discussion of algorithm agility is presented in Section 6.6. | Discussion of algorithm agility is presented in Section 6.6. | |||
Registration requests for the "Hash Algorithms for HTTP Digest | Registration requests for the "Hash Algorithms for HTTP Digest | |||
Fields" registry use the Specification Required policy (Section 4.6 | Fields" registry use the Specification Required policy (Section 4.6 | |||
of [RFC8126]). Requests should use the following template: | of [RFC8126]). Requests should use the following template: | |||
o Algorithm Key: the Structured Fields key value used in "Content- | o Algorithm Key: The Structured Fields key value used in "Content- | |||
Digest", "Repr-Digest", "Want-Content-Digest", or "Want-Repr- | Digest", "Repr-Digest", "Want-Content-Digest", or "Want-Repr- | |||
Digest" field Dictionary member keys | Digest" field Dictionary member keys. | |||
o Status: the status of the algorithm. The options are: | o Status: The status of the algorithm. The options are: | |||
* "Active" - for algorithms without known problems, | * "Active" - Algorithms without known problems | |||
* "Provisional" - for unproven algorithms, | ||||
* "Deprecated" - for deprecated or insecure algorithms, | * "Provisional" - Unproven algorithms | |||
o Description: a short description of the algorithm | * "Deprecated" - Deprecated or insecure algorithms | |||
o Reference(s): pointer(s) to the primary document(s) defining the | o Description: A short description of the algorithm | |||
Algorithm Key and technical details of the algorithm | ||||
o Reference(s): Pointer(s) to the primary document(s) defining the | ||||
Algorithm Key and technical details of the algorithm. | ||||
When reviewing registration requests, the designated expert(s) should | When reviewing registration requests, the designated expert(s) should | |||
pay attention to the requested status. The status value should | pay attention to the requested status. The status value should | |||
reflect standardization status and the broad opinion of relevant | reflect standardization status and the broad opinion of relevant | |||
interest groups such as the IETF or security-related SDOs. The | interest groups such as the IETF or security-related Standards | |||
"Active" status is not suitable for an algorithm that is known to be | Development Organizations (SDOs). The "Active" status is not | |||
weak, broken, or experimental. If a registration request attempts to | suitable for an algorithm that is known to be weak, broken, or | |||
register such an algorithm as "Active", the designated expert(s) | experimental. If a registration request attempts to register such an | |||
should suggest an alternative status of "Deprecated" or | algorithm as "Active", the designated expert(s) should suggest an | |||
"Provisional". | alternative status of "Deprecated" or "Provisional". | |||
When reviewing registration requests, the designated expert(s) cannot | When reviewing registration requests, the designated expert(s) cannot | |||
use a status of "Deprecated" or "Provisional" as grounds for | use a status of "Deprecated" or "Provisional" as grounds for | |||
rejection. | rejection. | |||
Requests to update or change the fields in an existing registration | Requests to update or change the fields in an existing registration | |||
are permitted. For example, this could allow for the transition of | are permitted. For example, this could allow for the transition of | |||
an algorithm status from "Active" to "Deprecated" as the security | an algorithm status from "Active" to "Deprecated" as the security | |||
environment evolves. | environment evolves. | |||
6. Security Considerations | 6. Security Considerations | |||
6.1. HTTP Messages Are Not Protected In Full | 6.1. HTTP Messages Are Not Protected in Full | |||
This document specifies a data integrity mechanism that protects HTTP | This document specifies a data integrity mechanism that protects HTTP | |||
representation data or content, but not HTTP header and trailer | representation data or content, but not HTTP header and trailer | |||
fields, from certain kinds of corruption. | fields, from certain kinds of corruption. | |||
Integrity fields are not intended to be a general protection against | Integrity fields are not intended to be a general protection against | |||
malicious tampering with HTTP messages. In the absence of additional | malicious tampering with HTTP messages. In the absence of additional | |||
security mechanisms, an on-path, malicious actor can remove or | security mechanisms, an on-path malicious actor can either remove a | |||
recalculate and substitute a digest value. This attack can be | digest value entirely or substitute it with a new digest value | |||
mitigated by combining mechanisms described in this document with | computed over manipulated representation data or content. This | |||
other approaches such as transport-layer security or digital | attack can be mitigated by combining mechanisms described in this | |||
signatures (for example, HTTP Message Signatures [SIGNATURES]). | document with other approaches such as Transport Layer Security (TLS) | |||
or digital signatures (for example, HTTP Message Signatures | ||||
[SIGNATURES]). | ||||
6.2. End-to-End Integrity | 6.2. End-to-End Integrity | |||
Integrity fields can help detect representation data or content | Integrity fields can help detect representation data or content | |||
modification due to implementation errors, undesired "transforming | modification due to implementation errors, undesired "transforming | |||
proxies" (see Section 7.7 of [HTTP]) or other actions as the data | proxies" (see Section 7.7 of [HTTP]), or other actions as the data | |||
passes across multiple hops or system boundaries. Even a simple | passes across multiple hops or system boundaries. Even a simple | |||
mechanism for end-to-end representation data integrity is valuable | mechanism for end-to-end representation data integrity is valuable | |||
because a user agent can validate that resource retrieval succeeded | because a user agent can validate that resource retrieval succeeded | |||
before handing off to an HTML parser, video player, etc. for parsing. | before handing off to an HTML parser, video player, etc., for | |||
parsing. | ||||
Note that using these mechanisms alone does not provide end-to-end | Note that using these mechanisms alone does not provide end-to-end | |||
integrity of HTTP messages over multiple hops, since metadata could | integrity of HTTP messages over multiple hops since metadata could be | |||
be manipulated at any stage. Methods to protect metadata are | manipulated at any stage. Methods to protect metadata are discussed | |||
discussed in Section 6.3. | in Section 6.3. | |||
6.3. Usage in Signatures | 6.3. Usage in Signatures | |||
Digital signatures are widely used together with checksums to provide | Digital signatures are widely used together with checksums to provide | |||
the certain identification of the origin of a message [NIST800-32]. | the certain identification of the origin of a message [FIPS186-5]. | |||
Such signatures can protect one or more HTTP fields and there are | Such signatures can protect one or more HTTP fields and there are | |||
additional considerations when Integrity fields are included in this | additional considerations when Integrity fields are included in this | |||
set. | set. | |||
There are no restrictions placed on the type or format of digital | There are no restrictions placed on the type or format of digital | |||
signature that Integrity fields can be used with. One possible | signature that Integrity fields can be used with. One possible | |||
approach is to combine them with HTTP Message Signatures | approach is to combine them with HTTP Message Signatures | |||
[SIGNATURES]. | [SIGNATURES]. | |||
Digests explicitly depend on the "representation metadata" (e.g., the | Digests explicitly depend on the "representation metadata" (e.g., the | |||
values of "Content-Type", "Content-Encoding" etc.). A signature that | values of "Content-Type", "Content-Encoding", etc.). A signature | |||
protects Integrity fields but not other "representation metadata" can | that protects Integrity fields but not other "representation | |||
expose the communication to tampering. For example, an actor could | metadata" can expose the communication to tampering. For example, an | |||
manipulate the "Content-Type" field-value and cause a digest | actor could manipulate the "Content-Type" field-value and cause a | |||
validation failure at the recipient, preventing the application from | digest validation failure at the recipient, preventing the | |||
accessing the representation. Such an attack consumes the resources | application from accessing the representation. Such an attack | |||
of both endpoints. See also Section 3.2. | consumes the resources of both endpoints. See also Section 3.2. | |||
Signatures are likely to be deemed an adversarial setting when | Signatures are likely to be deemed an adversarial setting when | |||
applying Integrity fields; see Section 5. "Repr-Digest" offers an | applying Integrity fields; see Section 5. "Repr-Digest" offers an | |||
interesting possibility when combined with signatures. In the | interesting possibility when combined with signatures. In the | |||
scenario where there is no content to send, the digest of an empty | scenario where there is no content to send, the digest of an empty | |||
string can be included in the message and, if signed, can help the | string can be included in the message and, if signed, can help the | |||
recipient detect if content was added either as a result of accident | recipient detect if content was added either as a result of accident | |||
or purposeful manipulation. The opposite scenario is also supported; | or purposeful manipulation. The opposite scenario is also supported; | |||
including an Integrity field for content, and signing it, can help a | including an Integrity field for content and signing it can help a | |||
recipient detect where the content was removed. | recipient detect where the content was removed. | |||
Any mangling of Integrity fields, including digests' de-duplication | Any mangling of Integrity fields might affect signature validation. | |||
or combining different field values (see Section 5.2 of [HTTP]) might | Examples of such mangling include de-duplicating digests or combining | |||
affect signature validation. | different field values (see Section 5.2 of [HTTP]). | |||
6.4. Usage in Trailer Fields | 6.4. Usage in Trailer Fields | |||
Before sending Integrity fields in a trailer section, the sender | Before sending Integrity fields in a trailer section, the sender | |||
should consider that intermediaries are explicitly allowed to drop | should consider that intermediaries are explicitly allowed to drop | |||
any trailer (see Section 6.5.2 of [HTTP]). | any trailer (see Section 6.5.2 of [HTTP]). | |||
When Integrity fields are used in a trailer section, the field-values | When Integrity fields are used in a trailer section, the field-values | |||
are received after the content. Eager processing of content before | are received after the content. Eager processing of content before | |||
the trailer section prevents digest validation, possibly leading to | the trailer section prevents digest validation, possibly leading to | |||
processing of invalid data. | processing of invalid data. | |||
One of the benefits of using Integrity fields in a trailer section is | 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 | that it allows hashing of bytes as they are sent. However, it is | |||
possible to design a hashing algorithm that requires processing of | possible to design a hashing algorithm that requires processing of | |||
content in such a way that would negate these benefits. For example, | content in such a way that would negate these benefits. For example, | |||
Merkle Integrity Content Encoding [I-D.thomson-http-mice] requires | Merkle Integrity Content Encoding [MICE] requires content to be | |||
content to be processed in reverse order. This means the complete | processed in reverse order. This means the complete data needs to be | |||
data needs to be available, which means there is negligible | available, which means there is negligible processing difference in | |||
processing difference in sending an Integrity field in a header or | sending an Integrity field in a header versus a trailer section. | |||
trailer section. | ||||
6.5. Variations Within Content Encoding | 6.5. Variations within Content-Encoding | |||
Content coding mechanisms can support different encoding parameters, | Content coding mechanisms can support different encoding parameters, | |||
meaning that the same input content can produce different outputs. | meaning that the same input content can produce different outputs. | |||
For example, GZIP supports multiple compression levels. Such | For example, GZIP supports multiple compression levels. Such | |||
encoding parameters are generally not communicated as representation | encoding parameters are generally not communicated as representation | |||
metadata. For instance, different compression levels would all use | metadata. For instance, different compression levels would all use | |||
the same "Content-Encoding: gzip" field. Other examples include | the same "Content-Encoding: gzip" field. Other examples include | |||
where encoding relies on nonces or timestamps, such as the aes128gcm | where encoding relies on nonces or timestamps, such as the aes128gcm | |||
content coding defined in [RFC8188]. | content coding defined in [RFC8188]. | |||
Since it is possible for there to be variation within content coding, | Since it is possible for there to be variation within content coding, | |||
the checksum conveyed by the integrity fields cannot be used to | the checksum conveyed by the Integrity fields cannot be used to | |||
provide a proof of integrity "at rest" unless the whole content is | provide a proof of integrity "at rest" unless the whole content is | |||
persisted. | persisted. | |||
6.6. Algorithm Agility | 6.6. Algorithm Agility | |||
The security properties of hashing algorithms are not fixed. | The security properties of hashing algorithms are not fixed. | |||
Algorithm Agility (see [RFC7696]) is achieved by providing | Algorithm agility (see [RFC7696]) is achieved by providing | |||
implementations with flexibility to choose hashing algorithms from | implementations with flexibility to choose hashing algorithms from | |||
the IANA Hash Algorithms for HTTP Digest Fields registry; see | the IANA Hash Algorithms for HTTP Digest Fields registry; see | |||
Section 7.2. | Section 7.2. | |||
Transition from weak algorithms is supported by negotiation of | Transition from weak algorithms is supported by negotiation of | |||
hashing algorithm using "Want-Content-Digest" or "Want-Repr-Digest" | hashing algorithm using "Want-Content-Digest" or "Want-Repr-Digest" | |||
(see Section 4) or by sending multiple digests from which the | (see Section 4) or by sending multiple digests from which the | |||
receiver chooses. A receiver that depends on a digest for security | receiver chooses. A receiver that depends on a digest for security | |||
will be vulnerable to attacks on the weakest algorithm it is willing | will be vulnerable to attacks on the weakest algorithm it is willing | |||
to accept. Endpoints are advised that sending multiple values | to accept. Endpoints are advised that sending multiple values | |||
consumes resources, which may be wasted if the receiver ignores them | consumes resources that may be wasted if the receiver ignores them | |||
(see Section 3). | (see Section 3). | |||
While algorithm agility allows the migration to stronger algorithms | While algorithm agility allows the migration to stronger algorithms, | |||
it does not prevent the use of weaker algorithms. Integrity fields | it does not prevent the use of weaker algorithms. Integrity fields | |||
do not provide any mitigations for downgrade or substitution attacks | do not provide any mitigations for downgrade or substitution attacks | |||
(see Section 1 of [RFC6211]) of the hashing algorithm. To protect | (see Section 1 of [RFC6211]) of the hashing algorithm. To protect | |||
against such attacks, endpoints could restrict their set of supported | against such attacks, endpoints could restrict their set of supported | |||
algorithms to stronger ones and protect the fields value by using TLS | algorithms to stronger ones and protect the fields' values by using | |||
and/or digital signatures. | TLS and/or digital signatures. | |||
6.7. Resource exhaustion | 6.7. Resource Exhaustion | |||
Integrity fields validation consumes computational resources. In | Integrity field validation consumes computational resources. In | |||
order to avoid resource exhaustion, implementations can restrict | order to avoid resource exhaustion, implementations can restrict | |||
validation of the algorithm types, number of validations, or the size | validation of the algorithm types, the number of validations, or the | |||
of content. In these cases, skipping validation entirely or ignoring | size of content. In these cases, skipping validation entirely or | |||
validation failure of a more-preferred algorithm leaves the | ignoring validation failure of a more-preferred algorithm leaves the | |||
possibility of a downgrade attack (see Section 6.6). | possibility of a downgrade attack (see Section 6.6). | |||
7. IANA Considerations | 7. IANA Considerations | |||
7.1. HTTP Field Name Registration | 7.1. HTTP Field Name Registration | |||
IANA is asked to update the "Hypertext Transfer Protocol (HTTP) Field | IANA has updated the "Hypertext Transfer Protocol (HTTP) Field Name | |||
Name Registry" registry ([HTTP]) according to the table below: | Registry" [HTTP] as shown in the table below: | |||
+---------------------+-----------+---------------------------------+ | +---------------------+-----------+---------------------------------+ | |||
| Field Name | Status | Reference | | | Field Name | Status | Reference | | |||
+---------------------+-----------+---------------------------------+ | +---------------------+-----------+---------------------------------+ | |||
| Content-Digest | permanent | Section 2 of this document | | | Content-Digest | permanent | Section 2 of RFC 9530 | | |||
| Repr-Digest | permanent | Section 3 of this document | | | Repr-Digest | permanent | Section 3 of RFC 9530 | | |||
| Want-Content-Digest | permanent | Section 4 of this document | | | Want-Content-Digest | permanent | Section 4 of RFC 9530 | | |||
| Want-Repr-Digest | permanent | Section 4 of this document | | | Want-Repr-Digest | permanent | Section 4 of RFC 9530 | | |||
| Digest | obsoleted | [RFC3230], Section 1.3 of this | | | Digest | obsoleted | [RFC3230], Section 1.3 of RFC | | |||
| | | document | | | | | 9530 | | |||
| Want-Digest | obsoleted | [RFC3230], Section 1.3 of this | | | Want-Digest | obsoleted | [RFC3230], Section 1.3 of RFC | | |||
| | | document | | | | | 9530 | | |||
+---------------------+-----------+---------------------------------+ | +---------------------+-----------+---------------------------------+ | |||
7.2. Establish the Hash Algorithms for HTTP Digest Fields Registry | Table 1: Hypertext Transfer Protocol (HTTP) Field Name Registry | |||
Update | ||||
IANA is requested to create the new "Hash Algorithms for HTTP Digest | 7.2. Creation of the Hash Algorithms for HTTP Digest Fields Registry | |||
Fields" registry at https://www.iana.org/assignments/http-digest- | ||||
hash-alg/ [1] and populate it with the entries in Table 1. The | ||||
procedure for new registrations is provided in Section 5. | ||||
+-----------+------------+-------------------------+----------------+ | IANA has created the new "Hash Algorithms for HTTP Digest Fields" | |||
| Algorithm | Status | Description | Reference(s) | | registry at <https://www.iana.org/assignments/http-digest-hash-alg/> | |||
| Key | | | | | and populated it with the entries in Table 2. The procedure for new | |||
+-----------+------------+-------------------------+----------------+ | registrations is provided in Section 5. | |||
| sha-512 | Active | The SHA-512 algorithm. | [RFC6234], | | ||||
| | | | [RFC4648], | | ||||
| | | | this document. | | ||||
| sha-256 | Active | The SHA-256 algorithm. | [RFC6234], | | ||||
| | | | [RFC4648], | | ||||
| | | | this document. | | ||||
| md5 | Deprecated | The MD5 algorithm. It | [RFC1321], | | ||||
| | | is vulnerable to | [RFC4648], | | ||||
| | | collision attacks; see | this document. | | ||||
| | | [NO-MD5] and | | | ||||
| | | [CMU-836068] | | | ||||
| sha | Deprecated | The SHA-1 algorithm. It | [RFC3174], | | ||||
| | | is vulnerable to | [RFC4648], | | ||||
| | | collision attacks; see | [RFC6234] this | | ||||
| | | [NO-SHA] and | document. | | ||||
| | | [IACR-2020-014] | | | ||||
| unixsum | Deprecated | The algorithm used by | [RFC4648], | | ||||
| | | the UNIX "sum" command. | [RFC6234], | | ||||
| | | | [UNIX], this | | ||||
| | | | document. | | ||||
| unixcksum | Deprecated | The algorithm used by | [RFC4648], | | ||||
| | | the UNIX "cksum" | [RFC6234], | | ||||
| | | command. | [UNIX], this | | ||||
| | | | document. | | ||||
| adler | Deprecated | The ADLER32 algorithm. | [RFC1950], | | ||||
| | | | this document. | | ||||
| crc32c | Deprecated | The CRC32c algorithm. | [RFC9260] | | ||||
| | | | appendix A, | | ||||
| | | | this document. | | ||||
+-----------+------------+-------------------------+----------------+ | ||||
Table 1: Initial Hash Algorithms | +-----------+------------+--------------------------+---------------+ | |||
| Algorithm | Status | Description | Reference | | ||||
| Key | | | | | ||||
+-----------+------------+--------------------------+---------------+ | ||||
| sha-512 | Active | The SHA-512 algorithm. | [RFC6234], | | ||||
| | | | [RFC4648], | | ||||
| | | | RFC 9530 | | ||||
| sha-256 | Active | The SHA-256 algorithm. | [RFC6234], | | ||||
| | | | [RFC4648], | | ||||
| | | | RFC 9530 | | ||||
| md5 | Deprecated | The MD5 algorithm. It is | [RFC1321], | | ||||
| | | vulnerable to collision | [RFC4648], | | ||||
| | | attacks; see [NO-MD5] | RFC 9530 | | ||||
| | | and [CMU-836068] | | | ||||
| sha | Deprecated | The SHA-1 algorithm. It | [RFC3174], | | ||||
| | | is vulnerable to | [RFC4648], | | ||||
| | | collision attacks; see | [RFC6234], | | ||||
| | | [NO-SHA] and | RFC 9530 | | ||||
| | | [IACR-2020-014] | | | ||||
| unixsum | Deprecated | The algorithm used by | [RFC4648], | | ||||
| | | the UNIX "sum" command. | [RFC6234], | | ||||
| | | | [UNIX], RFC | | ||||
| | | | 9530 | | ||||
| unixcksum | Deprecated | The algorithm used by | [RFC4648], | | ||||
| | | the UNIX "cksum" | [RFC6234], | | ||||
| | | command. | [UNIX], RFC | | ||||
| | | | 9530 | | ||||
| adler | Deprecated | The ADLER32 algorithm. | [RFC1950], | | ||||
| | | | RFC 9530 | | ||||
| crc32c | Deprecated | The CRC32c algorithm. | Appendix A of | | ||||
| | | | [RFC9260], | | ||||
| | | | RFC 9530 | | ||||
+-----------+------------+--------------------------+---------------+ | ||||
Table 2: Initial Hash Algorithms | ||||
7.3. Deprecate the Hypertext Transfer Protocol (HTTP) Digest Algorithm | 7.3. Deprecate the Hypertext Transfer Protocol (HTTP) Digest Algorithm | |||
Values Registry | Values Registry | |||
IANA is requested to deprecate the "Hypertext Transfer Protocol | IANA has deprecated the "Hypertext Transfer Protocol (HTTP) Digest | |||
(HTTP) Digest Algorithm Values" registry at | Algorithm Values" registry at <https://www.iana.org/assignments/http- | |||
https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml [2] | dig-alg/> and replaced the note on that registry with the following | |||
and replace the note on this registry with the following text: | text: | |||
"This registry is deprecated since it lists the algorithms that | This registry is deprecated since it lists the algorithms that can | |||
can be used with the Digest and Want-Digest fields defined in | be used with the Digest and Want-Digest fields defined in | |||
[RFC3230] https://www.iana.org/ [3], which has been obsoleted by | [RFC3230], which has been obsoleted by RFC 9530. While | |||
[rfc-to-be-this-document]. While registration is not closed, new | registration is not closed, new registrations are encouraged to | |||
registrations are encouraged to use the [Hash Algorithms for HTTP | use the Hash Algorithms for HTTP Digest Fields | |||
Digest Fields]https://www.iana.org/assignments/http-digest-hash- | (https://www.iana.org/assignments/http-digest-hash-alg/) registry | |||
alg/ [4] registry instead. | instead. | |||
8. References | 8. References | |||
8.1. Normative References | 8.1. Normative References | |||
[FOLDING] Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, | [FOLDING] Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, | |||
"Handling Long Lines in Content of Internet-Drafts and | "Handling Long Lines in Content of Internet-Drafts and | |||
RFCs", RFC 8792, DOI 10.17487/RFC8792, June 2020, | RFCs", RFC 8792, DOI 10.17487/RFC8792, June 2020, | |||
<https://www.rfc-editor.org/info/rfc8792>. | <https://www.rfc-editor.org/info/rfc8792>. | |||
skipping to change at page 19, line 45 ¶ | skipping to change at page 19, line 32 ¶ | |||
[STRUCTURED-FIELDS] | [STRUCTURED-FIELDS] | |||
Nottingham, M. and P. Kamp, "Structured Field Values for | Nottingham, M. and P. Kamp, "Structured Field Values for | |||
HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021, | HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021, | |||
<https://www.rfc-editor.org/info/rfc8941>. | <https://www.rfc-editor.org/info/rfc8941>. | |||
8.2. Informative References | 8.2. Informative References | |||
[CMU-836068] | [CMU-836068] | |||
Carnegie Mellon University, Software Engineering | Carnegie Mellon University, Software Engineering | |||
Institute, "MD5 Vulnerable to collision attacks", December | Institute, "MD5 vulnerable to collision attacks", December | |||
2008, <https://www.kb.cert.org/vuls/id/836068/>. | 2008, <https://www.kb.cert.org/vuls/id/836068/>. | |||
[I-D.thomson-http-mice] | [FIPS186-5] | |||
Thomson, M. and J. Yasskin, "Merkle Integrity Content | National Institute of Standards and Technology (NIST), | |||
Encoding", draft-thomson-http-mice-03 (work in progress), | "Digital Signature Standard (DSS)", | |||
August 2018. | DOI 10.6028/NIST.FIPS.186-5, FIPS PUB 186-5, February | |||
2023, <https://nvlpubs.nist.gov/nistpubs/FIPS/ | ||||
NIST.FIPS.186-5.pdf>. | ||||
[IACR-2020-014] | [IACR-2020-014] | |||
Leurent, G. and T. Peyrin, "SHA-1 is a Shambles", January | Leurent, G. and T. Peyrin, "SHA-1 is a Shambles", January | |||
2020, <https://eprint.iacr.org/2020/014.pdf>. | 2020, <https://eprint.iacr.org/2020/014.pdf>. | |||
[NIST800-32] | [MICE] Thomson, M. and J. Yasskin, "Merkle Integrity Content | |||
National Institute of Standards and Technology, U.S. | Encoding", draft-thomson-http-mice-03 (work in progress), | |||
Department of Commerce, "Introduction to Public Key | August 2018. | |||
Technology and the Federal PKI Infrastructure", February | ||||
2001, <https://nvlpubs.nist.gov/nistpubs/Legacy/SP/ | ||||
nistspecialpublication800-32.pdf>. | ||||
[NO-MD5] Turner, S. and L. Chen, "Updated Security Considerations | [NO-MD5] Turner, S. and L. Chen, "Updated Security Considerations | |||
for the MD5 Message-Digest and the HMAC-MD5 Algorithms", | for the MD5 Message-Digest and the HMAC-MD5 Algorithms", | |||
RFC 6151, DOI 10.17487/RFC6151, March 2011, | RFC 6151, DOI 10.17487/RFC6151, March 2011, | |||
<https://www.rfc-editor.org/info/rfc6151>. | <https://www.rfc-editor.org/info/rfc6151>. | |||
[NO-SHA] Polk, T., Chen, L., Turner, S., and P. Hoffman, "Security | [NO-SHA] Polk, T., Chen, L., Turner, S., and P. Hoffman, "Security | |||
Considerations for the SHA-0 and SHA-1 Message-Digest | Considerations for the SHA-0 and SHA-1 Message-Digest | |||
Algorithms", RFC 6194, DOI 10.17487/RFC6194, March 2011, | Algorithms", RFC 6194, DOI 10.17487/RFC6194, March 2011, | |||
<https://www.rfc-editor.org/info/rfc6194>. | <https://www.rfc-editor.org/info/rfc6194>. | |||
skipping to change at page 20, line 48 ¶ | skipping to change at page 20, line 37 ¶ | |||
[RFC7396] Hoffman, P. and J. Snell, "JSON Merge Patch", RFC 7396, | [RFC7396] Hoffman, P. and J. Snell, "JSON Merge Patch", RFC 7396, | |||
DOI 10.17487/RFC7396, October 2014, | DOI 10.17487/RFC7396, October 2014, | |||
<https://www.rfc-editor.org/info/rfc7396>. | <https://www.rfc-editor.org/info/rfc7396>. | |||
[RFC7696] Housley, R., "Guidelines for Cryptographic Algorithm | [RFC7696] Housley, R., "Guidelines for Cryptographic Algorithm | |||
Agility and Selecting Mandatory-to-Implement Algorithms", | Agility and Selecting Mandatory-to-Implement Algorithms", | |||
BCP 201, RFC 7696, DOI 10.17487/RFC7696, November 2015, | BCP 201, RFC 7696, DOI 10.17487/RFC7696, November 2015, | |||
<https://www.rfc-editor.org/info/rfc7696>. | <https://www.rfc-editor.org/info/rfc7696>. | |||
[RFC7807] Nottingham, M. and E. Wilde, "Problem Details for HTTP | ||||
APIs", RFC 7807, DOI 10.17487/RFC7807, March 2016, | ||||
<https://www.rfc-editor.org/info/rfc7807>. | ||||
[RFC8188] Thomson, M., "Encrypted Content-Encoding for HTTP", | [RFC8188] Thomson, M., "Encrypted Content-Encoding for HTTP", | |||
RFC 8188, DOI 10.17487/RFC8188, June 2017, | RFC 8188, DOI 10.17487/RFC8188, June 2017, | |||
<https://www.rfc-editor.org/info/rfc8188>. | <https://www.rfc-editor.org/info/rfc8188>. | |||
[RFC9112] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [RFC9112] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | |||
June 2022, <https://www.rfc-editor.org/info/rfc9112>. | June 2022, <https://www.rfc-editor.org/info/rfc9112>. | |||
[RFC9260] Stewart, R., Tuexen, M., and K. Nielsen, "Stream Control | [RFC9260] Stewart, R., Tuexen, M., and K. Nielsen, "Stream Control | |||
Transmission Protocol", RFC 9260, DOI 10.17487/RFC9260, | Transmission Protocol", RFC 9260, DOI 10.17487/RFC9260, | |||
June 2022, <https://www.rfc-editor.org/info/rfc9260>. | June 2022, <https://www.rfc-editor.org/info/rfc9260>. | |||
[RFC9457] Nottingham, M., Wilde, E., and S. Dalal, "Problem Details | ||||
for HTTP APIs", RFC 9457, DOI 10.17487/RFC9457, July 2023, | ||||
<https://www.rfc-editor.org/info/rfc9457>. | ||||
[SIGNATURES] | [SIGNATURES] | |||
Backman, A., Richer, J., and M. Sporny, "HTTP Message | Backman, A., Richer, J., and M. Sporny, "HTTP Message | |||
Signatures", draft-ietf-httpbis-message-signatures-17 | Signatures", draft-ietf-httpbis-message-signatures-19 | |||
(work in progress), May 2023. | (work in progress), July 2023. | |||
[TLS] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[UNIX] The Open Group, "The Single UNIX Specification, Version 2 | [UNIX] The Open Group, "The Single UNIX Specification, Version 2 | |||
- 6 Vol Set for UNIX 98", February 1997. | - 6 Vol Set for UNIX 98", January 1998. | |||
8.3. URIs | ||||
[1] https://www.iana.org/assignments/http-digest-hash-alg/ | ||||
[2] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | ||||
[3] https://www.iana.org/ | ||||
[4] https://www.iana.org/assignments/http-digest-hash-alg/ | ||||
Appendix A. Resource Representation and Representation Data | Appendix A. Resource Representation and Representation Data | |||
This section following examples show how representation metadata, | The following examples show how representation metadata, content | |||
content transformations, and method impacts on the message and | transformations, and methods impact the message and content. These | |||
content. These examples a not exhaustive. | examples a not exhaustive. | |||
Unless otherwise indicated, the examples are based on the JSON object | Unless otherwise indicated, the examples are based on the JSON object | |||
"{"hello": "world"}" followed by an LF. When the content contains | "{"hello": "world"}" followed by an LF. When the content contains | |||
non-printable characters (e.g., when it is encoded) it is shown as a | non-printable characters (e.g., when it is encoded), it is shown as a | |||
sequence of hex-encoded bytes. | sequence of hex-encoded bytes. | |||
Consider a client that wishes to upload a JSON object using the PUT | Consider a client that wishes to upload a JSON object using the PUT | |||
method. It could do this using the application/json content type | method. It could do this using the application/json Content-Type | |||
without any content coding. | without any content coding. | |||
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"} | |||
Request containing a JSON object without any content coding | Request Containing a JSON Object without Any Content Coding | |||
However, the use of content coding is quite common. The client could | However, the use of content coding is quite common. The client could | |||
also upload the same data with a gzip coding (Section 8.4.1.3 of | also upload the same data with a GZIP coding (Section 8.4.1.3 of | |||
[HTTP]). Note that in this case, the "Content-Length" contains a | [HTTP]). Note that in this case, the "Content-Length" contains a | |||
larger value due to the coding overheads. | larger value due to the coding overheads. | |||
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 | |||
Figure 1: Request containing a gzip-encoded JSON object | Figure 1: Request Containing a GZIP-Encoded JSON Object | |||
Sending the gzip coded data without indicating it via "Content- | Sending the GZIP-coded data without indicating it via "Content- | |||
Encoding" means that the content is malformed. In this case, the | Encoding" means that the content is malformed. In this case, the | |||
server can reply with an error. | server can reply with an error. | |||
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 | |||
Request containing malformed JSON | Request Containing Malformed JSON | |||
HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
An error response for a malformed content | An Error Response for Malformed Content | |||
A Range-Request affects the transferred message content. In this | A Range-Request affects the transferred message content. In this | |||
example, the client is accessing the resource at "/entries/1234", | example, the client is accessing the resource at "/entries/1234", | |||
which is the JSON object "{"hello": "world"}" followed by an LF. | which is the JSON object "{"hello": "world"}" followed by an LF. | |||
However, the client has indicated a preferred content coding and a | However, the client has indicated a preferred content coding and a | |||
specific byte range. | specific byte range. | |||
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 | |||
Request for partial content | Request for Partial Content | |||
The server satisfies the client request by responding with a partial | The server satisfies the client request by responding with a partial | |||
representation (equivalent to the first 10 of the JSON object | representation (equivalent to the first 10 bytes of the JSON object | |||
displayed in whole in Figure 1). | displayed in whole in Figure 1). | |||
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 | |||
Partial response from a gzip-encoded representation | Partial Response from a GZIP-Encoded Representation | |||
Aside from content coding or range requests, the method can also | Aside from content coding or range requests, the method can also | |||
affect the transferred message content. For example, the response to | affect the transferred message content. For example, the response to | |||
a HEAD request does not carry content but in this example case does | a HEAD request does not carry content, but this example case includes | |||
include a Content-Length; see Section 8.6 of [HTTP]. | Content-Length; see Section 8.6 of [HTTP]. | |||
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 | |||
HEAD request | HEAD Request | |||
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 | |||
Response to HEAD request (empty content) | Response to HEAD Request (Empty Content) | |||
Finally, the semantics of a response might decouple the target URI | Finally, the semantics of a response might decouple the target URI | |||
from the enclosed representation. In the example below, the client | from the enclosed representation. In the example below, the client | |||
issues a POST request directed to "/authors/" but the response | issues a POST request directed to "/authors/", but the response | |||
includes a "Content-Location" header field that indicates the | includes a "Content-Location" header field indicating that the | |||
enclosed representation refers to the resource available at | enclosed representation refers to the resource available at | |||
"/authors/123". Note that "Content-Length" is not sent in this | "/authors/123". Note that "Content-Length" is not sent in this | |||
example. | example. | |||
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"} | |||
POST request | POST Request | |||
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"} | |||
Response with Content-Location header | Response with Content-Location Header | |||
Appendix B. Examples of Unsolicited Digest | Appendix B. Examples of Unsolicited Digest | |||
The following examples demonstrate interactions where a server | The following examples demonstrate interactions where a server | |||
responds with a "Content-Digest" or "Repr-Digest" fields even though | responds with a "Content-Digest" or "Repr-Digest" field, even though | |||
the client did not solicit one using "Want-Content-Digest" or "Want- | the client did not solicit one using "Want-Content-Digest" or "Want- | |||
Repr-Digest". | Repr-Digest". | |||
Some examples include JSON objects in the content. For presentation | Some examples include JSON objects in the content. For presentation | |||
purposes, objects that fit completely within the line-length limits | purposes, objects that fit completely within the line-length limits | |||
are presented on a single line using compact notation with no leading | are presented on a single line using compact notation with no leading | |||
space. Objects that would exceed line-length limits are presented | space. Objects that would exceed line-length limits are presented | |||
across multiple lines (one line per key-value pair) with 2 spaces of | across multiple lines (one line per key-value pair) with two spaces | |||
leading indentation. | of leading indentation. | |||
Checksum mechanisms defined in this document are media-type agnostic | 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. While examples can | Examples are calculated inclusive of any space. While examples can | |||
include both fields, "Content-Digest" and "Repr-Digest" can be | include both fields, "Content-Digest" and "Repr-Digest" can be | |||
returned independently. | returned independently. | |||
B.1. Server Returns Full Representation Data | B.1. Server Returns Full Representation Data | |||
In this example, the message content conveys complete representation | In this example, the message content conveys complete representation | |||
data. This means that in the response, "Content-Digest" and "Repr- | data. This means that in the response, "Content-Digest" and "Repr- | |||
Digest" are both computed over the JSON object "{"hello": "world"}" | Digest" are both computed over the JSON object "{"hello": "world"}" | |||
followed by an LF, and thus have the same value. | followed by an LF; thus, they have the same value. | |||
GET /items/123 HTTP/1.1 | GET /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
GET request for an item | GET Request for an Item | |||
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=: | |||
{"hello": "world"} | {"hello": "world"} | |||
Response with identical Repr-Digest and Content-Digest | Response with Identical Repr-Digest and Content-Digest | |||
B.2. Server Returns No Representation Data | B.2. Server Returns No Representation Data | |||
In this example, a HEAD request is used to retrieve the checksum of a | In this example, a HEAD request is used to retrieve the checksum of a | |||
resource. | resource. | |||
The response "Content-Digest" field-value is computed on empty | The response "Content-Digest" field-value is computed on empty | |||
content. "Repr-Digest" is calculated over the JSON object "{"hello": | content. "Repr-Digest" is calculated over the JSON object "{"hello": | |||
"world"}" followed by an LF, which is not shown because there is no | "world"}" followed by an LF, which is not shown because there is no | |||
content. | content. | |||
HEAD /items/123 HTTP/1.1 | HEAD /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
HEAD request for an item | HEAD Request for an Item | |||
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=: | |||
Response with both Content-Digest and Digest; empty content | Response with Both Content-Digest and Digest (Empty Content) | |||
B.3. Server Returns Partial Representation Data | B.3. Server Returns Partial Representation Data | |||
In this example, the client makes a range request and the server | In this example, the client makes a range request and the server | |||
responds with partial content. | responds with partial content. | |||
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 | |||
Request for partial content | Request for Partial Content | |||
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"} | |||
Partial response with both Content-Digest and Repr-Digest | Partial Response with Both Content-Digest and Repr-Digest | |||
In the response message above, note that the "Repr-Digest" and | In the response message above, note that the "Repr-Digest" and | |||
"Content-Digests" are different. The "Repr-Digest" field-value is | "Content-Digests" are different. The "Repr-Digest" field-value is | |||
calculated across the entire JSON object "{"hello": "world"}" | calculated across the entire JSON object "{"hello": "world"}" | |||
followed by an LF, and the field is | followed by an LF, and the field appears as follows: | |||
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=: | |||
However, since the message content is constrained to bytes 10-18, the | However, since the message content is constrained to bytes 10-18, the | |||
"Content-Digest" field-value is calculated over the sequence | "Content-Digest" field-value is calculated over the sequence | |||
""world"}" followed by an LF, thus resulting in | ""world"}" followed by an LF, thus resulting in the following: | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
Content-Digest: \ | Content-Digest: \ | |||
sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=: | sha-256=:jjcgBDWNAtbYUXI37CVG3gRuGOAjaaDRGpIUFsdyepQ=: | |||
B.4. Client and Server Provide Full Representation Data | B.4. Client and Server Provide Full Representation Data | |||
The request contains a "Repr-Digest" field-value calculated on the | The request contains a "Repr-Digest" field-value calculated on the | |||
enclosed representation. It also includes an "Accept-Encoding: br" | enclosed representation. It also includes an "Accept-Encoding: br" | |||
header field that advertises the client supports Brotli encoding. | header field that advertises that the client supports Brotli | |||
encoding. | ||||
The response includes a "Content-Encoding: br" that indicates the | The response includes a "Content-Encoding: br" that indicates the | |||
selected representation is Brotli-encoded. The "Repr-Digest" field- | selected representation is Brotli-encoded. The "Repr-Digest" field- | |||
value is therefore different compared to the request. | value is therefore different compared to the request. | |||
For presentation purposes, the response body is displayed as a | For presentation purposes, the response body is displayed as a | |||
sequence of hex-encoded bytes because it contains non-printable | sequence of hex-encoded bytes because it contains non-printable | |||
characters. | characters. | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
skipping to change at page 28, line 19 ¶ | skipping to change at page 28, line 19 ¶ | |||
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 | |||
Response with Digest of encoded response | Response with Digest of Encoded Response | |||
B.5. Client Provides Full Representation Data, Server Provides No | B.5. Client Provides Full Representation Data and Server Provides No | |||
Representation Data | Representation Data | |||
The request "Repr-Digest" field-value is calculated on the enclosed | The request "Repr-Digest" field-value is calculated on the enclosed | |||
content, which is the JSON object "{"hello": "world"}" followed by an | content, which is the JSON object "{"hello": "world"}" followed by an | |||
LF | LF. | |||
The response "Repr-Digest" field-value depends on the representation | The response "Repr-Digest" field-value depends on the representation | |||
metadata header fields, including "Content-Encoding: br" even when | metadata header fields, including "Content-Encoding: br", even when | |||
the response does not contain content. | the response does not contain content. | |||
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"} | |||
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=: | |||
Empty response with Digest | Empty Response with Digest | |||
B.6. Client and Server Provide Full Representation Data | B.6. Client and Server Provide Full Representation Data | |||
The response contains two digest values using different algorithms. | The response contains two digest values using different algorithms. | |||
For presentation purposes, the response body is displayed as a | For presentation purposes, the response body is displayed as a | |||
sequence of hex-encoded bytes because it contains non-printable | sequence of hex-encoded bytes because it contains non-printable | |||
characters. | characters. | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
skipping to change at page 29, line 43 ¶ | skipping to change at page 29, line 43 ¶ | |||
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 | |||
Response with Digest of Encoded Content | Response with Digest of Encoded Content | |||
B.7. POST Response does not Reference the Request URI | B.7. POST Response Does Not Reference the Request URI | |||
The request "Repr-Digest" field-value is computed on the enclosed | The request "Repr-Digest" field-value is computed on the enclosed | |||
representation (see Section 3.1), which is the JSON object "{"title": | representation (see Section 3.1), which is the JSON object "{"title": | |||
"New Title"}" followed by an LF. | "New Title"}" followed by an LF. | |||
The representation enclosed in the response is a multiline JSON | The representation enclosed in the response is a multiline JSON | |||
object followed by an LF. It refers to the resource identified by | object followed by an LF. It refers to the resource identified by | |||
"Content-Location" (see Section 6.4.2 of [HTTP]); an application can | "Content-Location" (see Section 6.4.2 of [HTTP]); thus, an | |||
thus use "Repr-Digest" in association with the resource referenced by | application can use "Repr-Digest" in association with the resource | |||
"Content-Location". | referenced by "Content-Location". | |||
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"} | |||
skipping to change at page 31, line 36 ¶ | skipping to change at page 31, line 36 ¶ | |||
} | } | |||
Response with Digest of Representation | Response with Digest of Representation | |||
B.9. Digest with PATCH | B.9. Digest with PATCH | |||
This case is analogous to a POST request where the target resource | This case is analogous to a POST request where the target resource | |||
reflects the target URI. | reflects the target URI. | |||
The PATCH request uses the "application/merge-patch+json" media type | The PATCH request uses the "application/merge-patch+json" media type | |||
defined in [RFC7396]. "Repr-Digest" is calculated on the content, | defined in [RFC7396]. "Repr-Digest" is calculated on the content | |||
which corresponds to the patch document and is the JSON object | that corresponds to the patch document and is the JSON object | |||
"{"title": "New Title"}" followed by an LF. | "{"title": "New Title"}" followed by an LF. | |||
The response "Repr-Digest" field-value is computed on the complete | The response "Repr-Digest" field-value is computed on the complete | |||
representation of the patched resource. It is a multiline JSON | representation of the patched resource. It is a multiline JSON | |||
object followed by an LF. | object followed by an LF. | |||
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 | |||
skipping to change at page 32, line 27 ¶ | skipping to change at page 32, line 27 ¶ | |||
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" | |||
} | } | |||
Response with Digest of Representation | Response with Digest of Representation | |||
Note that a "204 No Content" response without content but with the | Note that a "204 No Content" response without content, but with the | |||
same "Repr-Digest" field-value would have been legitimate too. In | same "Repr-Digest" field-value, would have been legitimate too. In | |||
that case, "Content-Digest" would have been computed on an empty | that case, "Content-Digest" would have been computed on an empty | |||
content. | content. | |||
B.10. Error responses | B.10. Error Responses | |||
In error responses, the representation data does not necessarily | In error responses, the representation data does not necessarily | |||
refer to the target resource. Instead, it refers to the | refer to the target resource. Instead, it refers to the | |||
representation of the error. | representation of the error. | |||
In the following example, a client sends the same request from | In the following example, a client sends the same request from | |||
Figure 2 to patch the resource located at /books/123. However, the | Figure 2 to patch the resource located at /books/123. However, the | |||
resource does not exist and the server generates a 404 response with | resource does not exist and the server generates a 404 response with | |||
a body that describes the error in accordance with [RFC7807]. | a body that describes the error in accordance with [RFC9457]. | |||
The response "Repr-Digest" field-value is computed on this enclosed | The response "Repr-Digest" field-value is computed on this enclosed | |||
representation. It is a multiline JSON object followed by an LF. | representation. It is a multiline JSON object followed by an LF. | |||
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", | |||
skipping to change at page 33, line 25 ¶ | skipping to change at page 33, line 25 ¶ | |||
Response with Digest of Error Representation | Response with Digest of Error Representation | |||
B.11. Use with Trailer Fields and Transfer Coding | B.11. Use with Trailer Fields and Transfer Coding | |||
An origin server sends "Repr-Digest" as trailer field, so it can | An origin server sends "Repr-Digest" as trailer field, so it can | |||
calculate digest-value while streaming content and thus mitigate | calculate digest-value while streaming content and thus mitigate | |||
resource consumption. The "Repr-Digest" field-value is the same as | resource consumption. The "Repr-Digest" field-value is the same as | |||
in Appendix B.1 because "Repr-Digest" is designed to be independent | in Appendix B.1 because "Repr-Digest" is designed to be independent | |||
of the use of one or more transfer codings (see Section 3). | of the use of one or more transfer codings (see Section 3). | |||
In the response content below, the string "\r\n" represent the bytes | In the response content below, the string "\r\n" represents the CRLF | |||
CRLF. | bytes. | |||
GET /items/123 HTTP/1.1 | GET /items/123 HTTP/1.1 | |||
Host: foo.example | Host: foo.example | |||
GET Request | GET Request | |||
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 page 34, line 34 ¶ | skipping to change at page 34, line 34 ¶ | |||
Appendix C. Examples of Want-Repr-Digest Solicited Digest | Appendix C. Examples of Want-Repr-Digest Solicited Digest | |||
The following examples demonstrate interactions where a client | The following examples demonstrate interactions where a client | |||
solicits a "Repr-Digest" using "Want-Repr-Digest". The behavior of | solicits a "Repr-Digest" using "Want-Repr-Digest". The behavior of | |||
"Content-Digest" and "Want-Content-Digest" is identical. | "Content-Digest" and "Want-Content-Digest" is identical. | |||
Some examples include JSON objects in the content. For presentation | Some examples include JSON objects in the content. For presentation | |||
purposes, objects that fit completely within the line-length limits | purposes, objects that fit completely within the line-length limits | |||
are presented on a single line using compact notation with no leading | are presented on a single line using compact notation with no leading | |||
space. Objects that would exceed line-length limits are presented | space. Objects that would exceed line-length limits are presented | |||
across multiple lines (one line per key-value pair) with 2 spaces of | across multiple lines (one line per key-value pair) with two spaces | |||
leading indentation. | of leading indentation. | |||
Checksum mechanisms described in this document are media-type | Checksum mechanisms described in this document are media-type | |||
agnostic and do not provide canonicalization algorithms for specific | agnostic and do not provide canonicalization algorithms for specific | |||
formats. Examples are calculated inclusive of any space. | formats. Examples are calculated inclusive of any space. | |||
C.1. Server Selects Client's Least Preferred Algorithm | C.1. Server Selects Client's Least Preferred Algorithm | |||
The client requests a digest, preferring "sha". The server is free | The client requests a digest and prefers "sha". The server is free | |||
to reply with "sha-256" anyway. | to reply with "sha-256" anyway. | |||
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 | |||
GET Request with Want-Repr-Digest | GET Request with Want-Repr-Digest | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
skipping to change at page 35, line 26 ¶ | skipping to change at page 35, line 26 ¶ | |||
sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==: | sha-256=:RK/0qy18MlBSVnWgjwz6lZEWjP/lF5HF9bvEF8FabDg==: | |||
{"hello": "world"} | {"hello": "world"} | |||
Response with Different Algorithm | Response with Different Algorithm | |||
C.2. Server Selects Algorithm Unsupported by Client | C.2. Server Selects Algorithm Unsupported by Client | |||
The client requests a "sha" digest because that is the only algorithm | The client requests a "sha" digest because that is the only algorithm | |||
it supports. The server is not obliged to produce a response | it supports. The server is not obliged to produce a response | |||
containing a "sha" digest, it instead uses a different algorithm. | containing a "sha" digest; it instead uses a different algorithm. | |||
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 | |||
GET Request with Want-Repr-Digest | GET Request with Want-Repr-Digest | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
skipping to change at page 36, line 8 ¶ | skipping to change at page 36, line 8 ¶ | |||
sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | sha-512=:YMAam51Jz/jOATT6/zvHrLVgOYTGFy1d6GJiOHTohq4yP+pgk4vf2aCs\ | |||
yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | yRZOtw8MjkM7iw7yZ/WkppmM44T3qg==: | |||
{"hello": "world"} | {"hello": "world"} | |||
Response with Unsupported Algorithm | Response with Unsupported Algorithm | |||
C.3. Server Does Not Support Client Algorithm and Returns an Error | C.3. Server Does Not Support Client Algorithm and Returns an Error | |||
Appendix C.2 is an example where a server ignores the client's | Appendix C.2 is an example where a server ignores the client's | |||
preferred digest algorithm. Alternatively a server can also reject | preferred digest algorithm. Alternatively, a server can also reject | |||
the request and return a response with error status code such as 4xx | the request and return a response with an error status code such as | |||
or 5xx. This specification does not prescribe any requirement on | 4xx or 5xx. This specification does not prescribe any requirement on | |||
status code selection; the follow example illustrates one possible | status code selection; the following example illustrates one possible | |||
option. | option. | |||
In this example, the client requests a "sha" "Repr-Digest", and the | In this example, the client requests a "sha" "Repr-Digest", and the | |||
server returns an error with problem details [RFC7807] contained in | server returns an error with problem details [RFC9457] contained in | |||
the content. The problem details contain a list of the hashing | the content. The problem details contain a list of the hashing | |||
algorithms that the server supports. This is purely an example, this | algorithms that the server supports. This is purely an example; this | |||
specification does not define any format or requirements for such | specification does not define any format or requirements for such | |||
content. | content. | |||
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 | |||
GET Request with Want-Repr-Digest | GET Request with Want-Repr-Digest | |||
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 | |||
} | } | |||
Response advertising the supported algorithms | Response Advertising the Supported Algorithms | |||
Appendix D. Sample Digest Values | Appendix D. Sample Digest Values | |||
This section shows examples of digest values for different hashing | This section shows examples of digest values for different hashing | |||
algorithms. The input value is the JSON object "{"hello": "world"}". | algorithms. The input value is the JSON object "{"hello": "world"}". | |||
The digest values are each produced by running the relevant hashing | The digest values are each produced by running the relevant hashing | |||
algorithm over the input and running the output bytes through "Byte | algorithm over the input and running the output bytes through "Byte | |||
Sequence" serialization; see Section 4.1.8 of [STRUCTURED-FIELDS]. | Sequence" serialization; see Section 4.1.8 of [STRUCTURED-FIELDS]. | |||
NOTE: '\' line wrapping per RFC 8792 | NOTE: '\' line wrapping per RFC 8792 | |||
skipping to change at page 37, line 27 ¶ | skipping to change at page 37, line 27 ¶ | |||
unixcksum - :7zsHAA==: | unixcksum - :7zsHAA==: | |||
adler - :OZkGFw==: | adler - :OZkGFw==: | |||
crc32c - :Q3lHIA==: | crc32c - :Q3lHIA==: | |||
Appendix E. Migrating from RFC 3230 | Appendix E. Migrating from RFC 3230 | |||
HTTP digests are computed by applying a hashing algorithm to input | HTTP digests are computed by applying a hashing algorithm to input | |||
data. RFC 3230 defined the input data as an "instance", a term it | data. [RFC3230] defined the input data as an "instance", a term it | |||
also defined. The concept of instance has since been superseded by | also defined. The concept of an instance has since been superseded | |||
the HTTP semantic term "representation". It is understood that some | by the HTTP semantic term "representation". It is understood that | |||
implementations of RFC 3230 mistook "instance" to mean HTTP content. | some implementations of [RFC3230] mistook "instance" to mean HTTP | |||
Using content for the Digest field is an error that leads to | content. Using content for the Digest field is an error that leads | |||
interoperability problems between peers that implement RFC 3230. | to interoperability problems between peers that implement [RFC3230]. | |||
RFC 3230 was only ever intended to use what HTTP now defines as | [RFC3230] was only ever intended to use what HTTP now defines as | |||
selected representation data. The semantic concept of digest and | selected representation data. The semantic concept of digest and | |||
representation are explained alongside the definition of the Repr- | representation are explained alongside the definition of the Repr- | |||
Digest field (Section 3). | Digest field (Section 3). | |||
While the syntax of Digest and Repr-Digest are different, the | While the syntax of Digest and Repr-Digest are different, the | |||
considerations and examples this document gives for Repr-Digest apply | considerations and examples this document gives for Repr-Digest apply | |||
equally to Digest because they operate on the same input data; see | equally to Digest because they operate on the same input data; see | |||
Sections 3.1, 6 and 6.3. | Sections 3.1, 6 and 6.3. | |||
RFC 3230 could never communicate the digest of HTTP message content | [RFC3230] could never communicate the digest of HTTP message content | |||
in the Digest field; Content-Digest now provides that capability. | in the Digest field; Content-Digest now provides that capability. | |||
RFC 3230 allowed algorithms to define their output encoding format | [RFC3230] allowed algorithms to define their output encoding format | |||
for use with the Digest field. This resulted in a mix of formats | for use with the Digest field. This resulted in a mix of formats | |||
such as base64, hex or decimal. By virtue of using Structured | such as base64, hex, or decimal. By virtue of using Structured | |||
fields, Content-Digest and Repr-Digest use only a single encoding | Fields, Content-Digest, and Repr-Digest use only a single encoding | |||
format. Further explanation and examples are provided in Appendix D. | format. Further explanation and examples are provided in Appendix D. | |||
Acknowledgements | Acknowledgements | |||
This document is based on ideas from [RFC3230], so thanks to Jeff | This document is based on ideas from [RFC3230], so thanks to Jeff | |||
Mogul and Arthur Van Hoff for their great work. The original idea of | Mogul and Arthur Van Hoff for their great work. The original idea of | |||
refreshing RFC3230 arose from an interesting discussion with Mark | refreshing [RFC3230] arose from an interesting discussion with Mark | |||
Nottingham, Jeffrey Yasskin, and Martin Thomson when reviewing the | Nottingham, Jeffrey Yasskin, and Martin Thomson when reviewing the | |||
MICE content coding. | MICE content coding. | |||
Thanks to Julian Reschke for his valuable contributions to this | Thanks to Julian Reschke for his valuable contributions to this | |||
document, and to the following contributors that have helped improve | document, and to the following contributors that have helped improve | |||
this specification by reporting bugs, asking smart questions, | this specification by reporting bugs, asking smart questions, | |||
drafting or reviewing text, and evaluating open issues: Mike Bishop, | drafting or reviewing text, and evaluating open issues: Mike Bishop, | |||
Brian Campbell, Matthew Kerwin, James Manger, Tommy Pauly, Sean | Brian Campbell, Matthew Kerwin, James Manger, Tommy Pauly, Sean | |||
Turner, Justin Richer, and Erik Wilde. | Turner, Justin Richer, and Erik Wilde. | |||
Code Samples | ||||
This section is to be removed before publishing as an RFC. | ||||
How can I generate and validate the digest values, computed over the | ||||
JSON object "{"hello": "world"}" followed by an LF, shown in the | ||||
examples throughout this document? | ||||
The following python3 code can be used to generate digests for JSON | ||||
objects 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. | ||||
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==' | ||||
Changes | ||||
This section is to be removed before publishing as an RFC. | ||||
H.1. Since draft-ietf-httpbis-digest-headers-12 | ||||
o Be clearer that applications can enforce additional requirements | ||||
wrt digest | ||||
o Change algorithm status names: s/standard/active, s/insecure/ | ||||
deprecated | ||||
o Remove "reserved" algorithm status | ||||
o Provide clear guidance about the use of standard or deprecated | ||||
algorithms | ||||
o Editorial or minor changes | ||||
H.2. Since draft-ietf-httpbis-digest-headers-11 | ||||
o Editorial or minor changes | ||||
H.3. Since draft-ietf-httpbis-digest-headers-10 | ||||
o Editorial or minor changes | ||||
H.4. Since draft-ietf-httpbis-digest-headers-09 | ||||
o Editorial or minor changes | ||||
H.5. Since draft-ietf-httpbis-digest-headers-08 | ||||
o Add note about migrating from RFC 3230. #1968, #1971 | ||||
o Clarify what Want-* means in responses. #2097 | ||||
o Editorial changes to structure and to align to HTTP style guide. | ||||
H.6. Since draft-ietf-httpbis-digest-headers-07 | ||||
o Introduced Repr-Digest and Want-Repr-Digest, and deprecated Digest | ||||
and Want-Digest. Use of Structured Fields. #1993, #1919 | ||||
o IANA refactoring. #1983 | ||||
o No normative text in security considerations. #1972 | ||||
H.7. Since draft-ietf-httpbis-digest-headers-06 | ||||
o Remove id-sha-256 and id-sha-512 from the list of supported | ||||
algorithms #855 | ||||
H.8. Since draft-ietf-httpbis-digest-headers-05 | ||||
o Reboot digest-algorithm values registry #1567 | ||||
o Add Content-Digest #1542 | ||||
o Remove SRI section #1478 | ||||
H.9. Since draft-ietf-httpbis-digest-headers-04 | ||||
o Improve SRI section #1354 | ||||
o About duplicate digest-algorithms #1221 | ||||
o Improve security considerations #852 | ||||
o md5 and sha deprecation references #1392 | ||||
o Obsolete 3230 #1395 | ||||
o Editorial #1362 | ||||
H.10. Since draft-ietf-httpbis-digest-headers-03 | ||||
o Reference semantics-12 | ||||
o Detail encryption quirks | ||||
o Details on Algorithm agility #1250 | ||||
o Obsolete parameters #850 | ||||
H.11. Since draft-ietf-httpbis-digest-headers-02 | ||||
o Deprecate SHA-1 #1154 | ||||
o Avoid id-* with encrypted content | ||||
o Digest is independent of MESSAGING and HTTP/1.1 is not normative | ||||
#1215 | ||||
o Identity is not a valid field value for content-encoding #1223 | ||||
o Mention trailers #1157 | ||||
o Reference httpbis-semantics #1156 | ||||
o Add contentMD5 as an obsoleted digest-algorithm #1249 | ||||
o Use lowercase digest-algorithms names in the doc and in the | ||||
digest-algorithm IANA table. | ||||
H.12. Since draft-ietf-httpbis-digest-headers-01 | ||||
o Digest of error responses is computed on the error representation- | ||||
data #1004 | ||||
o Effect of HTTP semantics on payload and message body moved to | ||||
appendix #1122 | ||||
o Editorial refactoring, moving headers sections up. #1109-#1112, | ||||
#1116, #1117, #1122-#1124 | ||||
H.13. Since draft-ietf-httpbis-digest-headers-00 | ||||
o Align title with document name | ||||
o Add id-sha-* algorithm examples #880 | ||||
o Reference [RFC6234] and [RFC3174] instead of FIPS-1 | ||||
o Deprecate MD5 | ||||
o Obsolete ADLER-32 but don't forbid it #828 | ||||
o Update CRC32C value in IANA table #828 | ||||
o Use when acting on resources (POST, PATCH) #853 | ||||
o Added Relationship with SRI, draft Use Cases #868, #971 | ||||
o Warn about the implications of "Content-Location" | ||||
Authors' Addresses | Authors' Addresses | |||
Roberto Polli | Roberto Polli | |||
Team Digitale, Italian Government | Team Digitale, Italian Government | |||
Italy | Italy | |||
Email: robipolli@gmail.com | Email: robipolli@gmail.com | |||
Lucas Pardue | Lucas Pardue | |||
Cloudflare | Cloudflare | |||
Email: lucaspardue.24.7@gmail.com | Email: lucas@lucaspardue.com | |||
End of changes. 160 change blocks. | ||||
535 lines changed or deleted | 326 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |