| draft-ietf-httpbis-digest-headers-00.txt | draft-ietf-httpbis-digest-headers-01.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: January 5, 2020 Cloudflare | Expires: May 6, 2020 Cloudflare | |||
| July 04, 2019 | November 03, 2019 | |||
| Resource Digests for HTTP | Digest Headers | |||
| draft-ietf-httpbis-digest-headers-00 | draft-ietf-httpbis-digest-headers-01 | |||
| Abstract | Abstract | |||
| This document defines the Digest and Want-Digest header fields for | This document defines the Digest and Want-Digest header fields for | |||
| HTTP, thus allowing client and server to negotiate an integrity | HTTP, thus allowing client and server to negotiate an integrity | |||
| checksum of the exchanged resource representation data. | checksum of the 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 RFC 7231. | |||
| 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 January 5, 2020. | This Internet-Draft will expire on May 6, 2020. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 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. Brief history of integrity headers . . . . . . . . . . . 4 | 1.1. A Brief History of Integrity Header Fields . . . . . . . 4 | |||
| 1.2. This proposal . . . . . . . . . . . . . . . . . . . . . . 4 | 1.2. This Proposal . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.3. Goals . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1.3. Goals . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.4. Notational Conventions . . . . . . . . . . . . . . . . . 5 | 1.4. Notational Conventions . . . . . . . . . . . . . . . . . 5 | |||
| 2. Resource representation and representation-data . . . . . . . 5 | 2. Resource Representation and Representation-Data . . . . . . . 6 | |||
| 3. Digest Algorithm values . . . . . . . . . . . . . . . . . . . 7 | 3. Digest Algorithm Values . . . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. Representation digest . . . . . . . . . . . . . . . . . . 9 | 3.1. Representation Digest . . . . . . . . . . . . . . . . . . 9 | |||
| 3.1.1. digest-algorithm encoding examples . . . . . . . . . 9 | 3.1.1. digest-algorithm Encoding Examples . . . . . . . . . 10 | |||
| 4. Header Specifications . . . . . . . . . . . . . . . . . . . . 10 | 4. Header Field Specifications . . . . . . . . . . . . . . . . . 10 | |||
| 4.1. Want-Digest . . . . . . . . . . . . . . . . . . . . . . . 10 | 4.1. Want-Digest . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 4.2. Digest . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 4.2. Digest . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 5. Deprecate Negotiation of Content-MD5 . . . . . . . . . . . . 11 | 5. Use of Digest when acting on resources . . . . . . . . . . . 11 | |||
| 6. Broken cryptographic algorithms are NOT RECOMMENDED . . . . . 11 | 5.1. Digest and PATCH . . . . . . . . . . . . . . . . . . . . 12 | |||
| 7. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 11 | 6. Deprecate Negotiation of Content-MD5 . . . . . . . . . . . . 12 | |||
| 7.1. Unsolicited Digest response . . . . . . . . . . . . . . . 11 | 7. Broken Cryptographic Algorithms . . . . . . . . . . . . . . . 12 | |||
| 7.1.1. Representation data is fully contained in the payload 11 | 8. Relationship to Subresource Integrity (SRI) . . . . . . . . . 13 | |||
| 7.1.2. Representation data is not contained in the payload . 12 | 8.1. Supporting Both SRI and Representation Digest . . . . . . 14 | |||
| 7.1.3. Representation data is partially contained in the | 9. Examples of Unsolicited Digest . . . . . . . . . . . . . . . 14 | |||
| payload i.e. range request . . . . . . . . . . . . . 12 | 9.1. Server Returns Full Representation Data . . . . . . . . . 14 | |||
| 7.1.4. Digest in both Request and Response. Returned value | 9.2. Server Returns No Representation Data . . . . . . . . . . 15 | |||
| depends on representation metadata . . . . . . . . . 13 | 9.3. Server Returns Partial Representation Data . . . . . . . 15 | |||
| 7.2. Want-Digest solicited digest responses . . . . . . . . . 13 | 9.4. Client and Server Provide Full Representation Data . . . 15 | |||
| 7.2.1. Client request data is fully contained in the payload 13 | 9.5. Client Provides Full Representation Data, Server Provides | |||
| 7.2.2. A client requests an unsupported Digest, the server | No Representation Data . . . . . . . . . . . . . . . . . 16 | |||
| MAY reply with an unsupported digest . . . . . . . . 14 | 9.6. Client and Server Provide Full Representation Data, | |||
| 7.2.3. A client requests an unsupported Digest, the server | Client Uses id-sha-256. . . . . . . . . . . . . . . . . . 17 | |||
| MAY reply with a 400 . . . . . . . . . . . . . . . . 14 | 9.7. POST Response does not Reference the Request URI . . . . 17 | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 14 | 9.8. POST Response Describes the Request Status . . . . . . . 18 | |||
| 8.1. Digest does not protect the full HTTP message . . . . . . 14 | 9.9. Digest with PATCH . . . . . . . . . . . . . . . . . . . . 19 | |||
| 8.2. Broken cryptographic algorithms . . . . . . . . . . . . . 15 | 10. Examples of Want-Digest Solicited Digest . . . . . . . . . . 19 | |||
| 8.3. Digest for end-to-end integrity . . . . . . . . . . . . . 15 | 10.1. Server Selects Client's Least Preferred Algorithm . . . 20 | |||
| 8.4. Usage in signatures . . . . . . . . . . . . . . . . . . . 15 | 10.2. Server Selects Algorithm Unsupported by Client . . . . . 20 | |||
| 8.5. Message Truncation . . . . . . . . . . . . . . . . . . . 16 | 10.3. Server Does Not Support Client Algorithm and Returns an | |||
| 8.6. Algorithm Agility . . . . . . . . . . . . . . . . . . . . 16 | Error . . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 16 | 11. Security Considerations . . . . . . . . . . . . . . . . . . . 21 | |||
| 9.1. Establish the HTTP Digest Algorithm Values . . . . . . . 16 | 11.1. Digest Does Not Protect the Full HTTP Message . . . . . 21 | |||
| 9.2. The "status" field in the HTTP Digest Algorithm Values . 16 | 11.2. Broken Cryptographic Algorithms . . . . . . . . . . . . 21 | |||
| 9.3. Obsolete "MD5" Digest Algorithm . . . . . . . . . . . . . 16 | 11.3. Other Deprecated Algorithms . . . . . . . . . . . . . . 21 | |||
| 9.4. Obsolete "SHA" Digest Algorithm . . . . . . . . . . . . . 16 | 11.4. Digest for End-to-End Integrity . . . . . . . . . . . . 21 | |||
| 9.5. The "ID-SHA-256" Digest Algorithm . . . . . . . . . . . . 17 | 11.5. Usage in Signatures . . . . . . . . . . . . . . . . . . 22 | |||
| 9.6. The "ID-SHA-512" Digest Algorithm . . . . . . . . . . . . 17 | 11.6. Message Truncation . . . . . . . . . . . . . . . . . . . 22 | |||
| 9.7. Changes compared to RFC5843 . . . . . . . . . . . . . . . 17 | 11.7. Algorithm Agility . . . . . . . . . . . . . . . . . . . 22 | |||
| 9.8. Want-Digest Header Field Registration . . . . . . . . . . 17 | 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 9.9. Digest Header Field Registration . . . . . . . . . . . . 18 | 12.1. Establish the HTTP Digest Algorithm Values . . . . . . . 22 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 18 | 12.2. The "status" Field in the HTTP Digest Algorithm Values . 23 | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . 18 | 12.3. Deprecate "MD5" Digest Algorithm . . . . . . . . . . . . 23 | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . 20 | 12.4. Update "CRC32C" Digest Algorithm . . . . . . . . . . . . 23 | |||
| 10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 20 | 12.5. Obsolete "SHA" Digest Algorithm . . . . . . . . . . . . 23 | |||
| Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 21 | 12.6. Obsolete "ADLER32" Digest Algorithm . . . . . . . . . . 24 | |||
| Appendix B. FAQ . . . . . . . . . . . . . . . . . . . . . . . . 21 | 12.7. The "ID-SHA-256" Digest Algorithm . . . . . . . . . . . 24 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 22 | 12.8. The "ID-SHA-512" Digest Algorithm . . . . . . . . . . . 24 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 22 | 12.9. Changes compared to RFC5843 . . . . . . . . . . . . . . 24 | |||
| 12.10. Want-Digest Header Field Registration . . . . . . . . . 25 | ||||
| 12.11. Digest Header Field Registration . . . . . . . . . . . . 25 | ||||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 25 | ||||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 28 | ||||
| 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 28 | ||||
| Appendix A. FAQ . . . . . . . . . . . . . . . . . . . . . . . . 28 | ||||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 29 | ||||
| Code Samples . . . . . . . . . . . . . . . . . . . . . . . . . . 30 | ||||
| Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 | ||||
| D.1. Since draft-ietf-httpbis-digest-headers-00 . . . . . . . 30 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 31 | ||||
| 1. Introduction | 1. Introduction | |||
| Integrity protection for HTTP content is multi layered and is usually | The core specification of HTTP does not define a means to protect the | |||
| achieved across the protocol stack: TCP checksums and TLS [RFC2818] | integrity of resources. When HTTP messages are transferred between | |||
| record to name but some. | endpoints, the protocol might choose to make use of features of the | |||
| lower layer in order to provide some integrity protection; for | ||||
| The HTTP protocol does not provide means to protect the various | instance TCP checksums or TLS records [RFC2818]. | |||
| message parts. Besides, it might be desirable to add additional | ||||
| guarantees to the ones provided by the transport layer (eg. HTTPS). | ||||
| This may be in order to: | ||||
| o detect programming errors and corruption of stored data; | ||||
| o address the need for the representation-data to remain unmodified | ||||
| throughout multiple hops; | ||||
| o implement signature mechanisms that cover the desired parts of an | However, there are cases where relying on this alone is insufficient. | |||
| HTTP exchange; | An HTTP-level integrity mechanism that operates independent of | |||
| transfer can be used to detect programming errors and/or corruption | ||||
| of data at rest, be used across multiple hops in order to provide | ||||
| end-to-end integrity guarantees, aid fault diagnosis across hops and | ||||
| system boundaries, and can be used to validate integrity when | ||||
| reconstructing a resource fetched using different HTTP connections. | ||||
| o provide additional protection against failures or attack (see | This document defines a mechanism that acts on HTTP representation- | |||
| [SRI]). | data. It can be combined with other mechanisms that protect | |||
| representation-metadata, such as digital signatures, in order to | ||||
| protect the desired parts of an HTTP exchange in whole or in part. | ||||
| 1.1. Brief history of integrity headers | 1.1. A Brief History of Integrity Header 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] in 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 headers "Digest" and "Want-Digest". | of "instance", and the header 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 [RFC7231] made | |||
| [RFC3230] definitions inconsistent with the current standard. A | [RFC3230] definitions inconsistent with the current standard. A | |||
| refresh was then required. | refresh was then required. | |||
| This document updates the "Digest" and "Want-Digest" header field | This document updates the "Digest" and "Want-Digest" header field | |||
| definitions to align with [RFC7231] concepts. | definitions to align with [RFC7231] concepts. | |||
| This approach can be easily adapted to use-cases where the | This approach can be easily adapted to use-cases where the | |||
| transferred data does require some sort of manipulation to be | transferred data does require some sort of manipulation to be | |||
| skipping to change at page 5, line 11 ¶ | skipping to change at page 5, line 22 ¶ | |||
| 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 integrity: The digest mechanisms described here cover only | Header field integrity: The digest mechanisms described here cover | |||
| representation and selected representation data, and do not | only representation and selected representation data, and do not | |||
| protect the integrity of associated representation metadata | protect the integrity of associated representation metadata or | |||
| headers or other message headers. | other message header 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. | |||
| skipping to change at page 5, line 39 ¶ | skipping to change at page 5, line 50 ¶ | |||
| "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 7 of | |||
| [RFC7230]. | [RFC7230]. | |||
| 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 [RFC7230] and | |||
| [RFC7231]. | [RFC7231]. | |||
| 2. Resource representation and representation-data | The definition "validator" in this document is to be interpreted as | |||
| described in Section 7.2 of [RFC7231]. | ||||
| 2. Resource Representation and Representation-Data | ||||
| To avoid inconsistencies, an integrity mechanism for HTTP messages | To avoid inconsistencies, an integrity mechanism for HTTP messages | |||
| should decouple the checksum calculation: | should decouple the checksum calculation from: | |||
| o from the payload body - which may be altered by mechanism like | o the payload body - which may be altered by mechanism like Range | |||
| Range Requests [RFC7233] or the method (eg. HEAD); | Requests [RFC7233] or the method (eg. HEAD); | |||
| o and from the message body - which depends on "Transfer-Encoding" | o and the message body - which depends on "Transfer-Encoding" and | |||
| and whatever tranformations the intermediaries may apply. | whatever transformations the intermediaries may apply. | |||
| The following examples show how representation metadata, payload | The following examples show how representation metadata, payload | |||
| tranformations and method impacts on the message and payload body. | transformations and method impacts on the message and payload body. | |||
| Here is a gzip-compressed json object | Here is a gzip-compressed json object | |||
| 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. | |||
| Request: | Request: | |||
| PUT /entries/1234 HTTP/1.1 | PUT /entries/1234 HTTP/1.1 | |||
| Content-Type: application/json | Content-Type: application/json | |||
| H4sIAItWyFwC/6tWSlSyUlAypANQqgUAREcqfG0AAAA= | H4sIAItWyFwC/6tWSlSyUlAypANQqgUAREcqfG0AAAA= | |||
| A Range-Request alters the payload body, conveying a partial | A Range-Request alters the payload body, conveying a partial | |||
| representation. | representation. | |||
| Request: | Request: | |||
| GET /entries/1234 HTTP/1.1 | GET /entries/1234 HTTP/1.1 | |||
| Range: bytes=1-7 | Range: bytes=1-7 | |||
| Response: | Response: | |||
| HTTP/1.1 206 Partial Content | HTTP/1.1 206 Partial Content | |||
| Content-Encoding: gzip | Content-Encoding: gzip | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Range: bytes=1-7 | Content-Range: bytes 1-7/18 | |||
| iwgAla3RXA== | iwgAla3RXA== | |||
| Now the method too alters the payload body. | Now the method too alters the payload body. | |||
| Request: | Request: | |||
| HEAD /entries/1234 HTTP/1.1 | HEAD /entries/1234 HTTP/1.1 | |||
| Accept: application/json | Accept: application/json | |||
| Accept-Encoding: gzip | Accept-Encoding: gzip | |||
| Response: | Response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: gzip | Content-Encoding: gzip | |||
| 3. Digest Algorithm values | 3. 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 may be | computation. For some algorithms, one or more parameters may be | |||
| supplied. | supplied. | |||
| digest-algorithm = token | digest-algorithm = token | |||
| The BNF for "parameter" is as is used in [RFC7230]. All digest- | The BNF for "parameter" is as is used in [RFC7230]. All digest- | |||
| algorithm values are case-insensitive. | algorithm values are case-insensitive. | |||
| 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 following tokens. | digest-algorithm values. The registry contains the following tokens. | |||
| SHA-256: | SHA-256: | |||
| * Description: The SHA-256 algorithm [FIPS180-3]. 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: [FIPS180-3], [RFC4648], this document. | * Reference: [RFC6234], [RFC4648], this document. | |||
| * Status: standard | * Status: standard | |||
| SHA-512: | SHA-512: | |||
| * Description: The SHA-512 algorithm [FIPS180-3]. 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: [FIPS180-3], [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]. The MD5 algorithm is NOT RECOMMENDED 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: obsoleted | * Status: deprecated | |||
| SHA: | SHA: | |||
| * Description: The SHA-1 algorithm [FIPS180-1]. The output of | * Description: The SHA-1 algorithm [RFC3174]. The output of this | |||
| this algorithm is encoded using the base64 encoding [RFC4648]. | algorithm is encoded using the base64 encoding [RFC4648]. The | |||
| The SHA algorithm is NOT RECOMMENDED as it's now vulnerable to | SHA algorithm is NOT RECOMMENDED as it's now vulnerable to | |||
| collision attacks [IACR-2019-459]. | collision attacks [IACR-2019-459]. | |||
| * Reference: [FIPS180-3], [RFC4648], this document. | * Reference: [RFC3174], [RFC6234], [RFC4648], this document. | |||
| * Status: obsoleted | * Status: obsoleted | |||
| 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. | |||
| skipping to change at page 9, line 11 ¶ | skipping to change at page 9, line 19 ¶ | |||
| 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 | |||
| 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 (eg. "Content- | |||
| Encoding: identity") | Encoding: identity") | |||
| * Reference: [FIPS180-3], [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 (eg. "Content- | |||
| Encoding: identity") | Encoding: identity") | |||
| * Reference: [FIPS180-3], [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. | |||
| 3.1. Representation digest | 3.1. Representation Digest | |||
| A representation digest is the value of the output of a digest | A representation digest is the value of the output of a digest | |||
| algorithm, together with an indication of the algorithm used (and any | algorithm, together with an indication of the algorithm used (and any | |||
| parameters). | parameters). | |||
| representation-data-digest = digest-algorithm "=" | representation-data-digest = digest-algorithm "=" | |||
| <encoded digest output> | <encoded digest output> | |||
| As explained in Section 2 the digest is computed on the entire | As explained in Section 2 the digest is computed on the entire | |||
| selected "representation data" of the resource defined in [RFC7231]: | selected "representation data" of the resource defined in [RFC7231]: | |||
| representation-data := Content-Encoding( Content-Type( bits ) ) | representation-data := Content-Encoding( Content-Type( bits ) ) | |||
| The encoded digest output uses the encoding format defined for the | The encoded digest output uses the encoding format defined for the | |||
| specific digest-algorithm. | specific digest-algorithm. | |||
| 3.1.1. digest-algorithm encoding examples | 3.1.1. digest-algorithm Encoding Examples | |||
| The "sha-256" digest-algorithm uses base64 encoding. Note that | The "sha-256" digest-algorithm uses base64 encoding. Note that | |||
| digest-algoritm values are case insensitive. | digest-algorithm values are case insensitive. | |||
| sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | ||||
| sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | ||||
| The "UNIXsum" digest-algorithm uses ASCII string of decimal digits. | The "UNIXsum" digest-algorithm uses ASCII string of decimal digits. | |||
| UNIXsum=30637 | UNIXsum=30637 | |||
| 4. Header Specifications | 4. Header Field Specifications | |||
| The following headers are defined | The following headers are defined | |||
| 4.1. Want-Digest | 4.1. Want-Digest | |||
| The Want-Digest message header field indicates the sender's desire to | The Want-Digest message header field indicates the sender's desire to | |||
| receive a representation digest on messages associated with the | receive a representation digest on messages associated with the | |||
| Request- URI and representation metadata. | request URI and 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 ] ) / ( "1" [ "." 0*1( "0" ) ] ) | qvalue = ( "0" [ "." 0*1DIGIT ] ) / ( "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 header field of a message, and its qvalue | |||
| is non-zero. | is 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. | |||
| Examples: | 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, md5;q=0 | |||
| 4.2. Digest | 4.2. Digest | |||
| The Digest header field provides a digest of the representation data | The Digest header field provides a digest of the representation data. | |||
| Digest = "Digest" ":" OWS 1#representation-data-digest | Digest = "Digest" ":" OWS 1#representation-data-digest | |||
| "Representation data" might be: | "Representation data" might be: | |||
| o fully contained in the message body, | o fully contained in the message body, | |||
| o partially-contained in the message body, | o partially-contained in the message body, | |||
| o or not at all contained in the message body. | o or not at all contained in the message body. | |||
| The resource is specified by the effective Request-URI and any cache- | The resource is specified by the effective request URI and any | |||
| validator contained in the message. | "validator" contained in the message. | |||
| For example, in a response to a HEAD request, the digest is | For example, in a response to a HEAD request, the digest is | |||
| calculated using the representation data that would have been | calculated using the representation data that would have been | |||
| enclosed in the payload body if the same request had been a GET. | enclosed in the payload body if the same request had been a GET. | |||
| Digest can be used in requests too. Returned value depends on the | Digest can be used in requests too. | |||
| representation metadata headers. | ||||
| The "Digest" value depends on the representation metadata. | ||||
| A Digest header field MAY contain multiple representation-data-digest | A Digest header 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 chose which | in a Digest header field. This allows the recipient to chose which | |||
| digest-algorithm(s) to use for validation instead of verifying every | digest-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. | |||
| ... | Two examples of its use are | |||
| 5. Deprecate Negotiation of Content-MD5 | Digest: id-sha-512=WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm+AbwAgBWnrIiYllu7BNNyealdVLvRwE\nmTHWXvJwew== | |||
| Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo=, id-sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | ||||
| This RFC deprecates the negotiation of Content-MD5 as this header has | 5. Use of Digest when acting on resources | |||
| been obsoleted by [RFC7231] | ||||
| 6. Broken cryptographic algorithms are NOT RECOMMENDED | POST and PATCH requests may appear to convey partial representations | |||
| but are semantically acting on resources. The enclosed | ||||
| representation, including its metadata refers to that action. | ||||
| The MD5 algorithm is NOT RECOMMENDED as it's now vulnerable to | In these requests the representation digest MUST be computed on the | |||
| representation-data of that action. | ||||
| This is the only possible choice because representation digest | ||||
| requires complete representation metadata (see Section 3.1). | ||||
| In responses, | ||||
| o if the representation describes the status of the request, | ||||
| "Digest" MUST be computed on the enclosed representation (see | ||||
| Section 9.8 ); | ||||
| o if there is a referenced resource "Digest" MUST be computed on the | ||||
| selected representation of the referenced resource even if that is | ||||
| different from the target resource. That may or may not result in | ||||
| computing "Digest" on the enclosed representation. | ||||
| The latter case might be done accordingly to the HTTP semantics of | ||||
| the given method, for example using the "Content-Location" header | ||||
| field. | ||||
| Differently from "Content-Location", which is representation | ||||
| metadata, the "Location" header field does not affect "Digest". | ||||
| 5.1. Digest and PATCH | ||||
| In PATCH requests the representation digest MUST be computed on the | ||||
| patch document. | ||||
| This is because the representation metadata refers to the patch | ||||
| document and not to the target resource (see Section 2 of [RFC5789]). | ||||
| In PATCH responses the representation digest MUST be computed on the | ||||
| selected representation of the patched resource. | ||||
| "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 | ||||
| the patch document. | ||||
| 6. Deprecate Negotiation of Content-MD5 | ||||
| This RFC deprecates the negotiation of Content-MD5 as it has been | ||||
| obsoleted by [RFC7231] | ||||
| 7. Broken Cryptographic Algorithms | ||||
| The MD5 algorithm MUST NOT be used as it has been found vulnerable to | ||||
| collision attacks [CMU-836068]. | collision attacks [CMU-836068]. | |||
| The SHA algorithm is NOT RECOMMENDED as it's now vulnerable to | The SHA algorithm is NOT RECOMMENDED as it has been found vulnerable | |||
| collision attacks [IACR-2019-459]. | to collision attacks [IACR-2019-459]. | |||
| 7. Examples | 8. Relationship to Subresource Integrity (SRI) | |||
| 7.1. Unsolicited Digest response | Subresource Integrity [SRI] is an integrity mechanism that shares | |||
| some similarities to the present document's mechanism. However, | ||||
| there are differences in motivating factors, threat model and | ||||
| specification of integrity digest generation, signalling and | ||||
| validation. | ||||
| SRI allows a first-party authority to declare an integrity assertion | ||||
| on a resource served by a first or third party authority. This is | ||||
| done via the "integrity" attribute that can added to "script" or | ||||
| "link" HTML elements. Therefore, the integrity assertion is always | ||||
| made out-of-band to the resource fetch. In contrast, the "Digest" | ||||
| header field is supplied in-band alongside the selected | ||||
| representation, meaning that an authority can only declare an | ||||
| integrity assertion for itself. Methods to improve the security | ||||
| properties of representation digests are presented in Section 11. | ||||
| This contrast is interesting because on one hand self-assertion is | ||||
| less likely to be affected by coordination problems such as the | ||||
| first-party holding stale information about the third party, but on | ||||
| the other hand the self-assertion is only as trustworthy as the | ||||
| authority that provided it. | ||||
| The SRI "integrity" attribute contains a cryptographic hash algorithm | ||||
| and digest value which is similar to "representation-data-digest" | ||||
| (see Section 3.1). The major differences are in serialization | ||||
| format. | ||||
| The SRI digest value is calculated over the identity encoding of the | ||||
| resource, not the selected representation (as specified for | ||||
| "representation-data-digest" in this document). Section 3.4.5 of | ||||
| [SRI] describes the benefit of the identity approach - the SRI | ||||
| "integrity" attribute can contain multiple algorithm-value pairs | ||||
| where each applies to a different identity encoded payload. This | ||||
| allows for protection of distinct resources sharing a URL. However, | ||||
| this is a contrast to the design of representation digests, where | ||||
| multiple "Digest" field-values all protect the same representation. | ||||
| SRI does not specify handling of partial representation data (e.g. | ||||
| Range requests). In contrast, this document specifies handling in | ||||
| terms that are fully compatible with core HTTP concepts (an example | ||||
| is provided in Section 9.3). | ||||
| SRI specifies strong requirements on the selection of algorithm for | ||||
| generation and validation of digests. In contrast, the requirements | ||||
| in this document are weaker. | ||||
| SRI defines no method for a client to declare an integrity assertion | ||||
| on resources it transfers to a server. In contrast, the "Digest" | ||||
| header field can appear on requests. | ||||
| 8.1. Supporting Both SRI and Representation Digest | ||||
| The SRI and Representation Digest mechanism are different and | ||||
| complementary but one is not capable of replacing the other because | ||||
| they have have different threat, security and implementation | ||||
| properties. | ||||
| A user agent that supports both mechanisms is expected to apply the | ||||
| rules specified for each but since the two mechanisms are | ||||
| independent, the ordering is not important. However, a user agent | ||||
| supporting both could benefit from performing representation digest | ||||
| validation first because the it does not require a conversion to into | ||||
| identity encoding. | ||||
| There is a chance that a user agent supporting both mechanisms may | ||||
| find one validates successfully while the other fails. This document | ||||
| specifies no requirements or guidance for user agents that experience | ||||
| such cases. | ||||
| 9. Examples of Unsolicited Digest | ||||
| The following examples demonstrate interactions where a server | ||||
| responds with a "Digest" header field even though the client did not | ||||
| solicit one using "Want-Digest". | ||||
| 9.1. Server Returns Full Representation Data | ||||
| 7.1.1. Representation data is fully contained in the payload | ||||
| 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 | Content-Encoding: identity | |||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| {"hello": "world"} | {"hello": "world"} | |||
| 7.1.2. Representation data is not contained in the payload | 9.2. Server Returns No Representation Data | |||
| As there is no content coding applied, the "sha-256" and the "id-sha- | ||||
| 256" digest-values are the same. | ||||
| Request: | Request: | |||
| HEAD /items/123 | HEAD /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 | Content-Encoding: identity | |||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: id-sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| 7.1.3. Representation data is partially contained in the payload i.e. | 9.3. Server Returns Partial Representation Data | |||
| range request | ||||
| 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-Encoding: identity | |||
| Content-Range: bytes 1-7/18 | Content-Range: bytes 1-7/18 | |||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| "hello" | "hello" | |||
| 7.1.4. Digest in both Request and Response. Returned value depends on | 9.4. Client and Server Provide Full Representation Data | |||
| representation metadata | ||||
| Digest can be used in requests too. Returned value depends on the | The request contains a "Digest" header calculated on the enclosed | |||
| representation metadata headers. | representation. | |||
| It also includes an "Accept-Encoding: br" header field that | ||||
| advertises the client supports brotli encoding. | ||||
| The response includes a "Content-Encoding: br" that indicates the | ||||
| selected representation is brotli encoded. The "Digest" field-value | ||||
| is therefore different compared to the request. | ||||
| Request: | Request: | |||
| PUT /items/123 | PUT /items/123 | |||
| Content-Type: application/json | Content-Type: application/json | |||
| Content-Encoding: identity | Content-Encoding: identity | |||
| Accept-Encoding: br | Accept-Encoding: br | |||
| Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo= | 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=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo= | |||
| iwiAeyJoZWxsbyI6ICJ3b3JsZCJ9Aw== | iwiAeyJoZWxsbyI6ICJ3b3JsZCJ9Aw== | |||
| 7.2. Want-Digest solicited digest responses | 9.5. Client Provides Full Representation Data, Server Provides No | |||
| Representation Data | ||||
| 7.2.1. Client request data is fully contained in the payload | Request "Digest" value is calculated on the enclosed payload. | |||
| Response "Digest" value depends on the representation metadata header | ||||
| fields, including "Content-Encoding: br" even when the response does | ||||
| not contain a payload body. | ||||
| Request: | ||||
| PUT /items/123 | ||||
| Content-Type: application/json | ||||
| Content-Encoding: identity | ||||
| Content-Length: 18 | ||||
| Accept-Encoding: br | ||||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | ||||
| {"hello": "world"} | ||||
| Response: | ||||
| HTTP/1.1 204 No Content | ||||
| Content-Type: application/json | ||||
| Content-Encoding: br | ||||
| Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo= | ||||
| 9.6. Client and Server Provide Full Representation Data, Client Uses | ||||
| id-sha-256. | ||||
| The response contains two digest values: | ||||
| o one with no content coding applied, which in this case | ||||
| accidentally matches the unencoded digest-value sent in the | ||||
| request; | ||||
| o one taking into account the "Content-Encoding". | ||||
| Request: | ||||
| PUT /items/123 HTTP/1.1 | ||||
| Content-Type: application/json | ||||
| Content-Encoding: identity | ||||
| Accept-Encoding: br | ||||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | ||||
| {"hello": "world"} | ||||
| Response: | ||||
| HTTP/1.1 200 OK | ||||
| Content-Type: application/json | ||||
| Content-Encoding: br | ||||
| Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo=, id-sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | ||||
| iwiAeyJoZWxsbyI6ICJ3b3JsZCJ9Aw== | ||||
| 9.7. POST Response does not Reference the Request URI | ||||
| Request "Digest" value is computed on the enclosed representation | ||||
| (see Section 5). | ||||
| The representation enclosed in the response refers to the resource | ||||
| identified by "Content-Location" (see [RFC7231] Section 3.1.4.2 and | ||||
| Section 3.1.4.1 point 4). | ||||
| "Digest" is thus computed on the enclosed representation. | ||||
| Request: | ||||
| POST /books HTTP/1.1 | ||||
| Content-Type: application/json | ||||
| Accept: application/json | ||||
| Accept-Encoding: identity | ||||
| Digest: sha-256=bWopGGNiZtbVgHsG+I4knzfEJpmmmQHf7RHDXA3o1hQ= | ||||
| {"title": "New Title"} | ||||
| Response | ||||
| HTTP/1.1 201 Created | ||||
| Content-Type: application/json | ||||
| Digest: id-sha-256=BZlF2v0IzjuxN01RQ97EUXriaNNLhtI8Chx8Eq+XYSc= | ||||
| Content-Location: /books/123 | ||||
| {"id": "123", "title": "New Title"} | ||||
| Note that a "204 No Content" response without a payload body but with | ||||
| the same "Digest" field-value would have been legitimate too. | ||||
| 9.8. POST Response Describes the Request Status | ||||
| Request "Digest" value is computed on the enclosed representation | ||||
| (see Section 5). | ||||
| The representation enclosed in the response describes the status of | ||||
| the request, so "Digest" is computed on that enclosed representation. | ||||
| Response "Digest" has no explicit relation with the resource | ||||
| referenced by "Location". | ||||
| Request: | ||||
| POST /books HTTP/1.1 | ||||
| Content-Type: application/json | ||||
| Accept: application/json | ||||
| Accept-Encoding: identity | ||||
| Digest: sha-256=bWopGGNiZtbVgHsG+I4knzfEJpmmmQHf7RHDXA3o1hQ= | ||||
| Location: /books/123 | ||||
| {"title": "New Title"} | ||||
| Response | ||||
| HTTP/1.1 201 Created | ||||
| Content-Type: application/json | ||||
| Digest: id-sha-256=0o/WKwSfnmIoSlop2LV/ISaBDth05IeW27zzNMUh5l8= | ||||
| Location: /books/123 | ||||
| {"status": "created", "id": "123", "ts": 1569327729, "instance": "/books/123"} | ||||
| 9.9. Digest with PATCH | ||||
| This case is analogous to a POST request where the target resource | ||||
| reflects the effective request URI. | ||||
| The PATCH request uses the "application/merge-patch+json" media type | ||||
| defined in [RFC7396]. | ||||
| "Digest" is calculated on the enclosed payload, which corresponds to | ||||
| the patch document. | ||||
| The response "Digest" is computed on the complete representation of | ||||
| the patched resource. | ||||
| Request: | ||||
| PATCH /books/123 HTTP/1.1 | ||||
| Content-Type: application/merge-patch+json | ||||
| Accept: application/json | ||||
| Accept-Encoding: identity | ||||
| Digest: sha-256=bWopGGNiZtbVgHsG+I4knzfEJpmmmQHf7RHDXA3o1hQ= | ||||
| {"title": "New Title"} | ||||
| Response: | ||||
| HTTP/1.1 200 OK | ||||
| Content-Type: application/json | ||||
| Digest: id-sha-256=BZlF2v0IzjuxN01RQ97EUXriaNNLhtI8Chx8Eq+XYSc= | ||||
| {"id": "123", "title": "New Title"} | ||||
| Note that a "204 No Content" response without a payload body but with | ||||
| the same "Digest" field-value would have been legitimate too. | ||||
| 10. Examples of Want-Digest Solicited Digest | ||||
| The following examples demonstrate interactions where a client | ||||
| solicits a "Digest" using "Want-Digest". | ||||
| 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 to | |||
| reply with sha-256 anyway. | reply with sha-256 anyway. | |||
| Request: | Request: | |||
| GET /items/123 | 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 | Content-Encoding: identity | |||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
| {"hello": "world"} | {"hello": "world"} | |||
| 7.2.2. A client requests an unsupported Digest, the server MAY reply | 10.2. Server Selects Algorithm Unsupported by Client | |||
| with an unsupported digest | ||||
| 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 | Content-Encoding: identity | |||
| Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: id-sha-512=WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm+AbwAgBWnrIiYllu7BNNyealdVLvRwE\nmTHWXvJwew== | |||
| {"hello": "world"} | {"hello": "world"} | |||
| 7.2.3. A client requests an unsupported Digest, the server MAY reply | 10.3. Server Does Not Support Client Algorithm and Returns an Error | |||
| with a 400 | ||||
| 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 | |||
| Request: | Request: | |||
| GET /items/123 | GET /items/123 | |||
| Want-Digest: sha;q=1 | Want-Digest: sha;q=1 | |||
| 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 | |||
| ... | ||||
| 8. Security Considerations | 11. Security Considerations | |||
| 8.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" | "representation data", but not HTTP "representation metadata" header | |||
| headers, from certain kinds of accidental corruption. | fields, from certain kinds of accidental corruption. | |||
| While it is not intended as general protection against malicious | "Digest" is not intended as general protection against malicious | |||
| tampering with HTTP messages, this goal can be achieved using | tampering with HTTP messages, this can be achieved by combining it | |||
| "Digest" together with a transport-layer security mechanism and | with other approaches such as transport-layer security or digital | |||
| digital signatures. | signatures. | |||
| 8.2. Broken cryptographic algorithms | 11.2. Broken Cryptographic Algorithms | |||
| Cryptogrphic alorithms 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 algorithms are vulnerable to | |||
| collisions attacks and they are NOT RECOMMENDED. | collisions attacks, so MD5 MUST NOT be used and SHA-1 is NOT | |||
| RECOMMENDED for use with "Digest". | ||||
| 8.3. Digest for end-to-end integrity | 11.3. Other Deprecated Algorithms | |||
| The ADLER32 algorithm defined in [RFC1950] has been deprecated by | ||||
| [RFC3309] because under certain conditions it provides weak detection | ||||
| of errors and is now NOT RECOMMENDED for use with "Digest". | ||||
| 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-512) | |||
| allow piecing together a resource from different sources (e.g. | 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. | |||
| 8.4. Usage in signatures | 11.5. 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 header fields and there are | ||||
| additional considerations when "Digest" is included in this set. | ||||
| It's important to note that, being the "Digest" header an hash of a | Since the "Digest" header field is a hash of a resource | |||
| resource representation, signing only the "Digest" header, without | representation, it explicitly depends on the "representation | |||
| all the "representation metatada" (eg. the values of "Content-Type" | metadata" (eg. the values of "Content-Type", "Content-Encoding" etc). | |||
| and "Content-Encoding") may expose the communication to tampering. | A signature that protects "Digest" but not other "representation | |||
| metadata" may expose the communication to tampering. For example, an | ||||
| actor could manipulate the "Content-Type" field-value and cause a | ||||
| digest validation failure at the recipient, preventing the | ||||
| application from accessing the representation. Such an attack | ||||
| consumes the resources of both endpoints. | ||||
| "Digest" SHOULD always be used over a connection which provides | "Digest" SHOULD always be used over a connection which provides | |||
| integrity at transport layer that protects HTTP headers. | integrity at transport layer that protects HTTP header fields. | |||
| A "Digest" header using NOT RECOMMENDED digest-algorithms SHOULD NOT | A "Digest" header field using NOT RECOMMENDED digest-algorithms | |||
| be used in signatures. | SHOULD NOT be used in signatures. | |||
| 8.5. Message Truncation | 11.6. Message Truncation | |||
| ... | ... | |||
| 8.6. Algorithm Agility | 11.7. Algorithm Agility | |||
| ... | ... | |||
| 9. IANA Considerations | 12. IANA Considerations | |||
| 9.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 [4] | |||
| 9.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 | [5] 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. | |||
| 9.3. Obsolete "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 [6] registry: | Algorithm Values [6] registry: | |||
| o Digest Algorithm: MD5 | o Digest Algorithm: MD5 | |||
| o Description: As specified in Section 3. | o Description: As specified in Section 3. | |||
| o Status: As specified in Section 3. | o Status: As specified in Section 3. | |||
| 9.4. Obsolete "SHA" Digest Algorithm | 12.4. Update "CRC32C" Digest Algorithm | |||
| This memo updates the "SHA" digest algorithm in the HTTP Digest | This memo updates the "CRC32c" digest algorithm in the HTTP Digest | |||
| Algorithm Values [7] registry: | Algorithm Values [7] registry: | |||
| o Digest Algorithm: SHA | o Digest Algorithm: CRC32c | |||
| o Description: The CRC32c algorithm is a 32-bit cyclic redundancy | ||||
| check. It achieves a better hamming distance (for better error- | ||||
| detection performance) than many other 32-bit CRC functions. | ||||
| Other places it is used include iSCSI and SCTP. The 32-bit output | ||||
| 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, | ||||
| CRC32c=0a72a4df and crc32c=A72A4DF are both valid checksums for | ||||
| the 3-byte message "dog". | ||||
| o Reference: [RFC4960] appendix B, this document. | ||||
| o Status: standard. | ||||
| 12.5. Obsolete "SHA" Digest Algorithm | ||||
| This memo updates the "SHA" digest algorithm in the HTTP Digest | ||||
| Algorithm Values [8] registry: | ||||
| o Digest Algorithm: SHA | ||||
| o Description: As specified in Section 3. | o Description: As specified in Section 3. | |||
| o Status: As specified in Section 3. | o Status: As specified in Section 3. | |||
| 9.5. The "ID-SHA-256" Digest Algorithm | 12.6. Obsolete "ADLER32" Digest Algorithm | |||
| This memo updates the "ADLER32" digest algorithm in the HTTP Digest | ||||
| Algorithm Values [9] registry: | ||||
| o Digest Algorithm: ADLER32 | ||||
| o Description: The ADLER32 algorithm is a checksum specified in | ||||
| [RFC1950] "ZLIB Compressed Data Format". The 32-bit output 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, | ||||
| ADLER32=03da0195 and ADLER32=3DA0195 are both valid checksums for | ||||
| the 4-byte message "Wiki". This algorithm is obsoleted and SHOULD | ||||
| NOT be used. | ||||
| o Status: obsoleted | ||||
| 12.7. The "ID-SHA-256" Digest Algorithm | ||||
| This memo registers the "ID-SHA-256" digest algorithm in the HTTP | This memo registers the "ID-SHA-256" digest algorithm in the HTTP | |||
| Digest Algorithm Values [8] registry: | Digest Algorithm Values [10] registry: | |||
| o Digest Algorithm: ID-SHA-256 | o Digest Algorithm: ID-SHA-256 | |||
| o Description: As specified in Section 3. | o Description: As specified in Section 3. | |||
| o Status: As specified in Section 3. | o Status: As specified in Section 3. | |||
| 9.6. The "ID-SHA-512" Digest Algorithm | 12.8. 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 [9] registry: | Digest Algorithm Values [11] registry: | |||
| o Digest Algorithm: ID-SHA-512 | o Digest Algorithm: ID-SHA-512 | |||
| o Description: As specified in Section 3. | o Description: As specified in Section 3. | |||
| o Status: As specified in Section 3. | o Status: As specified in Section 3. | |||
| 9.7. Changes compared to RFC5843 | 12.9. Changes compared to RFC5843 | |||
| The status has been updated to "obsoleted" for both "SHA" and "MD5", | The status of "MD5" has been updated to "deprecated", and its | |||
| and their descriptions states that those algorithms are NOT | description states that this algorithm MUST NOT be used. | |||
| RECOMMENDED. | ||||
| The status for all other algorithms have been updated to "standard". | The status of "SHA" has been updated to "obsoleted", and its | |||
| description states that this algorithm is NOT RECOMMENDED. | ||||
| The status for "CRC32C" 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. | |||
| 9.8. Want-Digest Header Field Registration | 12.10. Want-Digest Header Field Registration | |||
| This section registers the "Want-Digest" header field in the | This section registers the "Want-Digest" header field in the | |||
| "Permanent Message Header Field Names" registry ([RFC3864]). | "Permanent Message Header Field Names" registry ([RFC3864]). | |||
| Header field name: "Want-Digest" | Header field name: "Want-Digest" | |||
| Applicable protocol: http | Applicable protocol: http | |||
| Status: standard | Status: standard | |||
| Author/Change controller: IETF | Author/Change controller: IETF | |||
| Specification document(s): Section 4.1 of this document | Specification document(s): Section 4.1 of this document | |||
| 9.9. Digest Header Field Registration | 12.11. Digest Header Field Registration | |||
| This section registers the "Digest" header field in the "Permanent | This section registers the "Digest" header field in the "Permanent | |||
| Message Header Field Names" registry ([RFC3864]). | Message Header Field Names" registry ([RFC3864]). | |||
| Header field name: "Digest" | Header field name: "Digest" | |||
| Applicable protocol: http | Applicable protocol: http | |||
| Status: standard | Status: standard | |||
| Author/Change controller: IETF | Author/Change controller: IETF | |||
| Specification document(s): Section 4.2 of this document | Specification document(s): Section 4.2 of this document | |||
| 10. References | 13. References | |||
| 10.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", | Institute, "MD5 Vulnerable to collision attacks", December | |||
| December 2008, <https://www.kb.cert.org/vuls/id/836068/>. | 2008, <https://www.kb.cert.org/vuls/id/836068/>. | |||
| [FIPS180-1] | ||||
| Department of Commerce, National., "NIST FIPS 180-1, | ||||
| Secure Hash Standard", April 1995, | ||||
| <http://csrc.nist.gov/fips/fip180-1.txt>. | ||||
| [FIPS180-3] | ||||
| Department of Commerce, National., "NIST FIPS 180-3, | ||||
| Secure Hash Standard", October 2008, | ||||
| <https://csrc.nist.gov/csrc/media/publications/fips/180/3/ | ||||
| archive/2008-10-31/documents/fips180-3_final.pdf>. | ||||
| [IACR-2019-459] | [IACR-2019-459] | |||
| Inria, France; Nanyang Technological University, | Leurent, G. and T. Peyrin, "From Collisions to Chosen- | |||
| Singapore; Temasek Laboratories, Singapore, ., "From | Prefix Collisions Application to Full SHA-1", May 2019, | |||
| Collisions to Chosen-Prefix Collisions Application to Full | <https://eprint.iacr.org/2019/459.pdf>. | |||
| SHA-1", May 2019, <https://eprint.iacr.org/2019/459.pdf>. | ||||
| [NIST800-32] | [NIST800-32] | |||
| Department of Commerce, National., "Introduction to Public | National Institute of Standards and Technology, U.S. | |||
| Key Technology and the Federal PKI Infrastructure", | Department of Commerce, "Introduction to Public Key | |||
| February 2001, | Technology and the Federal PKI Infrastructure", February | |||
| <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, | |||
| <https://www.rfc-editor.org/info/rfc1321>. | <https://www.rfc-editor.org/info/rfc1321>. | |||
| [RFC1950] Deutsch, P. and J-L. Gailly, "ZLIB Compressed Data Format | ||||
| Specification version 3.3", RFC 1950, | ||||
| DOI 10.17487/RFC1950, May 1996, | ||||
| <https://www.rfc-editor.org/info/rfc1950>. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC3174] Eastlake 3rd, D. and P. Jones, "US Secure Hash Algorithm 1 | ||||
| (SHA1)", RFC 3174, DOI 10.17487/RFC3174, September 2001, | ||||
| <https://www.rfc-editor.org/info/rfc3174>. | ||||
| [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 | ||||
| Transmission Protocol (SCTP) Checksum Change", RFC 3309, | ||||
| DOI 10.17487/RFC3309, September 2002, | ||||
| <https://www.rfc-editor.org/info/rfc3309>. | ||||
| [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | |||
| Procedures for Message Header Fields", BCP 90, RFC 3864, | Procedures for Message Header Fields", BCP 90, RFC 3864, | |||
| DOI 10.17487/RFC3864, September 2004, | DOI 10.17487/RFC3864, September 2004, | |||
| <https://www.rfc-editor.org/info/rfc3864>. | <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", | ||||
| RFC 4960, DOI 10.17487/RFC4960, September 2007, | ||||
| <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, | |||
| DOI 10.17487/RFC5234, January 2008, | DOI 10.17487/RFC5234, January 2008, | |||
| <https://www.rfc-editor.org/info/rfc5234>. | <https://www.rfc-editor.org/info/rfc5234>. | |||
| [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", | ||||
| RFC 5789, DOI 10.17487/RFC5789, March 2010, | ||||
| <https://www.rfc-editor.org/info/rfc5789>. | ||||
| [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 | ||||
| (SHA and SHA-based HMAC and HKDF)", RFC 6234, | ||||
| DOI 10.17487/RFC6234, May 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6234>. | ||||
| [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Message Syntax and Routing", | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
| RFC 7230, DOI 10.17487/RFC7230, June 2014, | RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7230>. | <https://www.rfc-editor.org/info/rfc7230>. | |||
| [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | |||
| DOI 10.17487/RFC7231, June 2014, | DOI 10.17487/RFC7231, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7231>. | <https://www.rfc-editor.org/info/rfc7231>. | |||
| skipping to change at page 20, line 18 ¶ | skipping to change at page 27, line 46 ¶ | |||
| <https://www.rfc-editor.org/info/rfc7233>. | <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>. | |||
| [UNIX] The Open Group, ., "The Single UNIX Specification, Version | [UNIX] The Open Group, "The Single UNIX Specification, Version 2 | |||
| 2 - 6 Vol Set for UNIX 98", February 1997. | - 6 Vol Set for UNIX 98", February 1997. | |||
| 10.2. Informative References | 13.2. Informative References | |||
| [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", | ||||
| RFC 5789, DOI 10.17487/RFC5789, March 2010, | ||||
| <https://www.rfc-editor.org/info/rfc5789>. | ||||
| [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>. | |||
| [SRI] Akhawe, D., Braun, F., Marier, F., and J. Weinberger, | [SRI] Akhawe, D., Braun, F., Marier, F., and J. Weinberger, | |||
| "Subresource Integrity", June 2016. | "Subresource Integrity", W3C Recommendation REC-SRI- | |||
| 20160623, June 2016, | ||||
| <https://www.w3.org/TR/2016/REC-SRI-20160623/>. | ||||
| 10.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://tools.ietf.org/html/rfc7231#section-3.1.2.1 | |||
| [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 | |||
| Appendix A. Change Log | [10] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| RFC EDITOR PLEASE DELETE THIS SECTION. | [11] https://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml | |||
| Appendix B. FAQ | Appendix A. FAQ | |||
| 1. Why remove all references to content-md5? | 1. Why remove all references to content-md5? | |||
| Those were unnecessary to understanding and using this spec. | Those were unnecessary to understanding and using this spec. | |||
| 2. Why remove references to instance manipulation? | 2. Why remove references to instance manipulation? | |||
| 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? | |||
| The PATCH verb brings some complexities (eg. about representation | See Section 5. | |||
| metadata headers, patch document format, ...), | ||||
| * PATCH entity-headers apply to the patch document and MUST NOT | ||||
| be applied to the target resource, see [RFC5789], Section 2. | ||||
| * servers shouldn't assume PATCH semantics for generic media | ||||
| types like "application/json" but should instead use a proper | ||||
| content-type, eg [RFC7396] | ||||
| * a "200 OK" response to a PATCH request would contain the | ||||
| digest of the patched item, and the etag of the new object. | ||||
| This behavior - tighly coupled to the application logic - | ||||
| gives the client low probability of guessing the actual | ||||
| outcome of this operation (eg. concurrent changes, ...) | ||||
| 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? | |||
| skipping to change at page 22, line 4 ¶ | skipping to change at page 29, line 29 ¶ | |||
| 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 | We allow to use the "Want-Digest" in responses to advertise the | |||
| supported digest-algorithms and the inability to accept requests | supported digest-algorithms and the inability to accept requests | |||
| with unsupported digest-algorithms. | 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 and | |||
| ID-SHA-512 which allows to send a checksum of a resource | ID-SHA-512 which allows to send a checksum of a resource | |||
| representation with no content codings applied. | representation with no content codings applied. | |||
| 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 | ||||
| _RFC Editor: Please remove this section before publication._ | ||||
| How can I generate and validate the Digest values shown in the | ||||
| examples throughout this document? | ||||
| The following python3 code can be used to generate digests for json | ||||
| objects using SHA algorithms for a range of encodings. Note that | ||||
| these are formatted as base64. This function could be adapted to | ||||
| other algorithms and should take into account their specific | ||||
| formatting rules. | ||||
| import base64, json, hashlib, brotli | ||||
| def digest(item, encoding=lambda x: x, algorithm=hashlib.sha256): | ||||
| json_bytes = json.dumps(item).encode() | ||||
| content_encoded = encoding(json_bytes) | ||||
| checksum_bytes = algorithm(content_encoded).digest() | ||||
| return base64.encodebytes(checksum_bytes).strip() | ||||
| item = {"hello": "world"} | ||||
| print("Identity encoding, sha256", digest(item)) | ||||
| # Out: Identity encoding, sha256 4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo= | ||||
| print("Brotli encoding, sha256", digest(item, encoding=brotli.compress)) | ||||
| # Out: Brotli encoding, sha256 4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo= | ||||
| print("Identity encoding, sha512", digest(item, algorithm=hashlib.sha512)) | ||||
| # Out: Identity encoding, sha512 b'WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm+AbwAgBWnrIiYllu7BNNyealdVLvRwE\nmTHWXvJwew==\n' | ||||
| Changes | ||||
| _RFC Editor: Please remove this section before publication._ | ||||
| D.1. Since draft-ietf-httpbis-digest-headers-00 | ||||
| o Align title with document name | ||||
| o Add id-sha-* algorithm examples #880 | ||||
| o Reference [RFC6234] and [RFC3174] instead of FIPS-1 | ||||
| o Deprecate MD5 | ||||
| o Obsolete ADLER-32 but don't forbid it #828 | ||||
| o Update CRC32C value in IANA table #828 | ||||
| o Use when acting on resources (POST, PATCH) #853 | ||||
| o Added Relationship with SRI, draft Use Cases #868, #971 | ||||
| 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. 148 change blocks. | ||||
| 305 lines changed or deleted | 708 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/ | ||||