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