[1] [DFN[[CODE(HTTP)@en[[[Digest:]]]]]] [[ヘッダー]]は、
[[実現値]]の[[ダイジェスト値]]を表します。

;; [6] [[auth-scheme]] の [[Digest]] ([[Digest認証]]) とは関係ありません。

* 仕様書

[REFS[
- [10] [CITE@en[RFC 3230 - Instance Digests in HTTP]] ([TIME[2014-08-31 18:57:37 +09:00]] 版) <http://tools.ietf.org/html/rfc3230#section-4.2>
- [18] '''[CITE@en[RFC 3230 - Instance Digests in HTTP]] ([TIME[2014-08-31 18:57:37 +09:00]] 版) <http://tools.ietf.org/html/rfc3230#section-4.3.2>'''
- [27] [CITE@en[RFC 3230 - Instance Digests in HTTP]] ([TIME[2014-08-31 18:57:37 +09:00]] 版) <http://tools.ietf.org/html/rfc3230#section-5>
- [31] [CITE@en[RFC 6249 - Metalink/HTTP: Mirrors and Hashes]] ([TIME[2014-09-07 22:47:12 +09:00]] 版) <http://tools.ietf.org/html/rfc6249#section-2>
- [33] [CITE@en[RFC 6249 - Metalink/HTTP: Mirrors and Hashes]] ([TIME[2014-09-07 22:47:12 +09:00]] 版) <http://tools.ietf.org/html/rfc6249#section-6>
]REFS]

* 意味

[19] [CODE(HTTP)@en[[[Digest:]]]] [[ヘッダー]]は、[[メッセージ]]によって説明される[[実現値]]の[[ダイジェスト]]を表します [SRC[>>18]]。
なおその[[実現値]]は全体が[[メッセージ本体]]に入っていることもあれば、
一部しか入っていないこともありますし、まったく入っていないこともあります [SRC[>>18]]。

* 構文

[4] [CODE(HTTP)@en[[[Digest:]]]] [[ヘッダー]]の値は、0個以上の[[実現値ダイジェスト]]の[[リスト]]
([CODE(HTTP)[#]]) です [SRC[>>18]]。

[FIG(railroad)[
= ?
== [[実現値ダイジェスト]]
== *
=== [[OWS]]
=== [CODE(HTTP)[[[,]]]]
=== [[OWS]]
=== [[実現値ダイジェスト]]
]FIG]

;; [20] 複数の[[実現値ダイジェスト]]を指定できるのは、
複数の[[利用者]]や[[ブラウザー]]で共有される[[キャッシュ]]などで有用であろうことから
[SRC[>>18]] とされています。

[11] [DFN[[RUBYB[実現値ダイジェスト]@en[instance digest]]]]は、
[[ダイジェストアルゴリズム]]と [CODE(HTTP)[[[=]]]]、
[[ダイジェストアルゴリズム]]の出力によって構成されます [SRC[>>10]]。

[FIG(railroad)[
= [[ダイジェストアルゴリズム]]
= [CODE(HTTP)[[[=]]]]
= アルゴリズムの出力
]FIG]

;; [16] [CODE(HTTP)[[[=]]]] の前後に[[空白]]を挿入できるかは定かではありません。
[[仕様書]]中の例示はすべて[[空白]]を含んでいません。

[28] [[ダイジェストアルゴリズム]]として [CODE(HTTP)@en[[[contentMD5]]]]
を使っては[['''なりません''']] [SRC[>>27]]。

[12] アルゴリズムの出力は、[[メッセージ]]に関連付けられた[[実現値]]全体について計算したものです [SRC[>>10]]。

;; [[実現値]]は、[[実現値操作]]の適用前のものです。[[差分符号化]]や[[範囲]]指定を行う前の状態であって、必ずしも[[メッセージ本体]]として含まれるものとは限りません。

* 文脈

[21] [[送信者]]は、[[受信者]]が[[ダイジェストアルゴリズム]]に対応しているかに関わらず、
[[実現値ダイジェスト]]を送信できます [SRC[>>18]]。

[30] [[Metalink/HTTP]] [[鯖]]は[[実現値ダイジェスト]]を含めなければ[['''なりません''']]
[SRC[>>31]]。
[CODE(HTTP)@en[[[SHA-256]]]] を使わなければ[['''なりません''']]。それ以外も含めても構いません。 [SRC[>>31]]

* 処理

[23] [[受信者]]は、 [CODE(HTTP)@en[[[Digest:]]]] [[ヘッダー]]の一部または全部の[[実現値ダイジェスト]]を無視して構いません [SRC[>>18]]。

[32] [[Metalink/HTTP]] [[クライアント]]は、[[実現値ダイジェスト]]の検証を行わなければ[['''なりません''']] [SRC[>>31]]。

[34] [[実現値ダイジェスト]]が含まれていなければ、[[Metalink/HTTP]]
関連の [CODE(HTTP)@en[[[Link:]]]] [[ヘッダー]]は無視しなければ[['''なりません''']] [SRC[>>33]]。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[7] RFC 3230 (実現値要約) 4.3.2 Digest
]FIGCAPTION]

> The Digest message header field provides a message digest of the
instance described by the message.

[CODE(HTTP)[Digest]] [[メッセージ頭欄]]は、
その[[メッセージ]]が記述する[[実現値]]のメッセージ[[要約]]を提供します。

>
- Digest = "Digest" ":" #(instance-digest)

> The instance described by a message might be fully contained in the
message-body, partially-contained in the message-body, or not at all
contained in the message-body.  The instance is specified by the
Request-URI and any cache-validator contained in the message.

メッセージが記述する実現値は [CODE(ABNF)[[[message-body]]]]
に完全に含まれているかもしれませんし。 [CODE(ABNF)[message-body]]
に部分的に含まれているかもしれませんし、
[CODE(ABNF)[message-body]] に全く含まれていないかもしれません。
実現値は [CODE(ABNF)[[[Request-URI]]]] とメッセージに含まれる任意の
[CODE(ABNF)[[[cache-validator]]]] ([[キャッシュ検証子]]) によって指定されます。

> A Digest header field MAY contain multiple instance-digest values.
This could be useful for responses expected to reside in caches
shared by users with different browsers, for example.

[CODE(HTTP)[Digest]] 頭欄は、複数の [CODE(ABNF)[instance-digest]]
値を含んで'''構いません'''。これは、たとえば異なる[[ブラウザ]]の利用者間で[[キャッシュ]]を共有していると存じていると思われるような応答に有用でしょう。

> A recipient MAY ignore any or all of the instance-digests in a Digest
header field.

受信者は [CODE(HTTP)[Digest]] 頭欄の [CODE(ABNF)[instance-digest]]
の一部または全部を無視して'''構いません'''。

> A sender MAY send an instance-digest using a digest-algorithm without
knowing whether the recipient supports the digest-algorithm, or even
knowing that the recipient will ignore it.

送信者は、受信者がある [CODE(ABNF)[digest-algorithm]]
に対応しているかどうか知らない場合や、あるいは受信者がこれを無視することをしっていた場合ですら、
その [CODE(ABNF)[digest-algorithm]] を使った [CODE(ABNF)[instance-digest]]
を送信して'''構いません'''。

> Examples:
- Digest: md5=HUXZLQLMuI/KZ5KDcJPcOA==
- Digest: SHA=thvDyvhfIqlvFe+A9MYgxAfm1q5=,unixsum=30637
]FIG]

[FIG(quote)[
[FIGCAPTION[
[35] RFC 3230 (実現値要約) 4.2 Instance digests
]FIGCAPTION]

>   An instance digest is the representation of the output of a digest
algorithm, together with an indication of the algorithm used (and any
parameters).

[[実現値要約]]は、[[要約]]算法の出力の表現に、
使用している算法の標示 (と引数) を添えたものです。

>
-       instance-digest = [[digest-algorithm]] "="
<encoded digest output [INS[符号化要約出力]]>

>   The digest is computed on the entire instance associated with the
message.  The instance is a snapshot of the resource prior to the
application of of any instance manipulation or transfer-coding (see
section 3).  The byte order used to compute the digest is the
transmission byte order defined for the content-type of the instance.

要約はメッセージに関連付けられた[[実現値]]全体について計算します。
実現値は[[実現値操作]]や[[転送符号化]]を適用する前の[[資源]]のスナップ写真です
(3章参照)。要約を計算するのに使用する[[バイト順]]は実現値の[[内容型]]で定義されている転送バイト順です。

>      Note: the digest is computed before the application of any
instance manipulation.  If a range or a delta-coding [9] is used,
the computation of the digest after the computation of the range
or delta would not provide a digest useful for checking the
integrity of the reassembled instance.

注意: 算法は実現値操作の適用の前に計算します。
範囲または[[差分符号化]]を使用する時は、
範囲や差分を計算した後に要約を計算するのであっては再組み立てした実現値の整合性を検査するために有用な要約を提供しません。

>   The encoded digest output uses the encoding format defined for the
specific digest-algorithm.  For example, if the digest-algorithm is
"MD5", the encoding is base64; if the digest-algorithm is "UNIXsum",
the encoding is an ASCII string of decimal digits.

符号化要約出力は指定 [CODE(ABNF)[digest-algorithm]]
で定義された符号化書式を使用します。例えば、
[CODE(ABNF)[digest-algorithm]] が [SAMP(HTTP)[MD5]]
なら、符号化は base64 です。 [CODE(ABNF)[digest-algorithm]]
が [SAMP(ABNF)[UNIXsum]] なら、符号化は十進数の [[ASCII]] 文字列です。

>   Examples:
-      MD5=HUXZLQLMuI/KZ5KDcJPcOA==
-      sha=thvDyvhfIqlvFe+A9MYgxAfm1q5=
-      UNIXsum=30637
]FIG]

[22] [CITE@en[RFC 3229 - Delta encoding in HTTP]]
( ([TIME[2014-10-26 21:15:25 +09:00]] 版))
<http://tools.ietf.org/html/rfc3229#section-9>

[9] [[RFC 4229]] は[[IANA登録簿]]に状態「[[標準]]」で登録しています [SRC[>>8]]。

[REFS[
- [8] [CITE@en[RFC 4229 - HTTP Header Field Registrations]] ([TIME[2014-11-02 18:53:20 +09:00]] 版) <http://tools.ietf.org/html/rfc4229#section-2.1.44>
]REFS]

* 実装

[29] [CITE[webdav: add support for RFC-3230 | Review Request | Review Board]]
( ([TIME[2014-11-23 16:19:07 +09:00]] 版))
<https://rb.dcache.org/r/5153/>

* 例

[5] 次のような[[実現値ダイジェスト]]の例があります [SRC[>>10]]。
[FIG(list)[
- [13] [CODE(HTTP)[MD5=HUXZLQLMuI/KZ5KDcJPcOA==]]
- [14] [CODE(HTTP)[sha=thvDyvhfIqlvFe+A9MYgxAfm1q5=]]
- [15] [CODE(HTTP)[UNIXsum=30637]]
]FIG]

[3] 次のような [CODE(HTTP)@en[[[Digest:]]]] [[ヘッダー]]の例があります。
[FIG(list)[
- [24] [CODE(HTTP)[Digest: md5=HUXZLQLMuI/KZ5KDcJPcOA==]] [SRC[>>18]]
- [25] [CODE(HTTP)[Digest: SHA=thvDyvhfIqlvFe+A9MYgxAfm1q5=,unixsum=30637]] [SRC[>>18]]
- [26] [CODE(HTTP)[Digest: SHA-256=MWVkMWQxYTRiMzk5MDQ0MzI3NGU5NDEyZTk5OWY1ZGFmNzgyZTJlODYzYjRjYzFhOTlmNTQwYzI2M2QwM2U2MQ==]] [SRC[[[RFC 5843]] 1.1.]]
]FIG]

* 関連

[2] [[MD5]] を使った[[要約]]を入れる[[頭欄]]として [CODE(HTTP)@en[[[Content-MD5]]]]
があり、[[MIME]] や [[HTTP]] で用いられています。 [CODE(HTTP)@en[[[Digest]]]]
はこれをより一般化したものです。

[17] [CODE(HTTP)@en[[[Content-MD5:]]]] の他、[[ダイジェスト認証]]でも[[ダイジェスト値]]を使いますが、
これらは [[payload body]] に関するものです。それに対して [CODE(HTTP)@en[[[Digest:]]]]
は[[実現値]]に関するものです。

[36] [CITE@en[draft-yasskin-http-origin-signed-responses-02 - Signed HTTP Exchanges]]
([TIME[2018-02-25 17:55:17 +09:00]])
<https://tools.ietf.org/html/draft-yasskin-http-origin-signed-responses-02>