| 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 October 09, 2025 | |||
| 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) 2025 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/ | ||||