| draft-ietf-httpbis-digest-headers-02.txt | draft-ietf-httpbis-digest-headers-03.txt | |||
|---|---|---|---|---|
| HTTP R. Polli | HTTP R. Polli | |||
| Internet-Draft Team Digitale, Italian Government | Internet-Draft Team Digitale, Italian Government | |||
| Intended status: Standards Track L. Pardue | Intended status: Standards Track L. Pardue | |||
| Expires: September 10, 2020 Cloudflare | Expires: March 11, 2021 Cloudflare | |||
| March 09, 2020 | September 07, 2020 | |||
| Digest Headers | Digest Headers | |||
| draft-ietf-httpbis-digest-headers-02 | draft-ietf-httpbis-digest-headers-03 | |||
| Abstract | Abstract | |||
| This document defines the Digest and Want-Digest header fields for | This document defines the HTTP Digest and Want-Digest fields, thus | |||
| HTTP, thus allowing client and server to negotiate an integrity | allowing client and server to negotiate an integrity checksum of the | |||
| checksum of the exchanged resource representation data. | exchanged resource representation data. | |||
| This document obsoletes RFC 3230. It replaces the term "instance" | This document obsoletes RFC 3230. It replaces the term "instance" | |||
| with "representation", which makes it consistent with the HTTP | with "representation", which makes it consistent with the HTTP | |||
| Semantic and Context defined in RFC 7231. | Semantic and Context defined in draft-ietf-httpbis-semantics. | |||
| Note to Readers | Note to Readers | |||
| _RFC EDITOR: please remove this section before publication_ | _RFC EDITOR: please remove this section before publication_ | |||
| Discussion of this draft takes place on the HTTP working group | Discussion of this draft takes place on the HTTP working group | |||
| mailing list (ietf-http-wg@w3.org), which is archived at | mailing list (ietf-http-wg@w3.org), which is archived at | |||
| https://lists.w3.org/Archives/Public/ietf-http-wg/ [1]. | https://lists.w3.org/Archives/Public/ietf-http-wg/ [1]. | |||
| The source code and issues list for this draft can be found at | The source code and issues list for this draft can be found at | |||
| skipping to change at page 1, line 48 ¶ | skipping to change at page 1, line 48 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on September 10, 2020. | This Internet-Draft will expire on March 11, 2021. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 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 . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 1.1. A Brief History of Integrity Header Fields . . . . . . . 4 | 1.1. A Brief History of HTTP Integrity Fields . . . . . . . . 4 | |||
| 1.2. This Proposal . . . . . . . . . . . . . . . . . . . . . . 4 | 1.2. This Proposal . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.3. Goals . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1.3. Goals . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.4. Notational Conventions . . . . . . . . . . . . . . . . . 5 | 1.4. Notational Conventions . . . . . . . . . . . . . . . . . 5 | |||
| 2. Representation Digest . . . . . . . . . . . . . . . . . . . . 6 | 2. Representation Digest . . . . . . . . . . . . . . . . . . . . 6 | |||
| 3. The Digest Header Field . . . . . . . . . . . . . . . . . . . 6 | 3. The Digest Field . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 4. The Want-Digest Header Field . . . . . . . . . . . . . . . . 7 | 4. The Want-Digest Field . . . . . . . . . . . . . . . . . . . . 7 | |||
| 5. Digest Algorithm Values . . . . . . . . . . . . . . . . . . . 8 | 5. Digest Algorithm Values . . . . . . . . . . . . . . . . . . . 8 | |||
| 6. Use of Digest when acting on resources . . . . . . . . . . . 10 | 6. Use of Digest when acting on resources . . . . . . . . . . . 10 | |||
| 6.1. Digest and PATCH . . . . . . . . . . . . . . . . . . . . 11 | 6.1. Digest and PATCH . . . . . . . . . . . . . . . . . . . . 11 | |||
| 7. Deprecate Negotiation of Content-MD5 . . . . . . . . . . . . 11 | 7. Deprecate Negotiation of Content-MD5 . . . . . . . . . . . . 11 | |||
| 8. Relationship to Subresource Integrity (SRI) . . . . . . . . . 11 | 8. Relationship to Subresource Integrity (SRI) . . . . . . . . . 11 | |||
| 8.1. Supporting Both SRI and Representation Digest . . . . . . 12 | 8.1. Supporting Both SRI and Representation Digest . . . . . . 12 | |||
| 9. Examples of Unsolicited Digest . . . . . . . . . . . . . . . 13 | 9. Examples of Unsolicited Digest . . . . . . . . . . . . . . . 13 | |||
| 9.1. Server Returns Full Representation Data . . . . . . . . . 13 | 9.1. Server Returns Full Representation Data . . . . . . . . . 13 | |||
| 9.2. Server Returns No Representation Data . . . . . . . . . . 13 | 9.2. Server Returns No Representation Data . . . . . . . . . . 13 | |||
| 9.3. Server Returns Partial Representation Data . . . . . . . 13 | 9.3. Server Returns Partial Representation Data . . . . . . . 13 | |||
| 9.4. Client and Server Provide Full Representation Data . . . 14 | 9.4. Client and Server Provide Full Representation Data . . . 14 | |||
| 9.5. Client Provides Full Representation Data, Server Provides | 9.5. Client Provides Full Representation Data, Server Provides | |||
| No Representation Data . . . . . . . . . . . . . . . . . 15 | No Representation Data . . . . . . . . . . . . . . . . . 15 | |||
| 9.6. Client and Server Provide Full Representation Data, | 9.6. Client and Server Provide Full Representation Data, | |||
| Client Uses id-sha-256. . . . . . . . . . . . . . . . . . 15 | Client Uses id-sha-256. . . . . . . . . . . . . . . . . . 15 | |||
| 9.7. POST Response does not Reference the Request URI . . . . 16 | 9.7. POST Response does not Reference the Request URI . . . . 16 | |||
| 9.8. POST Response Describes the Request Status . . . . . . . 17 | 9.8. POST Response Describes the Request Status . . . . . . . 16 | |||
| 9.9. Digest with PATCH . . . . . . . . . . . . . . . . . . . . 17 | 9.9. Digest with PATCH . . . . . . . . . . . . . . . . . . . . 17 | |||
| 9.10. Error responses . . . . . . . . . . . . . . . . . . . . . 18 | 9.10. Error responses . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 9.11. Use with trailers and transfer coding . . . . . . . . . . 19 | ||||
| 10. Examples of Want-Digest Solicited Digest . . . . . . . . . . 19 | 10. Examples of Want-Digest Solicited Digest . . . . . . . . . . 19 | |||
| 10.1. Server Selects Client's Least Preferred Algorithm . . . 19 | 10.1. Server Selects Client's Least Preferred Algorithm . . . 20 | |||
| 10.2. Server Selects Algorithm Unsupported by Client . . . . . 20 | 10.2. Server Selects Algorithm Unsupported by Client . . . . . 20 | |||
| 10.3. Server Does Not Support Client Algorithm and Returns an | 10.3. Server Does Not Support Client Algorithm and Returns an | |||
| Error . . . . . . . . . . . . . . . . . . . . . . . . . 20 | Error . . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 11. Security Considerations . . . . . . . . . . . . . . . . . . . 20 | 11. Security Considerations . . . . . . . . . . . . . . . . . . . 21 | |||
| 11.1. Digest Does Not Protect the Full HTTP Message . . . . . 20 | 11.1. Digest Does Not Protect the Full HTTP Message . . . . . 21 | |||
| 11.2. Broken Cryptographic Algorithms . . . . . . . . . . . . 21 | 11.2. Broken Cryptographic Algorithms . . . . . . . . . . . . 21 | |||
| 11.3. Other Deprecated Algorithms . . . . . . . . . . . . . . 21 | 11.3. Other Deprecated Algorithms . . . . . . . . . . . . . . 21 | |||
| 11.4. Digest for End-to-End Integrity . . . . . . . . . . . . 21 | 11.4. Digest for End-to-End Integrity . . . . . . . . . . . . 21 | |||
| 11.5. Digest and Content-Location in responses . . . . . . . . 21 | 11.5. Digest and Content-Location in responses . . . . . . . . 22 | |||
| 11.6. Usage in signatures . . . . . . . . . . . . . . . . . . 21 | 11.6. Usage in signatures . . . . . . . . . . . . . . . . . . 22 | |||
| 11.7. Message Truncation . . . . . . . . . . . . . . . . . . . 22 | 11.7. Usage in trailers . . . . . . . . . . . . . . . . . . . 22 | |||
| 11.8. Algorithm Agility . . . . . . . . . . . . . . . . . . . 22 | 11.8. Usage with encryption . . . . . . . . . . . . . . . . . 23 | |||
| 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 22 | 11.9. Algorithm Agility . . . . . . . . . . . . . . . . . . . 23 | |||
| 12.1. Establish the HTTP Digest Algorithm Values . . . . . . . 22 | 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 12.2. The "status" Field in the HTTP Digest Algorithm Values . 22 | 12.1. Establish the HTTP Digest Algorithm Values . . . . . . . 23 | |||
| 12.2. The "status" Field in the HTTP Digest Algorithm Values . 23 | ||||
| 12.3. Deprecate "MD5" Digest Algorithm . . . . . . . . . . . . 23 | 12.3. Deprecate "MD5" Digest Algorithm . . . . . . . . . . . . 23 | |||
| 12.4. Update "CRC32C" Digest Algorithm . . . . . . . . . . . . 23 | 12.4. Update "UNIXsum" Digest Algorithm . . . . . . . . . . . 24 | |||
| 12.5. Obsolete "SHA" Digest Algorithm . . . . . . . . . . . . 23 | 12.5. Update "UNIXcksum" Digest Algorithm . . . . . . . . . . 24 | |||
| 12.6. Obsolete "ADLER32" Digest Algorithm . . . . . . . . . . 23 | 12.6. Update "CRC32c" Digest Algorithm . . . . . . . . . . . . 24 | |||
| 12.7. The "ID-SHA-256" Digest Algorithm . . . . . . . . . . . 24 | 12.7. Obsolete "SHA" Digest Algorithm . . . . . . . . . . . . 24 | |||
| 12.8. The "ID-SHA-512" Digest Algorithm . . . . . . . . . . . 24 | 12.8. Obsolete "ADLER32" Digest Algorithm . . . . . . . . . . 25 | |||
| 12.9. Changes compared to RFC5843 . . . . . . . . . . . . . . 24 | 12.9. Obsolete "contentMD5" token in Digest Algorithm . . . . 25 | |||
| 12.10. Want-Digest Header Field Registration . . . . . . . . . 25 | 12.10. The "id-sha-256" Digest Algorithm . . . . . . . . . . . 25 | |||
| 12.11. Digest Header Field Registration . . . . . . . . . . . . 25 | 12.11. The "id-sha-512" Digest Algorithm . . . . . . . . . . . 26 | |||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 25 | 12.12. Changes compared to RFC5843 . . . . . . . . . . . . . . 26 | |||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 25 | 12.13. Want-Digest Field Registration . . . . . . . . . . . . . 26 | |||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 27 | 12.14. Digest Header Field Registration . . . . . . . . . . . . 26 | |||
| 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| Appendix A. Resource Representation and Representation-Data . . 28 | 13.1. Normative References . . . . . . . . . . . . . . . . . . 27 | |||
| Appendix B. FAQ . . . . . . . . . . . . . . . . . . . . . . . . 30 | 13.2. Informative References . . . . . . . . . . . . . . . . . 28 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 31 | 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| Code Samples . . . . . . . . . . . . . . . . . . . . . . . . . . 31 | Appendix A. Resource Representation and Representation-Data . . 30 | |||
| Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 | Appendix B. FAQ . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
| E.1. Since draft-ietf-httpbis-digest-headers-00 . . . . . . . 32 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| E.2. Since draft-ietf-httpbis-digest-headers-01 . . . . . . . 33 | Code Samples . . . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 33 | Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| E.1. Since draft-ietf-httpbis-digest-headers-00 . . . . . . . 34 | ||||
| E.2. Since draft-ietf-httpbis-digest-headers-01 . . . . . . . 35 | ||||
| E.3. Since draft-ietf-httpbis-digest-headers-02 . . . . . . . 35 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 35 | ||||
| 1. Introduction | 1. Introduction | |||
| The core specification of HTTP does not define a means to protect the | The core specification of HTTP does not define a means to protect the | |||
| integrity of resources. When HTTP messages are transferred between | integrity of resources. When HTTP messages are transferred between | |||
| endpoints, the protocol might choose to make use of features of the | endpoints, the protocol might choose to make use of features of the | |||
| lower layer in order to provide some integrity protection; for | lower layer in order to provide some integrity protection; for | |||
| instance TCP checksums or TLS records [RFC2818]. | instance TCP checksums or TLS records [RFC2818]. | |||
| However, there are cases where relying on this alone is insufficient. | However, there are cases where relying on this alone is insufficient. | |||
| skipping to change at page 4, line 12 ¶ | skipping to change at page 4, line 18 ¶ | |||
| of data at rest, be used across multiple hops in order to provide | of data at rest, be used across multiple hops in order to provide | |||
| end-to-end integrity guarantees, aid fault diagnosis across hops and | end-to-end integrity guarantees, aid fault diagnosis across hops and | |||
| system boundaries, and can be used to validate integrity when | system boundaries, and can be used to validate integrity when | |||
| reconstructing a resource fetched using different HTTP connections. | reconstructing a resource fetched using different HTTP connections. | |||
| This document defines a mechanism that acts on HTTP representation- | This document defines a mechanism that acts on HTTP representation- | |||
| data. It can be combined with other mechanisms that protect | data. It can be combined with other mechanisms that protect | |||
| representation-metadata, such as digital signatures, in order to | representation-metadata, such as digital signatures, in order to | |||
| protect the desired parts of an HTTP exchange in whole or in part. | protect the desired parts of an HTTP exchange in whole or in part. | |||
| 1.1. A Brief History of Integrity Header Fields | 1.1. A Brief History of HTTP Integrity Fields | |||
| The Content-MD5 header field was originally introduced to provide | The Content-MD5 header field was originally introduced to provide | |||
| integrity, but HTTP/1.1 ([RFC7231], Appendix B) obsoleted it: | integrity, but HTTP/1.1 ([RFC7231], Appendix B) obsoleted it: | |||
| The Content-MD5 header field has been removed because it was | The Content-MD5 header field has been removed because it was | |||
| inconsistently implemented with respect to partial responses. | inconsistently implemented with respect to partial responses. | |||
| [RFC3230] provided a more flexible solution introducing the concept | [RFC3230] provided a more flexible solution introducing the concept | |||
| of "instance", and the header fields "Digest" and "Want-Digest". | of "instance", and the fields "Digest" and "Want-Digest". | |||
| 1.2. This Proposal | 1.2. This Proposal | |||
| The concept of "selected representation" defined in [RFC7231] made | The concept of "selected representation" defined in Section 7 of | |||
| [RFC3230] definitions inconsistent with the current standard. A | [SEMANTICS] makes [RFC3230] definitions inconsistent with current | |||
| refresh was then required. | HTTP semantics. This document updates the "Digest" and "Want-Digest" | |||
| field definitions to align with [SEMANTICS] concepts. | ||||
| This document updates the "Digest" and "Want-Digest" header field | ||||
| definitions to align with [RFC7231] concepts. | ||||
| This approach can be easily adapted to use-cases where the | Basing "Digest" on the selected representation makes it | |||
| transferred data does require some sort of manipulation to be | straightforward to apply it to use-cases where the transferred data | |||
| considered a representation or conveys a partial representation of a | does require some sort of manipulation to be considered a | |||
| resource (eg. Range Requests [RFC7233]). | representation, or conveys a partial representation of a resource eg. | |||
| Range Requests (see Section 9.3 of [SEMANTICS]). | ||||
| Changes are semantically compatible with existing implementations and | Changes are semantically compatible with existing implementations and | |||
| better cover both the request and response cases. | better cover both the request and response cases. | |||
| The value of "Digest" is calculated on selected representation, which | The value of "Digest" is calculated on selected representation, which | |||
| is tied to the value contained in any "Content-Encoding" or "Content- | is tied to the value contained in any "Content-Encoding" or "Content- | |||
| Type" header fields. Therefore, a given resource may have multiple | Type" header fields. Therefore, a given resource may have multiple | |||
| different digest values. | different digest values. | |||
| To allow both parties to exchange a Digest of a representation with | To allow both parties to exchange a Digest of a representation with | |||
| no content codings [3] two more algorithms are added ("ID-SHA-256" | no content codings (see Section 7.1.2 of [SEMANTICS]) two more | |||
| and "ID-SHA-512"). | digest-algorithms are added ("id-sha-256" and "id-sha-512"). | |||
| 1.3. Goals | 1.3. Goals | |||
| The goals of this proposal are: | The goals of this proposal are: | |||
| 1. Digest coverage for either the resource's "representation data" | 1. Digest coverage for either the resource's "representation data" | |||
| or "selected representation data" communicated via HTTP. | or "selected representation data" communicated via HTTP. | |||
| 2. Support for multiple digest algorithms. | 2. Support for multiple digest-algorithms. | |||
| 3. Negotiation of the use of digests. | 3. Negotiation of the use of digests. | |||
| The goals do not include: | The goals do not include: | |||
| HTTP Message integrity: The digest mechanism described here does not | HTTP message integrity: The digest mechanism described here does not | |||
| cover the full HTTP message nor its semantic, as representation | cover the full HTTP message nor its semantic, as representation | |||
| metadata are not included in the checksum. | metadata are not included in the checksum. | |||
| Header field integrity: The digest mechanisms described here cover | HTTP field integrity: The digest mechanisms described here cover | |||
| only representation and selected representation data, and do not | only representation and selected representation data, and do not | |||
| protect the integrity of associated representation metadata or | protect the integrity of associated representation metadata or | |||
| other message header fields. | other message fields. | |||
| Authentication: The digest mechanisms described here are not meant | Authentication: The digest mechanisms described here are not meant | |||
| to support authentication of the source of a digest or of a | to support authentication of the source of a digest or of a | |||
| message or anything else. These mechanisms, therefore, are not a | message or anything else. These mechanisms, therefore, are not a | |||
| sufficient defense against many kinds of malicious attacks. | sufficient defense against many kinds of malicious attacks. | |||
| Privacy: Digest mechanisms do not provide message privacy. | Privacy: Digest mechanisms do not provide message privacy. | |||
| Authorization: The digest mechanisms described here are not meant to | Authorization: The digest mechanisms described here are not meant to | |||
| support authorization or other kinds of access controls. | support authorization or other kinds of access controls. | |||
| 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 BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| 14 ([RFC2119] and [RFC8174]) when, and only when, they appear in all | 14 ([RFC2119] and [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] along with the "#rule" extension defined in Section 7 of | by [RFC7405] along with the "#rule" extension defined in Section 5 of | |||
| [RFC7230]. | [SEMANTICS]. | |||
| The definitions "representation", "selected representation", | The definitions "representation", "selected representation", | |||
| "representation data", "representation metadata", and "payload body" | "representation data", "representation metadata", and "payload body" | |||
| in this document are to be interpreted as described in [RFC7230] and | in this document are to be interpreted as described in [SEMANTICS]. | |||
| [RFC7231]. | ||||
| The definition "validator" in this document is to be interpreted as | Algorithm names respect the casing used in their definition document | |||
| described in Section 7.2 of [RFC7231]. | (eg. SHA-1, CRC32c) whereas digest-algorithm tokens are quoted (eg. | |||
| "sha", "crc32c"). | ||||
| 2. Representation Digest | 2. Representation Digest | |||
| The representation digest is an integrity mechanism for HTTP | The representation digest is an integrity mechanism for HTTP | |||
| resources which uses a checksum that is calculated independently of | resources which uses a checksum that is calculated independently of | |||
| the payload body and message body. It uses the representation data | the payload body (see Section 7.3.3 of [SEMANTICS]). It uses the | |||
| (see [RFC7231]), that can be fully or partially contained in the | representation data (see Section 7.1 of [SEMANTICS]), that can be | |||
| message body, or not contained at all: | fully or partially contained in the payload body, or not contained at | |||
| all: | ||||
| representation-data := Content-Encoding( Content-Type( bits ) ) | representation-data := Content-Encoding( Content-Type( bits ) ) | |||
| This takes into account the effect of the HTTP semantics on the | This takes into account the effect of the HTTP semantics on the | |||
| messages; for example the payload body can be affected by Range | messages; for example the payload body can be affected by Range | |||
| Requests or methods such as HEAD, while the message body is dependent | Requests or methods such as HEAD, while the way the payload body is | |||
| on transfer codings and other transformations: Appendix A contains | transferred "on the wire" is dependent on other transformations (eg. | |||
| several examples to help illustrate those effects. | transfer codings for HTTP/1.1 see 6.1 of [HTTP11]): Appendix A | |||
| contains several examples to help illustrate those effects. | ||||
| A representation digest consists of the value of a checksum computed | A representation digest consists of the value of a checksum computed | |||
| on the entire selected "representation data" of a resource together | on the entire selected "representation data" (see Section 7 of | |||
| with an indication of the algorithm used (and any parameters) | [SEMANTICS]) of a resource identified according to Section 7.3.2 of | |||
| [SEMANTICS] together with an indication of the algorithm used (and | ||||
| any parameters) | ||||
| representation-data-digest = digest-algorithm "=" | representation-data-digest = digest-algorithm "=" | |||
| <encoded digest output> | <encoded digest output> | |||
| The checksum is computed using one of the "digest-algorithms" listed | The checksum is computed using one of the digest-algorithms listed in | |||
| in Section 5 and then encoded in the associated format. | Section 5 and then encoded in the associated format. | |||
| The example below shows the "sha-256" digest-algorithm which uses | The example below shows the "sha-256" digest-algorithm which uses | |||
| base64 encoding. | base64 encoding. | |||
| sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| 3. The Digest Header Field | 3. The Digest Field | |||
| The Digest header field contains a list of one or more representation | The "Digest" field contains a list of one or more representation | |||
| digest values as defined in Section 2. It can be used in both | digest values as defined in Section 2. It can be used in both | |||
| request and response. | request and response. | |||
| Digest = "Digest" ":" OWS 1#representation-data-digest | Digest = "Digest" ":" OWS 1#representation-data-digest | |||
| The resource is specified by the effective request URI and any | The relationship between "Content-Location" (see Section 7.2.5 of | |||
| "validator" contained in the message. | [SEMANTICS]) and "Digest" is demonstrated in Section 9.7. A | |||
| The relationship between Content-Location (see [RFC7231] | ||||
| Section 3.1.4.2) and Digest is demonstrated in Section 9.7. A | ||||
| comprehensive set of examples showing the impacts of representation | comprehensive set of examples showing the impacts of representation | |||
| metadata, payload transformations and HTTP methods on digest is | metadata, payload transformations and HTTP methods on Digest is | |||
| provided in Section 9 and Section 10. | provided in Section 9 and Section 10. | |||
| A Digest header field MAY contain multiple representation-data-digest | A "Digest" field MAY contain multiple representation-data-digest | |||
| values. This could be useful for responses expected to reside in | values. This could be useful for responses expected to reside in | |||
| caches shared by users with different browsers, for example. | caches shared by users with different browsers, for example. | |||
| A recipient MAY ignore any or all of the representation-data-digests | A recipient MAY ignore any or all of the representation-data-digests | |||
| in a Digest header field. This allows the recipient to choose which | in a Digest field. This allows the recipient to choose which digest- | |||
| digest-algorithm(s) to use for validation instead of verifying every | algorithm(s) to use for validation instead of verifying every | |||
| received representation-data-digest. | received representation-data-digest. | |||
| A sender MAY send a representation-data-digest using a digest- | A sender MAY send a representation-data-digest using a digest- | |||
| algorithm without knowing whether the recipient supports the digest- | algorithm without knowing whether the recipient supports the digest- | |||
| algorithm, or even knowing that the recipient will ignore it. | algorithm, or even knowing that the recipient will ignore it. | |||
| "Digest" can be sent in a trailer section. When using incremental | ||||
| digest-algorithms this allows the sender and the receiver to | ||||
| dynamically compute the digest value while streaming the content. | ||||
| Two examples of its use are | Two examples of its use are | |||
| Digest: id-sha-512=WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm | Digest: id-sha-512=WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm | |||
| AbwAgBWnrIiYllu7BNNyealdVLvRwE\nmTHWXvJwew== | AbwAgBWnrIiYllu7BNNyealdVLvRwE\nmTHWXvJwew== | |||
| Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo=, | Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo=, | |||
| id-sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | id-sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| 4. The Want-Digest Header Field | 4. The Want-Digest Field | |||
| The Want-Digest message header field indicates the sender's desire to | The "Want-Digest" field indicates the sender's desire to receive a | |||
| receive a representation digest on messages associated with the | representation digest on messages associated with the request URI and | |||
| request URI and representation metadata. | representation metadata. | |||
| Want-Digest = "Want-Digest" ":" OWS 1#want-digest-value | Want-Digest = "Want-Digest" ":" OWS 1#want-digest-value | |||
| want-digest-value = digest-algorithm [ ";" "q" "=" qvalue] | want-digest-value = digest-algorithm [ ";" "q" "=" qvalue] | |||
| qvalue = ( "0" [ "." 0*1DIGIT ] ) / | qvalue = ( "0" [ "." 0*1DIGIT ] ) / | |||
| ( "1" [ "." 0*1( "0" ) ] ) | ( "1" [ "." 0*1( "0" ) ] ) | |||
| If a digest-algorithm is not accompanied by a qvalue, it is treated | If a digest-algorithm is not accompanied by a "qvalue", it is treated | |||
| as if its associated qvalue were 1.0. | as if its associated "qvalue" were 1.0. | |||
| The sender is willing to accept a digest-algorithm if and only if it | The sender is willing to accept a digest-algorithm if and only if it | |||
| is listed in a Want-Digest header field of a message, and its qvalue | is listed in a "Want-Digest" field of a message, and its "qvalue" is | |||
| is non-zero. | non-zero. | |||
| If multiple acceptable digest-algorithm values are given, the | If multiple acceptable digest-algorithm values are given, the | |||
| sender's preferred digest-algorithm is the one (or ones) with the | sender's preferred digest-algorithm is the one (or ones) with the | |||
| highest qvalue. | highest "qvalue". | |||
| Two examples of its use are | Two examples of its use are | |||
| Want-Digest: sha-256 | Want-Digest: sha-256 | |||
| Want-Digest: SHA-512;q=0.3, sha-256;q=1, md5;q=0 | Want-Digest: sha-512;q=0.3, sha-256;q=1, unixsum;q=0 | |||
| 5. Digest Algorithm Values | 5. Digest Algorithm Values | |||
| Digest algorithm values are used to indicate a specific digest | Digest-algorithm values are used to indicate a specific digest | |||
| computation. For some algorithms, one or more parameters can be | computation. For some digest-algorithms, one or more parameters can | |||
| supplied. | be supplied. | |||
| digest-algorithm = token | digest-algorithm = token | |||
| The BNF for "parameter" is as is used in [RFC7230]. All digest- | The BNF for "parameter" is defined in Section 5.4.1.4 of [SEMANTICS]. | |||
| algorithm values are case-insensitive. | All digest-algorithm values are case-insensitive but the lower case | |||
| is preferred. | ||||
| The Internet Assigned Numbers Authority (IANA) acts as a registry for | The Internet Assigned Numbers Authority (IANA) acts as a registry for | |||
| digest-algorithm values. The registry contains the tokens listed | digest-algorithm values. The registry contains the tokens listed | |||
| below. | below. | |||
| Some algorithms, although registered, have since been found | Some digest-algorithms, although registered, rely on vulnerable | |||
| vulnerable: the MD5 algorithm MUST NOT be used due to collision | algorithms: the "md5" digest-algorithm MUST NOT be used due to | |||
| attacks [CMU-836068] and the SHA algorithm is NOT RECOMMENDED due to | collision attacks [CMU-836068] and the "sha" digest-algorithm MUST | |||
| collision attacks [IACR-2019-459]. | NOT be used due to collision attacks [IACR-2020-014]. | |||
| SHA-256 | sha-256 | |||
| * Description: The SHA-256 algorithm [RFC6234]. The output of | * Description: The SHA-256 algorithm [RFC6234]. The output of | |||
| this algorithm is encoded using the base64 encoding [RFC4648]. | this algorithm is encoded using the base64 encoding [RFC4648]. | |||
| * Reference: [RFC6234], [RFC4648], this document. | * Reference: [RFC6234], [RFC4648], this document. | |||
| * Status: standard | * Status: standard | |||
| SHA-512 | sha-512 | |||
| * Description: The SHA-512 algorithm [RFC6234]. The output of | * Description: The SHA-512 algorithm [RFC6234]. The output of | |||
| this algorithm is encoded using the base64 encoding [RFC4648]. | this algorithm is encoded using the base64 encoding [RFC4648]. | |||
| * Reference: [RFC6234], [RFC4648], this document. | * Reference: [RFC6234], [RFC4648], this document. | |||
| * Status: standard | * Status: standard | |||
| MD5 | md5 | |||
| * Description: The MD5 algorithm, as specified in [RFC1321]. The | * Description: The MD5 algorithm, as specified in [RFC1321]. The | |||
| output of this algorithm is encoded using the base64 encoding | output of this algorithm is encoded using the base64 encoding | |||
| [RFC4648]. This digest-algorithm MUST NOT be used as it's now | ||||
| [RFC4648]. The MD5 algorithm MUST NOT be used as it's now | ||||
| vulnerable to collision attacks [CMU-836068]. | vulnerable to collision attacks [CMU-836068]. | |||
| * Reference: [RFC1321], [RFC4648], this document. | * Reference: [RFC1321], [RFC4648], this document. | |||
| * Status: deprecated | * Status: deprecated | |||
| SHA | sha | |||
| * Description: The SHA-1 algorithm [RFC3174]. The output of this | * Description: The SHA-1 algorithm [RFC3174]. The output of this | |||
| algorithm is encoded using the base64 encoding [RFC4648]. The | algorithm is encoded using the base64 encoding [RFC4648]. This | |||
| SHA algorithm is NOT RECOMMENDED as it's now vulnerable to | digest-algorithm MUST NOT be used as it's now vulnerable to | |||
| collision attacks [IACR-2019-459]. | collision attacks [IACR-2020-014]. | |||
| * Reference: [RFC3174], [RFC6234], [RFC4648], this document. | * Reference: [RFC3174], [RFC6234], [RFC4648], this document. | |||
| * Status: obsoleted | * Status: deprecated | |||
| UNIXsum | unixsum | |||
| * Description: The algorithm computed by the UNIX "sum" command, | * Description: The algorithm computed by the UNIX "sum" command, | |||
| as defined by the Single UNIX Specification, Version 2 [UNIX]. | as defined by the Single UNIX Specification, Version 2 [UNIX]. | |||
| The output of this algorithm is an ASCII decimal-digit string | The output of this algorithm is an ASCII decimal-digit string | |||
| representing the 16-bit checksum, which is the first word of | representing the 16-bit checksum, which is the first word of | |||
| the output of the UNIX "sum" command. | the output of the UNIX "sum" command. | |||
| * Reference: [UNIX], this document. | * Reference: [UNIX], this document. | |||
| * Status: standard | * Status: standard | |||
| UNIXcksum | unixcksum | |||
| * Description: The algorithm computed by the UNIX "cksum" | * Description: The algorithm computed by the UNIX "cksum" | |||
| command, as defined by the Single UNIX Specification, Version 2 | command, as defined by the Single UNIX Specification, Version 2 | |||
| [UNIX]. The output of this algorithm is an ASCII digit string | [UNIX]. The output of this algorithm is an ASCII digit string | |||
| representing the 32-bit CRC, which is the first word of the | representing the 32-bit CRC, which is the first word of the | |||
| output of the UNIX "cksum" command. | output of the UNIX "cksum" command. | |||
| * Reference: [UNIX], this document. | * Reference: [UNIX], this document. | |||
| * Status: standard | * Status: standard | |||
| To allow sender and recipient to provide a checksum which is | To allow sender and recipient to provide a checksum which is | |||
| independent from "Content-Encoding", the following additional | independent from "Content-Encoding", the following additional digest- | |||
| algorithms are defined: | algorithms are defined: | |||
| ID-SHA-512 | id-sha-512 | |||
| * Description: The sha-512 digest of the representation-data of | * Description: The sha-512 digest of the representation-data of | |||
| the resource when no content coding is applied (eg. "Content- | the resource when no content coding is applied | |||
| Encoding: identity") | ||||
| * Reference: [RFC6234], [RFC4648], this document. | * Reference: [RFC6234], [RFC4648], this document. | |||
| * Status: standard | * Status: standard | |||
| ID-SHA-256 | id-sha-256 | |||
| * Description: The sha-256 digest of the representation-data of | * Description: The sha-256 digest of the representation-data of | |||
| the resource when no content coding is applied (eg. "Content- | the resource when no content coding is applied | |||
| Encoding: identity") | ||||
| * Reference: [RFC6234], [RFC4648], this document. | * Reference: [RFC6234], [RFC4648], this document. | |||
| * Status: standard | * Status: standard | |||
| If other digest-algorithm values are defined, the associated encoding | If other digest-algorithm values are defined, the associated encoding | |||
| MUST either be represented as a quoted string, or MUST NOT include | MUST either be represented as a quoted string, or MUST NOT include | |||
| ";" or "," in the character sets used for the encoding. | ";" or "," in the character sets used for the encoding. | |||
| 6. Use of Digest when acting on resources | 6. Use of Digest when acting on resources | |||
| skipping to change at page 11, line 27 ¶ | skipping to change at page 11, line 32 ¶ | |||
| In PATCH responses the representation digest MUST be computed on the | In PATCH responses the representation digest MUST be computed on the | |||
| selected representation of the patched resource. | selected representation of the patched resource. | |||
| "Digest" usage with PATCH is thus very similar to the POST one, but | "Digest" usage with PATCH is thus very similar to the POST one, but | |||
| with the resource's own semantic partly implied by the method and by | with the resource's own semantic partly implied by the method and by | |||
| the patch document. | the patch document. | |||
| 7. Deprecate Negotiation of Content-MD5 | 7. Deprecate Negotiation of Content-MD5 | |||
| This RFC deprecates the negotiation of Content-MD5 as it has been | This RFC deprecates the negotiation of Content-MD5 as it has been | |||
| obsoleted by [RFC7231]. | obsoleted by [RFC7231]. The "contentMD5" token defined in Section 5 | |||
| of [RFC3230] MUST NOT be used as a digest-algorithm. | ||||
| 8. Relationship to Subresource Integrity (SRI) | 8. Relationship to Subresource Integrity (SRI) | |||
| Subresource Integrity [SRI] is an integrity mechanism that shares | Subresource Integrity [SRI] is an integrity mechanism that shares | |||
| some similarities to the present document's mechanism. However, | some similarities to the present document's mechanism. However, | |||
| there are differences in motivating factors, threat model and | there are differences in motivating factors, threat model and | |||
| specification of integrity digest generation, signalling and | specification of integrity digest generation, signalling and | |||
| validation. | validation. | |||
| SRI allows a first-party authority to declare an integrity assertion | SRI allows a first-party authority to declare an integrity assertion | |||
| on a resource served by a first or third party authority. This is | on a resource served by a first or third party authority. This is | |||
| done via the "integrity" attribute that can be added to "script" or | done via the "integrity" attribute that can be added to "script" or | |||
| "link" HTML elements. Therefore, the integrity assertion is always | "link" HTML elements. Therefore, the integrity assertion is always | |||
| made out-of-band to the resource fetch. In contrast, the "Digest" | made out-of-band to the resource fetch. In contrast, the "Digest" | |||
| header field is supplied in-band alongside the selected | field is supplied in-band alongside the selected representation, | |||
| representation, meaning that an authority can only declare an | meaning that an authority can only declare an integrity assertion for | |||
| integrity assertion for itself. Methods to improve the security | itself. Methods to improve the security properties of representation | |||
| properties of representation digests are presented in Section 11. | digests are presented in Section 11. This contrast is interesting | |||
| This contrast is interesting because on one hand self-assertion is | because on one hand self-assertion is less likely to be affected by | |||
| less likely to be affected by coordination problems such as the | coordination problems such as the first-party holding stale | |||
| first-party holding stale information about the third party, but on | information about the third party, but on the other hand the self- | |||
| the other hand the self-assertion is only as trustworthy as the | assertion is only as trustworthy as the authority that provided it. | |||
| authority that provided it. | ||||
| The SRI "integrity" attribute contains a cryptographic hash algorithm | The SRI "integrity" attribute contains a cryptographic hash algorithm | |||
| and digest value which is similar to "representation-data-digest" | and digest value which is similar to "representation-data-digest" | |||
| (see Section 2). The major differences are in serialization format. | (see Section 2). The major differences are in serialization format. | |||
| The SRI digest value is calculated over the identity encoding of the | The SRI digest value is calculated over the identity encoding of the | |||
| resource, not the selected representation (as specified for | resource, not the selected representation (as specified for | |||
| "representation-data-digest" in this document). Section 3.4.5 of | "representation-data-digest" in this document). Section 3.4.5 of | |||
| [SRI] describes the benefit of the identity approach - the SRI | [SRI] describes the benefit of the identity approach - the SRI | |||
| "integrity" attribute can contain multiple algorithm-value pairs | "integrity" attribute can contain multiple algorithm-value pairs | |||
| skipping to change at page 12, line 30 ¶ | skipping to change at page 12, line 33 ¶ | |||
| Range requests). In contrast, this document specifies handling in | Range requests). In contrast, this document specifies handling in | |||
| terms that are fully compatible with core HTTP concepts (an example | terms that are fully compatible with core HTTP concepts (an example | |||
| is provided in Section 9.3). | is provided in Section 9.3). | |||
| SRI specifies strong requirements on the selection of algorithm for | SRI specifies strong requirements on the selection of algorithm for | |||
| generation and validation of digests. In contrast, the requirements | generation and validation of digests. In contrast, the requirements | |||
| in this document are weaker. | in this document are weaker. | |||
| SRI defines no method for a client to declare an integrity assertion | SRI defines no method for a client to declare an integrity assertion | |||
| on resources it transfers to a server. In contrast, the "Digest" | on resources it transfers to a server. In contrast, the "Digest" | |||
| header field can appear on requests. | field can appear on requests. | |||
| 8.1. Supporting Both SRI and Representation Digest | 8.1. Supporting Both SRI and Representation Digest | |||
| The SRI and Representation Digest mechanisms are different and | The SRI and Representation Digest mechanisms are different and | |||
| complementary but one is not capable of replacing the other because | complementary but one is not capable of replacing the other because | |||
| they have different threat, security and implementation properties. | they have different threat, security and implementation properties. | |||
| A user agent that supports both mechanisms is expected to apply the | A user agent that supports both mechanisms is expected to apply the | |||
| rules specified for each but since the two mechanisms are | rules specified for each but since the two mechanisms are | |||
| independent, the ordering is not important. However, a user agent | independent, the ordering is not important. However, a user agent | |||
| skipping to change at page 13, line 8 ¶ | skipping to change at page 13, line 8 ¶ | |||
| identity encoding. | identity encoding. | |||
| There is a chance that a user agent supporting both mechanisms may | There is a chance that a user agent supporting both mechanisms may | |||
| find one validates successfully while the other fails. This document | find one validates successfully while the other fails. This document | |||
| specifies no requirements or guidance for user agents that experience | specifies no requirements or guidance for user agents that experience | |||
| such cases. | such cases. | |||
| 9. Examples of Unsolicited Digest | 9. Examples of Unsolicited Digest | |||
| The following examples demonstrate interactions where a server | The following examples demonstrate interactions where a server | |||
| responds with a "Digest" header field even though the client did not | responds with a "Digest" field even though the client did not solicit | |||
| solicit one using "Want-Digest". | one using "Want-Digest". | |||
| 9.1. Server Returns Full Representation Data | 9.1. Server Returns Full Representation Data | |||
| Request: | Request: | |||
| GET /items/123 | GET /items/123 | |||
| Response: | Response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: identity | ||||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| {"hello": "world"} | {"hello": "world"} | |||
| 9.2. Server Returns No Representation Data | 9.2. Server Returns No Representation Data | |||
| Requests without a payload body can still send a "Digest" field | ||||
| applying the digest-algorithm to an empty representation. | ||||
| As there is no content coding applied, the "sha-256" and the "id-sha- | As there is no content coding applied, the "sha-256" and the "id-sha- | |||
| 256" digest-values are the same. | 256" digest-values in the response are the same. | |||
| Request: | Request: | |||
| HEAD /items/123 | HEAD /items/123 HTTP/1.1 | |||
| Digest: sha-256=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= | ||||
| Response: | Response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: identity | ||||
| Digest: id-sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: id-sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| 9.3. Server Returns Partial Representation Data | 9.3. Server Returns Partial Representation Data | |||
| Request: | Request: | |||
| GET /items/123 | GET /items/123 | |||
| Range: bytes=1-7 | Range: bytes=1-7 | |||
| Response: | Response: | |||
| HTTP/1.1 206 Partial Content | HTTP/1.1 206 Partial Content | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: identity | ||||
| Content-Range: bytes 1-7/18 | Content-Range: bytes 1-7/18 | |||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| "hello" | "hello" | |||
| 9.4. Client and Server Provide Full Representation Data | 9.4. Client and Server Provide Full Representation Data | |||
| The request contains a "Digest" header calculated on the enclosed | The request contains a "Digest" field calculated on the enclosed | |||
| representation. | representation. | |||
| It also includes an "Accept-Encoding: br" header field that | It also includes an "Accept-Encoding: br" header field that | |||
| advertises the client supports brotli encoding. | advertises 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 "Digest" field-value | selected representation is brotli encoded. The "Digest" field-value | |||
| is therefore different compared to the request. | is therefore different compared to the request. | |||
| The response body is displayed as a base64-encoded string because it | The response body is displayed as a base64-encoded string because it | |||
| contains non-printable characters. | contains non-printable characters. | |||
| Request: | Request: | |||
| PUT /items/123 | PUT /items/123 | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: identity | ||||
| Accept-Encoding: br | Accept-Encoding: br | |||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| {"hello": "world"} | {"hello": "world"} | |||
| Response: | Response: | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: br | Content-Encoding: br | |||
| Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo= | Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo= | |||
| skipping to change at page 15, line 17 ¶ | skipping to change at page 15, line 17 ¶ | |||
| Request "Digest" value is calculated on the enclosed payload. | Request "Digest" value is calculated on the enclosed payload. | |||
| Response "Digest" value depends on the representation metadata header | Response "Digest" value depends on the representation metadata header | |||
| fields, including "Content-Encoding: br" even when the response does | fields, including "Content-Encoding: br" even when the response does | |||
| not contain a payload body. | not contain a payload body. | |||
| Request: | Request: | |||
| PUT /items/123 | PUT /items/123 | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: identity | ||||
| Content-Length: 18 | Content-Length: 18 | |||
| Accept-Encoding: br | Accept-Encoding: br | |||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| {"hello": "world"} | {"hello": "world"} | |||
| Response: | Response: | |||
| HTTP/1.1 204 No Content | HTTP/1.1 204 No Content | |||
| Content-Type: application/json | Content-Type: application/json | |||
| skipping to change at page 16, line 7 ¶ | skipping to change at page 15, line 48 ¶ | |||
| o one taking into account the "Content-Encoding". | o one taking into account the "Content-Encoding". | |||
| As the response body contains non-printable characters, it is | As the response body contains non-printable characters, it is | |||
| displayed as a base64-encoded string. | displayed as a base64-encoded string. | |||
| Request: | Request: | |||
| PUT /items/123 HTTP/1.1 | PUT /items/123 HTTP/1.1 | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: identity | ||||
| Accept-Encoding: br | Accept-Encoding: br | |||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| {"hello": "world"} | {"hello": "world"} | |||
| Response: | Response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: br | Content-Encoding: br | |||
| Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo=, | Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo=, | |||
| id-sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | id-sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| iwiAeyJoZWxsbyI6ICJ3b3JsZCJ9Aw== | iwiAeyJoZWxsbyI6ICJ3b3JsZCJ9Aw== | |||
| 9.7. POST Response does not Reference the Request URI | 9.7. POST Response does not Reference the Request URI | |||
| Request "Digest" value is computed on the enclosed representation | Request "Digest" value is computed on the enclosed representation | |||
| (see Section 6). | (see Section 6). | |||
| The representation enclosed in the response refers to the resource | The representation enclosed in the response refers to the resource | |||
| identified by "Content-Location" (see [RFC7231] Section 3.1.4.2 and | identified by "Content-Location" (see [SEMANTICS], Section 7.3.2). | |||
| Section 3.1.4.1 point 4). | ||||
| "Digest" is thus computed on the enclosed representation. | "Digest" is thus computed on the enclosed representation. | |||
| Request: | Request: | |||
| POST /books HTTP/1.1 | POST /books HTTP/1.1 | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Accept: application/json | Accept: application/json | |||
| Accept-Encoding: identity | Accept-Encoding: identity | |||
| Digest: sha-256=bWopGGNiZtbVgHsG+I4knzfEJpmmmQHf7RHDXA3o1hQ= | Digest: sha-256=bWopGGNiZtbVgHsG+I4knzfEJpmmmQHf7RHDXA3o1hQ= | |||
| skipping to change at page 19, line 25 ¶ | skipping to change at page 19, line 15 ¶ | |||
| HTTP/1.1 404 Not Found | HTTP/1.1 404 Not Found | |||
| Content-Type: application/problem+json | Content-Type: application/problem+json | |||
| Digest: sha-256=UJSojgEzqUe4UoHzmNl5d2xkmrW3BOdmvsvWu1uFeu0= | Digest: sha-256=UJSojgEzqUe4UoHzmNl5d2xkmrW3BOdmvsvWu1uFeu0= | |||
| { | { | |||
| "title": "Not Found", | "title": "Not Found", | |||
| "detail": "Cannot PATCH a non-existent resource", | "detail": "Cannot PATCH a non-existent resource", | |||
| "status": 404 | "status": 404 | |||
| } | } | |||
| 9.11. Use with trailers and transfer coding | ||||
| An origin server sends "Digest" in the HTTP trailer, so it can | ||||
| calculate digest-value while streaming content and thus mitigate | ||||
| resource consumption. The field value is the same as in Section 9.1 | ||||
| because "Digest" is designed to be independent from the use of one or | ||||
| more transfer codings (see Section 2). | ||||
| Request: | ||||
| GET /items/123 | ||||
| Response: | ||||
| HTTP/1.1 200 OK | ||||
| Content-Type: application/json | ||||
| Transfer-Encoding: chunked | ||||
| Trailer: Digest | ||||
| 8\r\n | ||||
| {"hello"\r\n | ||||
| 8 | ||||
| : "world\r\n | ||||
| 2\r\n | ||||
| "}\r\n | ||||
| 0\r\n | ||||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | ||||
| 10. Examples of Want-Digest Solicited Digest | 10. Examples of Want-Digest Solicited Digest | |||
| The following examples demonstrate interactions where a client | The following examples demonstrate interactions where a client | |||
| solicits a "Digest" using "Want-Digest". | solicits a "Digest" using "Want-Digest". | |||
| 10.1. Server Selects Client's Least Preferred Algorithm | 10.1. Server Selects Client's Least Preferred Algorithm | |||
| The client requests a digest, preferring sha. The server is free to | The client requests a digest, preferring "sha". The server is free | |||
| reply with sha-256 anyway. | to reply with "sha-256" anyway. | |||
| Request: | Request: | |||
| GET /items/123 HTTP/1.1 | GET /items/123 HTTP/1.1 | |||
| Want-Digest: sha-256;q=0.3, sha;q=1 | Want-Digest: sha-256;q=0.3, sha;q=1 | |||
| Response: | Response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: identity | ||||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| {"hello": "world"} | {"hello": "world"} | |||
| 10.2. Server Selects Algorithm Unsupported by Client | 10.2. Server Selects Algorithm Unsupported by Client | |||
| The client requests a sha digest only. The server is currently free | The client requests a sha digest only. The server is currently free | |||
| to reply with a Digest containing an unsupported algorithm. | to reply with a Digest containing an unsupported algorithm. | |||
| Request: | Request: | |||
| GET /items/123 | GET /items/123 | |||
| Want-Digest: sha;q=1 | Want-Digest: sha;q=1 | |||
| Response: | Response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: identity | ||||
| Digest: id-sha-512=WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm | Digest: id-sha-512=WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm | |||
| +AbwAgBWnrIiYllu7BNNyealdVLvRwE\nmTHWXvJwew== | +AbwAgBWnrIiYllu7BNNyealdVLvRwE\nmTHWXvJwew== | |||
| {"hello": "world"} | {"hello": "world"} | |||
| 10.3. Server Does Not Support Client Algorithm and Returns an Error | 10.3. Server Does Not Support Client Algorithm and Returns an Error | |||
| The client requests a sha Digest, the server advises for sha-256 and | The client requests a sha Digest, the server advises for sha-256 and | |||
| sha-512 | sha-512 | |||
| skipping to change at page 20, line 45 ¶ | skipping to change at page 21, line 18 ¶ | |||
| Response: | Response: | |||
| HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
| Want-Digest: sha-256, sha-512 | Want-Digest: sha-256, sha-512 | |||
| 11. Security Considerations | 11. Security Considerations | |||
| 11.1. Digest Does Not Protect the Full HTTP Message | 11.1. Digest Does Not Protect the Full HTTP Message | |||
| This document specifies a data integrity mechanism that protects HTTP | This document specifies a data integrity mechanism that protects HTTP | |||
| "representation data", but not HTTP "representation metadata" header | "representation data", but not HTTP "representation metadata" fields, | |||
| fields, from certain kinds of accidental corruption. | from certain kinds of accidental corruption. | |||
| "Digest" is not intended as general protection against malicious | "Digest" is not intended as general protection against malicious | |||
| tampering with HTTP messages, this can be achieved by combining it | tampering with HTTP messages, this can be achieved by combining it | |||
| with other approaches such as transport-layer security or digital | with other approaches such as transport-layer security or digital | |||
| signatures. | signatures. | |||
| 11.2. Broken Cryptographic Algorithms | 11.2. Broken Cryptographic Algorithms | |||
| Cryptographic algorithms are intended to provide a proof of integrity | Cryptographic algorithms are intended to provide a proof of integrity | |||
| suited towards cryptographic constructions such as signatures. | suited towards cryptographic constructions such as signatures. | |||
| However, these rely on collision-resistance for their security proofs | However, these rely on collision-resistance for their security proofs | |||
| [CMU-836068]. The MD5 and SHA-1 algorithms are vulnerable to | [CMU-836068]. The "MD5" and "SHA-1" digest algorithms are vulnerable | |||
| collisions attacks, so MD5 MUST NOT be used and SHA-1 is NOT | to collisions attacks, so they MUST NOT be used with "Digest". | |||
| RECOMMENDED for use with "Digest". | ||||
| 11.3. Other Deprecated Algorithms | 11.3. Other Deprecated Algorithms | |||
| The ADLER32 algorithm defined in [RFC1950] has been deprecated by | The ADLER32 algorithm defined in [RFC1950] has been deprecated by | |||
| [RFC3309] because under certain conditions it provides weak detection | [RFC3309] because under certain conditions it provides weak detection | |||
| of errors and is now NOT RECOMMENDED for use with "Digest". | of errors and is now NOT RECOMMENDED for use with "Digest". | |||
| 11.4. Digest for End-to-End Integrity | 11.4. Digest for End-to-End Integrity | |||
| "Digest" alone does not provide end-to-end integrity of HTTP messages | "Digest" alone does not provide end-to-end integrity of HTTP messages | |||
| over multiple hops, as it just covers the "representation data" and | over multiple hops, as it just covers the "representation data" and | |||
| not the "representation metadata". | not the "representation metadata". | |||
| Besides, it allows to protect "representation data" from buggy | Besides, it allows to protect "representation data" from buggy | |||
| manipulation, buggy compression, etc. | manipulation, buggy compression, etc. | |||
| Moreover identity digest algorithms (eg. ID-SHA-256 and ID-SHA-512) | Moreover identity digest algorithms (eg. "id-sha-256" and "id-sha- | |||
| allow piecing together a resource from different sources (e.g. | 512") allow piecing together a resource from different sources (e.g. | |||
| different servers that perhaps apply different content codings) | different servers that perhaps apply different content codings) | |||
| enabling the user-agent to detect that the application-layer tasks | enabling the user-agent to detect that the application-layer tasks | |||
| completed properly, before handing off to say the HTML parser, video | completed properly, before handing off to say the HTML parser, video | |||
| player etc. | player etc. | |||
| Even a simple mechanism for end-to-end validation is thus valuable. | Even a simple mechanism for end-to-end validation is thus valuable. | |||
| 11.5. Digest and Content-Location in responses | 11.5. 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 "Digest" is computed accordingly. | by its value and "Digest" is computed accordingly. | |||
| 11.6. Usage in signatures | 11.6. 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 [NIST800-32]. | |||
| Such signatures can protect one or more HTTP fields and there are | ||||
| Such signatures can protect one or more header fields and there are | ||||
| additional considerations when "Digest" is included in this set. | additional considerations when "Digest" is included in this set. | |||
| Since the "Digest" header field is a hash of a resource | Since the "Digest" field is a hash of a resource representation, it | |||
| representation, it explicitly depends on the "representation | explicitly depends on the "representation metadata" (eg. the values | |||
| metadata" (eg. the values of "Content-Type", "Content-Encoding" etc). | of "Content-Type", "Content-Encoding" etc). A signature that | |||
| A signature that protects "Digest" but not other "representation | protects "Digest" but not other "representation metadata" can expose | |||
| metadata" can expose the communication to tampering. For example, an | the communication to tampering. For example, an actor could | |||
| actor could manipulate the "Content-Type" field-value and cause a | manipulate the "Content-Type" field-value and cause a digest | |||
| digest validation failure at the recipient, preventing the | validation failure at the recipient, preventing the application from | |||
| application from accessing the representation. Such an attack | accessing the representation. Such an attack consumes the resources | |||
| consumes the resources of both endpoints. See also Section 11.5. | of both endpoints. See also Section 11.5. | |||
| "Digest" SHOULD always be used over a connection which provides | "Digest" SHOULD always be used over a connection which provides | |||
| integrity at the transport layer that protects HTTP header fields. | integrity at the transport layer that protects HTTP fields. | |||
| A "Digest" header field using NOT RECOMMENDED digest-algorithms | A "Digest" field using NOT RECOMMENDED digest-algorithms SHOULD NOT | |||
| SHOULD NOT be used in signatures. | be used in signatures. | |||
| 11.7. Message Truncation | Using signatures to protect the "Digest" of an empty representation | |||
| allows receiving endpoints to detect if an eventual payload has been | ||||
| stripped or added. | ||||
| ... | 11.7. Usage in trailers | |||
| 11.8. Algorithm Agility | When used in trailers, the receiver gets the digest value after the | |||
| payload body and may thus be tempted to process the data before | ||||
| validating the digest value. Instead, data should only be processed | ||||
| after validating the Digest. | ||||
| If received in trailers, "Digest" MUST NOT be discarded; instead it | ||||
| MAY be merged in the header section (See Section 5.6.2 of | ||||
| [SEMANTICS]). | ||||
| Not every digest-algorithm is suitable for trailers, as they may | ||||
| require to pre-process the whole payload before sending a message | ||||
| (eg. see [I-D.thomson-http-mice]). | ||||
| 11.8. Usage with encryption | ||||
| "Digest" may expose information details of encrypted payload when the | ||||
| checksum is computed on the unencrypted data. An example of that is | ||||
| the use of the "id-sha-256" digest algorithm in conjuction with the | ||||
| encrypted content-coding [RFC8188]. | ||||
| 11.9. Algorithm Agility | ||||
| ... | ... | |||
| 12. IANA Considerations | 12. IANA Considerations | |||
| 12.1. Establish the HTTP Digest Algorithm Values | 12.1. Establish the HTTP Digest Algorithm Values | |||
| This memo sets this spec to be the establishing document for the HTTP | This memo sets this spec to be the establishing document for the HTTP | |||
| Digest Algorithm Values [4] | Digest Algorithm Values [3] | |||
| 12.2. The "status" Field in the HTTP Digest Algorithm Values | 12.2. The "status" Field in the HTTP Digest Algorithm Values | |||
| This memo adds the field "Status" to the HTTP Digest Algorithm Values | This memo adds the field "Status" to the HTTP Digest Algorithm Values | |||
| [5] registry. The allowed values for the "Status" fields are | [4] registry. The allowed values for the "Status" fields are | |||
| described below. | described below. | |||
| Status Specify "standard", "experimental", "historic", "obsoleted", | Status Specify "standard", "experimental", "historic", "obsoleted", | |||
| or "deprecated" according to the type and status of the primary | or "deprecated" according to the type and status of the primary | |||
| document in which the algorithm is defined. | document in which the algorithm is defined. | |||
| 12.3. Deprecate "MD5" Digest Algorithm | 12.3. Deprecate "MD5" Digest Algorithm | |||
| This memo updates the "MD5" digest algorithm in the HTTP Digest | This memo updates the "MD5" digest-algorithm in the HTTP Digest | |||
| Algorithm Values [5] registry: | ||||
| o Digest Algorithm: md5 | ||||
| o Description: As specified in Section 5. | ||||
| o Status: As specified in Section 5. | ||||
| 12.4. Update "UNIXsum" Digest Algorithm | ||||
| This memo updates the "UNIXsum" digest algorithm in the HTTP Digest | ||||
| Algorithm Values [6] registry: | Algorithm Values [6] registry: | |||
| o Digest Algorithm: MD5 | o Digest Algorithm: As specified in Section 5. | |||
| o Description: As specified in Section 5. | o Description: As specified in Section 5. | |||
| o Status: As specified in Section 5. | o Status: As specified in Section 5. | |||
| 12.4. Update "CRC32C" Digest Algorithm | 12.5. Update "UNIXcksum" Digest Algorithm | |||
| This memo updates the "CRC32c" digest algorithm in the HTTP Digest | This memo updates the "UNIXcksum" digest algorithm in the HTTP Digest | |||
| Algorithm Values [7] registry: | Algorithm Values [7] registry: | |||
| o Digest Algorithm: CRC32c | o Digest Algorithm: As specified in Section 5. | |||
| o Description: As specified in Section 5. | ||||
| o Status: As specified in Section 5. | ||||
| 12.6. Update "CRC32c" Digest Algorithm | ||||
| This memo updates the "CRC32c" digest-algorithm in the HTTP Digest | ||||
| Algorithm Values [8] registry: | ||||
| o Digest Algorithm: crc32c | ||||
| o Description: The CRC32c algorithm is a 32-bit cyclic redundancy | o Description: The CRC32c algorithm is a 32-bit cyclic redundancy | |||
| check. It achieves a better hamming distance (for better error- | check. It achieves a better hamming distance (for better error- | |||
| detection performance) than many other 32-bit CRC functions. | detection performance) than many other 32-bit CRC functions. | |||
| Other places it is used include iSCSI and SCTP. The 32-bit output | Other places it is used include iSCSI and SCTP. The 32-bit output | |||
| is encoded in hexadecimal (using between 1 and 8 ASCII characters | is encoded in hexadecimal (using between 1 and 8 ASCII characters | |||
| from 0-9, A-F, and a-f; leading 0's are allowed). For example, | from 0-9, A-F, and a-f; leading 0's are allowed). For example, | |||
| CRC32c=0a72a4df and crc32c=A72A4DF are both valid checksums for | crc32c=0a72a4df and crc32c=A72A4DF are both valid checksums for | |||
| the 3-byte message "dog". | the 3-byte message "dog". | |||
| o Reference: [RFC4960] appendix B, this document. | o Reference: [RFC4960] appendix B, this document. | |||
| o Status: standard. | o Status: standard. | |||
| 12.5. Obsolete "SHA" Digest Algorithm | 12.7. Obsolete "SHA" Digest Algorithm | |||
| This memo updates the "SHA" digest algorithm in the HTTP Digest | ||||
| Algorithm Values [8] registry: | ||||
| o Digest Algorithm: SHA | This memo updates the "SHA" digest-algorithm in the HTTP Digest | |||
| Algorithm Values [9] registry: | ||||
| o Digest Algorithm: sha | ||||
| o Description: As specified in Section 5. | o Description: As specified in Section 5. | |||
| o Status: As specified in Section 5. | o Status: As specified in Section 5. | |||
| 12.6. Obsolete "ADLER32" Digest Algorithm | 12.8. Obsolete "ADLER32" Digest Algorithm | |||
| This memo updates the "ADLER32" digest algorithm in the HTTP Digest | This memo updates the "ADLER32" digest-algorithm in the HTTP Digest | |||
| Algorithm Values [9] registry: | Algorithm Values [10] registry: | |||
| o Digest Algorithm: adler32 | ||||
| o Digest Algorithm: ADLER32 | ||||
| o Description: The ADLER32 algorithm is a checksum specified in | o Description: The ADLER32 algorithm is a checksum specified in | |||
| [RFC1950] "ZLIB Compressed Data Format". The 32-bit output is | [RFC1950] "ZLIB Compressed Data Format". The 32-bit output is | |||
| encoded in hexadecimal (using between 1 and 8 ASCII characters | encoded in hexadecimal (using between 1 and 8 ASCII characters | |||
| from 0-9, A-F, and a-f; leading 0's are allowed). For example, | from 0-9, A-F, and a-f; leading 0's are allowed). For example, | |||
| ADLER32=03da0195 and ADLER32=3DA0195 are both valid checksums for | adler32=03da0195 and adler32=3DA0195 are both valid checksums for | |||
| the 4-byte message "Wiki". This algorithm is obsoleted and SHOULD | the 4-byte message "Wiki". This algorithm is obsoleted and SHOULD | |||
| NOT be used. | NOT be used. | |||
| o Status: obsoleted | o Status: obsoleted | |||
| 12.7. The "ID-SHA-256" Digest Algorithm | 12.9. Obsolete "contentMD5" token in Digest Algorithm | |||
| This memo registers the "ID-SHA-256" digest algorithm in the HTTP | This memo adds the "contentMD5" token in the HTTP Digest Algorithm | |||
| Digest Algorithm Values [10] registry: | Values [11] registry: | |||
| o Digest Algorithm: ID-SHA-256 | o Digest Algorithm: contentMD5 | |||
| o Description: Section 5 of [RFC3230] defined the "contentMD5" token | ||||
| to be used only in Want-Digest. This token is obsoleted and MUST | ||||
| NOT be used. | ||||
| o Reference: Section 12.9 of this document, Section 5 of [RFC3230]. | ||||
| o Status: obsoleted | ||||
| 12.10. The "id-sha-256" Digest Algorithm | ||||
| This memo registers the "id-sha-256" digest algorithm in the HTTP | ||||
| Digest Algorithm Values [12] registry: | ||||
| o Digest Algorithm: id-sha-256 | ||||
| o Description: As specified in Section 5. | o Description: As specified in Section 5. | |||
| o Status: As specified in Section 5. | o Status: As specified in Section 5. | |||
| 12.8. The "ID-SHA-512" Digest Algorithm | 12.11. The "id-sha-512" Digest Algorithm | |||
| This memo registers the "ID-SHA-512" digest algorithm in the HTTP | This memo registers the "id-sha-512" digest algorithm in the HTTP | |||
| Digest Algorithm Values [11] registry: | Digest Algorithm Values [13] registry: | |||
| o Digest Algorithm: ID-SHA-512 | o Digest Algorithm: id-sha-512 | |||
| o Description: As specified in Section 5. | o Description: As specified in Section 5. | |||
| o Status: As specified in Section 5. | o Status: As specified in Section 5. | |||
| 12.9. Changes compared to RFC5843 | 12.12. Changes compared to RFC5843 | |||
| The digest-algorithm values for "MD5", "SHA", "SHA-256", "SHA-512", | ||||
| "UNIXcksum", "UNIXsum", "ADLER32" and "CRC32c" have been updated to | ||||
| lowercase. | ||||
| The status of "MD5" has been updated to "deprecated", and its | The status of "MD5" has been updated to "deprecated", and its | |||
| description states that this algorithm MUST NOT be used. | description states that this algorithm MUST NOT be used. | |||
| The status of "SHA" has been updated to "obsoleted", and its | The status of "SHA" has been updated to "deprecated", and its | |||
| description states that this algorithm is NOT RECOMMENDED. | description states that this algorithm MUST NOT be used. | |||
| The status for "CRC32C" has been updated to "standard". | The status for "CRC2c", "UNIXsum" and "UNIXcksum" has been updated to | |||
| "standard". | ||||
| The "ID-SHA-256" and "ID-SHA-512" algorithms have been added to the | The "id-sha-256" and "id-sha-512" algorithms have been added to the | |||
| registry. | registry. | |||
| 12.10. Want-Digest Header Field Registration | 12.13. Want-Digest Field Registration | |||
| This section registers the "Want-Digest" header field in the | ||||
| "Permanent Message Header Field Names" registry ([RFC3864]). | ||||
| Header field name: "Want-Digest" | ||||
| Applicable protocol: http | This section registers the "Want-Digest" field in the "Hypertext | |||
| Transfer Protocol (HTTP) Field Name Registry" [SEMANTICS]. | ||||
| Status: standard | Field name: "Want-Digest" | |||
| Author/Change controller: IETF | Status: permanent | |||
| Specification document(s): Section 4 of this document | Specification document(s): Section 4 of this document | |||
| 12.11. Digest Header Field Registration | 12.14. Digest Header Field Registration | |||
| This section registers the "Digest" header field in the "Permanent | ||||
| Message Header Field Names" registry ([RFC3864]). | ||||
| Header field name: "Digest" | ||||
| Applicable protocol: http | ||||
| Status: standard | This section registers the "Digest" field in the "Hypertext Transfer | |||
| Protocol (HTTP) Field Name Registry" [SEMANTICS]. | ||||
| Author/Change controller: IETF | Field name: "Digest" | |||
| Status: permanent | ||||
| Specification document(s): Section 3 of this document | Specification document(s): Section 3 of this document | |||
| 13. References | 13. References | |||
| 13.1. Normative References | 13.1. Normative References | |||
| [CMU-836068] | [CMU-836068] | |||
| Carnagie Mellon University, Software Engineering | Carnagie 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/>. | |||
| [IACR-2019-459] | [IACR-2020-014] | |||
| Leurent, G. and T. Peyrin, "From Collisions to Chosen- | Leurent, G. and T. Peyrin, "SHA-1 is a Shambles", January | |||
| Prefix Collisions Application to Full SHA-1", May 2019, | 2020, <https://eprint.iacr.org/2020/014.pdf>. | |||
| <https://eprint.iacr.org/2019/459.pdf>. | ||||
| [NIST800-32] | [NIST800-32] | |||
| National Institute of Standards and Technology, U.S. | National Institute of Standards and Technology, U.S. | |||
| Department of Commerce, "Introduction to Public Key | Department of Commerce, "Introduction to Public Key | |||
| Technology and the Federal PKI Infrastructure", February | Technology and the Federal PKI Infrastructure", February | |||
| 2001, <https://nvlpubs.nist.gov/nistpubs/Legacy/SP/ | 2001, <https://nvlpubs.nist.gov/nistpubs/Legacy/SP/ | |||
| nistspecialpublication800-32.pdf>. | nistspecialpublication800-32.pdf>. | |||
| [RFC1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, | [RFC1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, | |||
| DOI 10.17487/RFC1321, April 1992, | DOI 10.17487/RFC1321, April 1992, | |||
| skipping to change at page 26, line 39 ¶ | skipping to change at page 28, line 5 ¶ | |||
| [RFC3230] Mogul, J. and A. Van Hoff, "Instance Digests in HTTP", | [RFC3230] Mogul, J. and A. Van Hoff, "Instance Digests in HTTP", | |||
| RFC 3230, DOI 10.17487/RFC3230, January 2002, | RFC 3230, DOI 10.17487/RFC3230, January 2002, | |||
| <https://www.rfc-editor.org/info/rfc3230>. | <https://www.rfc-editor.org/info/rfc3230>. | |||
| [RFC3309] Stone, J., Stewart, R., and D. Otis, "Stream Control | [RFC3309] Stone, J., Stewart, R., and D. Otis, "Stream Control | |||
| Transmission Protocol (SCTP) Checksum Change", RFC 3309, | Transmission Protocol (SCTP) Checksum Change", RFC 3309, | |||
| DOI 10.17487/RFC3309, September 2002, | DOI 10.17487/RFC3309, September 2002, | |||
| <https://www.rfc-editor.org/info/rfc3309>. | <https://www.rfc-editor.org/info/rfc3309>. | |||
| [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | ||||
| Procedures for Message Header Fields", BCP 90, RFC 3864, | ||||
| DOI 10.17487/RFC3864, September 2004, | ||||
| <https://www.rfc-editor.org/info/rfc3864>. | ||||
| [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
| Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | |||
| <https://www.rfc-editor.org/info/rfc4648>. | <https://www.rfc-editor.org/info/rfc4648>. | |||
| [RFC4960] Stewart, R., Ed., "Stream Control Transmission Protocol", | [RFC4960] Stewart, R., Ed., "Stream Control Transmission Protocol", | |||
| RFC 4960, DOI 10.17487/RFC4960, September 2007, | RFC 4960, DOI 10.17487/RFC4960, September 2007, | |||
| <https://www.rfc-editor.org/info/rfc4960>. | <https://www.rfc-editor.org/info/rfc4960>. | |||
| [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, | Specifications: ABNF", STD 68, RFC 5234, | |||
| skipping to change at page 27, line 19 ¶ | skipping to change at page 28, line 27 ¶ | |||
| [RFC5843] Bryan, A., "Additional Hash Algorithms for HTTP Instance | [RFC5843] Bryan, A., "Additional Hash Algorithms for HTTP Instance | |||
| Digests", RFC 5843, DOI 10.17487/RFC5843, April 2010, | Digests", RFC 5843, DOI 10.17487/RFC5843, April 2010, | |||
| <https://www.rfc-editor.org/info/rfc5843>. | <https://www.rfc-editor.org/info/rfc5843>. | |||
| [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms | [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms | |||
| (SHA and SHA-based HMAC and HKDF)", RFC 6234, | (SHA and SHA-based HMAC and HKDF)", RFC 6234, | |||
| DOI 10.17487/RFC6234, May 2011, | DOI 10.17487/RFC6234, May 2011, | |||
| <https://www.rfc-editor.org/info/rfc6234>. | <https://www.rfc-editor.org/info/rfc6234>. | |||
| [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | ||||
| Protocol (HTTP/1.1): Message Syntax and Routing", | ||||
| RFC 7230, DOI 10.17487/RFC7230, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7230>. | ||||
| [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | ||||
| Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | ||||
| DOI 10.17487/RFC7231, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7231>. | ||||
| [RFC7233] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, Ed., | ||||
| "Hypertext Transfer Protocol (HTTP/1.1): Range Requests", | ||||
| RFC 7233, DOI 10.17487/RFC7233, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7233>. | ||||
| [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", | [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", | |||
| RFC 7405, DOI 10.17487/RFC7405, December 2014, | RFC 7405, DOI 10.17487/RFC7405, December 2014, | |||
| <https://www.rfc-editor.org/info/rfc7405>. | <https://www.rfc-editor.org/info/rfc7405>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [SEMANTICS] | ||||
| Fielding, R., Nottingham, M., and J. Reschke, "HTTP | ||||
| Semantics", draft-ietf-httpbis-semantics-11 (work in | ||||
| progress), August 2020. | ||||
| [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", February 1997. | |||
| 13.2. Informative References | 13.2. Informative References | |||
| [HTTP11] Fielding, R., Nottingham, M., and J. Reschke, "HTTP/1.1 | ||||
| Messaging", draft-ietf-httpbis-messaging-11 (work in | ||||
| progress), August 2020. | ||||
| [I-D.ietf-httpbis-header-structure] | ||||
| Nottingham, M. and P. Kamp, "Structured Field Values for | ||||
| HTTP", draft-ietf-httpbis-header-structure-19 (work in | ||||
| progress), June 2020. | ||||
| [I-D.thomson-http-mice] | ||||
| Thomson, M. and J. Yasskin, "Merkle Integrity Content | ||||
| Encoding", draft-thomson-http-mice-03 (work in progress), | ||||
| August 2018. | ||||
| [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | |||
| DOI 10.17487/RFC2818, May 2000, | DOI 10.17487/RFC2818, May 2000, | |||
| <https://www.rfc-editor.org/info/rfc2818>. | <https://www.rfc-editor.org/info/rfc2818>. | |||
| [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", | [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", | |||
| RFC 5789, DOI 10.17487/RFC5789, March 2010, | RFC 5789, DOI 10.17487/RFC5789, March 2010, | |||
| <https://www.rfc-editor.org/info/rfc5789>. | <https://www.rfc-editor.org/info/rfc5789>. | |||
| [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | ||||
| Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | ||||
| DOI 10.17487/RFC7231, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7231>. | ||||
| [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>. | |||
| [RFC7807] Nottingham, M. and E. Wilde, "Problem Details for HTTP | [RFC7807] Nottingham, M. and E. Wilde, "Problem Details for HTTP | |||
| APIs", RFC 7807, DOI 10.17487/RFC7807, March 2016, | APIs", RFC 7807, DOI 10.17487/RFC7807, March 2016, | |||
| <https://www.rfc-editor.org/info/rfc7807>. | <https://www.rfc-editor.org/info/rfc7807>. | |||
| [RFC8188] Thomson, M., "Encrypted Content-Encoding for HTTP", | ||||
| RFC 8188, DOI 10.17487/RFC8188, June 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8188>. | ||||
| [SRI] Akhawe, D., Braun, F., Marier, F., and J. Weinberger, | [SRI] Akhawe, D., Braun, F., Marier, F., and J. Weinberger, | |||
| "Subresource Integrity", W3C Recommendation REC-SRI- | "Subresource Integrity", W3C Recommendation REC-SRI- | |||
| 20160623, June 2016, | 20160623, June 2016, | |||
| <https://www.w3.org/TR/2016/REC-SRI-20160623/>. | <https://www.w3.org/TR/2016/REC-SRI-20160623/>. | |||
| 13.3. URIs | 13.3. URIs | |||
| [1] https://lists.w3.org/Archives/Public/ietf-http-wg/ | [1] https://lists.w3.org/Archives/Public/ietf-http-wg/ | |||
| [2] https://github.com/httpwg/http-extensions | [2] https://github.com/httpwg/http-extensions | |||
| [3] https://tools.ietf.org/html/rfc7231#section-3.1.2.1 | [3] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| [4] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | [4] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| [5] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | [5] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| [6] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | [6] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| [7] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | [7] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| [8] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | [8] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| [9] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | [9] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| [10] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | [10] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| [11] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | [11] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| [12] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | ||||
| [13] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | ||||
| [14] https://github.com/httpwg/http-core/ | ||||
| issues/313#issuecomment-584389706 | ||||
| Appendix A. Resource Representation and Representation-Data | Appendix A. Resource Representation and Representation-Data | |||
| The following examples show how representation metadata, payload | The following examples show how representation metadata, payload | |||
| transformations and method impacts on the message and payload body. | transformations and method impacts on the message and payload body. | |||
| When the payload body contains non-printable characters (eg. when it | When the payload body contains non-printable characters (eg. when it | |||
| is compressed) it is shown as base64-encoded string. | is compressed) it is shown as base64-encoded string. | |||
| Here is a gzip-compressed json object | A request with a json object without any content coding. | |||
| Request: | ||||
| PUT /entries/1234 HTTP/1.1 | ||||
| Content-Type: application/json | ||||
| {"hello": "world"} | ||||
| Here is a gzip-compressed json object using a content coding. | ||||
| Request: | Request: | |||
| PUT /entries/1234 HTTP/1.1 | PUT /entries/1234 HTTP/1.1 | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: gzip | Content-Encoding: gzip | |||
| H4sIAItWyFwC/6tWSlSyUlAypANQqgUAREcqfG0AAAA= | H4sIAItWyFwC/6tWSlSyUlAypANQqgUAREcqfG0AAAA= | |||
| Now the same payload body conveys a malformed json object. | Now the same payload body conveys a malformed json object. | |||
| skipping to change at page 31, line 4 ¶ | skipping to change at page 32, line 38 ¶ | |||
| Those were unnecessary for correctly using and applying the spec. | Those were unnecessary for correctly using and applying the spec. | |||
| An example with Range Request is more than enough. This doc uses | An example with Range Request is more than enough. This doc uses | |||
| the term "partial representation" which should group all those | the term "partial representation" which should group all those | |||
| cases. | cases. | |||
| 3. How to use "Digest" with "PATCH" method? | 3. How to use "Digest" with "PATCH" method? | |||
| See Section 6. | See Section 6. | |||
| 4. Why remove references to delta-encoding? | 4. Why remove references to delta-encoding? | |||
| Unnecessary for a correct implementation of this spec. The | Unnecessary for a correct implementation of this spec. The | |||
| revised spec can be nicely adapted to "delta encoding", but all | revised spec can be nicely adapted to "delta encoding", but all | |||
| the references here to delta encoding don't add anything to this | the references here to delta encoding don't add anything to this | |||
| RFC. Another job would be to refresh delta encoding. | RFC. Another job would be to refresh delta encoding. | |||
| 5. Why remove references to Digest Authentication? | 5. Why remove references to Digest Authentication? | |||
| This RFC seems to me completely unrelated to Digest | This RFC seems to me completely unrelated to Digest | |||
| Authentication but for the word "Digest". | Authentication but for the word "Digest". | |||
| 6. What changes in "Want-Digest"? | 6. What changes in "Want-Digest"? | |||
| We allow to use the "Want-Digest" in responses to advertise the | The contentMD5 token defined in Section 5 of [RFC3230] is | |||
| supported digest-algorithms and the inability to accept requests | deprecated by Section 7. | |||
| with unsupported digest-algorithms. | ||||
| To clarify that "Digest" and "Want-Digest" can be used in both | ||||
| requests and responses - [RFC3230] carefully uses "sender" and | ||||
| "receiver" in their definition - we added examples on using | ||||
| "Want-Digest" in responses to advertise the supported digest- | ||||
| algorithms and the inability to accept requests with unsupported | ||||
| digest-algorithms. | ||||
| 7. Does this spec changes supported algorithms? | 7. Does this spec changes supported algorithms? | |||
| This RFC updates [RFC5843] which is still delegated for all | This RFC updates [RFC5843] which is still delegated for all | |||
| algorithms updates, and adds two more algorithms: ID-SHA-256 and | algorithms updates, and adds two more algorithms: "id-sha-256" | |||
| ID-SHA-512 which allows to send a checksum of a resource | and "id-sha-512" which allows to send a checksum of a resource | |||
| representation with no content codings applied. | representation with no content codings applied. To simplify a | |||
| future transition to Structured Fields | ||||
| [I-D.ietf-httpbis-header-structure] we suggest to use lowercase | ||||
| for digest-algorithms. | ||||
| 8. What about mid-stream trailers? | ||||
| While mid-stream trailers [14] are interesting, since this | ||||
| specification is a rewrite of [RFC3230] we do not think we should | ||||
| face that. As a first thought, nothing in this document | ||||
| precludes future work that would find a use for mid-stream | ||||
| trailers, for example an incremental digest-algorithm. A | ||||
| document defining such a digest-algorithm is best positioned to | ||||
| describe how it is used. | ||||
| Acknowledgements | Acknowledgements | |||
| The vast majority of this document is inherited from [RFC3230], so | The vast majority of this document is inherited from [RFC3230], so | |||
| thanks to J. Mogul and A. Van Hoff for their great work. The | thanks to J. Mogul and A. Van Hoff for their great work. The | |||
| original idea of refreshing this document arose from an interesting | original idea of refreshing this document arose from an interesting | |||
| discussion with M. Nottingham, J. Yasskin and M. Thomson when | discussion with M. Nottingham, J. Yasskin and M. Thomson when | |||
| reviewing the MICE content coding. | reviewing the MICE content coding. | |||
| Code Samples | Code Samples | |||
| _RFC Editor: Please remove this section before publication._ | _RFC Editor: Please remove this section before publication._ | |||
| How can I generate and validate the Digest values shown in the | How can I generate and validate the "Digest" values shown in the | |||
| examples throughout this document? | examples throughout this document? | |||
| The following python3 code can be used to generate digests for json | The following python3 code can be used to generate digests for json | |||
| objects using SHA algorithms for a range of encodings. Note that | objects using SHA algorithms for a range of encodings. Note that | |||
| these are formatted as base64. This function could be adapted to | these are formatted as base64. This function could be adapted to | |||
| other algorithms and should take into account their specific | other algorithms and should take into account their specific | |||
| formatting rules. | formatting rules. | |||
| import base64, json, hashlib, brotli | import base64, json, hashlib, brotli | |||
| skipping to change at page 33, line 19 ¶ | skipping to change at page 35, line 19 ¶ | |||
| o Digest of error responses is computed on the error representation- | o Digest of error responses is computed on the error representation- | |||
| data #1004 | data #1004 | |||
| o Effect of HTTP semantics on payload and message body moved to | o Effect of HTTP semantics on payload and message body moved to | |||
| appendix #1122 | appendix #1122 | |||
| o Editorial refactoring, moving headers sections up. #1109-#1112, | o Editorial refactoring, moving headers sections up. #1109-#1112, | |||
| #1116, #1117, #1122-#1124 | #1116, #1117, #1122-#1124 | |||
| E.3. Since draft-ietf-httpbis-digest-headers-02 | ||||
| o Deprecate SHA-1 #1154 | ||||
| o Avoid id-* with encrypted content | ||||
| o Digest is independent from 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. | ||||
| Authors' Addresses | Authors' Addresses | |||
| Roberto Polli | Roberto Polli | |||
| Team Digitale, Italian Government | Team Digitale, Italian Government | |||
| Email: robipolli@gmail.com | Email: robipolli@gmail.com | |||
| Lucas Pardue | Lucas Pardue | |||
| Cloudflare | Cloudflare | |||
| End of changes. 139 change blocks. | ||||
| 261 lines changed or deleted | 409 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||