* 仕様書

[REFS[
- [3] '''[CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-3.4>'''
- [41] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-4>
]REFS]

* 意味

[5] [[利用者]]が[[合言葉]]を知っていることを示すものです [SRC[>>3]]。

* 構文

[4] [[十六進数字]]列です [SRC[>>3]]。

[7] [[字句]]ではなく[[引用文字列]]を[[生成]]しなければ[['''なりません''']] [SRC[>>3]]。

* 値の算出

[8] [CODE(HTTP)@en[[[response]]]] [[引数]]の値は、
[CODE(HTTP)@en[[[qop]]]] [[引数]]の値が [CODE[[[auth]]]] や
[CODE[[[auth-int]]]] の時、次の通り定義されています [SRC[>>3]]。

[FIG(steps)[
= [11] [VAR[[[nonce]]]]、[VAR[[[nc]]]]、[VAR[[[cnonce]]]]、[VAR[[[qop]]]]
を、それぞれ同名の[[引数]]の値 ([[引用文字列]]は、その表す値) に設定します。
= [10] [VAR[値]]を、 [VAR[[[nonce]]]]、[CODE[[[:]]]]、[VAR[[[nc]]]]、
[CODE[[[:]]]]、[VAR[[[cnonce]]]]、[CODE[[[:]]]]、[VAR[[[qop]]]]、
[CODE[[[:]]]]、[VAR[[[H]]]] ([VAR[[[A2]]]]) を連結した値に設定します。
= [9] [VAR[[[KD]]]] ( [VAR[[[H]]]] ([VAR[[[A1]]]]), [VAR[値]] ) の結果を返します。
]FIG]

[42] 実際には、それを更に[[十六進数]]の[[小文字]]に変換したものが使われるようです。

;; [43] [[RFC 7616]] にはなぜか明確な説明はありません。例示はありますが...
[[RFC 2617]] 時代は [[ABNF]] 構文で曖昧に暗示されていました [SRC[>>1]] が、
[[RFC 7616]] はなぜかそれすら含めていません。

[13] [DFN[[VAR[[[A1]]]]]] は、次のように定義されています [SRC[>>3]]。

[FIG(steps)[
= [14] [VAR[アルゴリズム]]を、 [CODE(HTTP)@en[[[algorithm]]]]
[[引数]]の値に設定します。
= [16] [VAR[利用者名]]を、 [CODE(HTTP)@en[[[username]]]] [[引数]]の値
([[引用文字列]]の表す値) に設定します。
ただし、 [CODE[[[userhash]]]] [[引数]]の指定に従い[[ハッシュ化]]する場合でも、
[[ハッシュ化]]前の値を用います。
= [19] [VAR[realm]] を、 [CODE(HTTP)@en[[[realm]]]] [[引数]]の値
([[引用文字列]]の表す値) に設定します。
= [17] [VAR[合言葉]]を、適切な[[合言葉]]に設定します。
= [15] [VAR[アルゴリズム]]が [CODE[[[-sess]]]] で終わらないものなら、
== [18] [VAR[利用者名]]、[CODE[[[:]]]]、[VAR[realm]]、[CODE[[[:]]]]、[VAR[合言葉]]
を連結した値を返します。
= [20] それ以外なら、
== [21] [VAR[値]]を、 [VAR[利用者名]]、[CODE[[[:]]]]、[VAR[realm]]、
[CODE[[[:]]]]、[VAR[合言葉]]を連結したものに設定します。
== [23] [VAR[nonce-prime]] を、 [[challenge]] の [CODE(HTTP)@en[[[nonce]]]]
[[引数]]の値 ([[引用文字列]]の表す値) に設定します。
== [24] [VAR[cnonce-prime]] を、 [[credentials]] の [CODE(HTTP)@en[[[cnonce]]]]
[[引数]]の値 ([[引用文字列]]の表す値) に設定します。
== [22] [CODE[[VAR[[[H]]]] ([VAR[値]])]]、[CODE[[[:]]]]、
[VAR[nonce-prime]]、[CODE[[[:]]]]、[VAR[cnonce-prime]] を連結したものを返します。
]FIG]

;; [40] [VAR[利用者名]]の[[文字コード]]は、 [CODE[[[charset]]]]
[[引数]]の指定に従います [SRC[>>41]]。

[25] [DFN[[VAR[A2]]]] は、次のように定義されています [SRC[>>3]]。

[FIG(steps)[
= [31] [VAR[メソッド]]を、[[要求]]の[F[[[メソッド]]]]に設定します。
= [32] [VAR[要求対象]]を、[[要求]]の[F[[[要求対象]]]]に設定します。
= [35] [[credentials]] に [CODE[[[uri=""]]]] [[引数]]があって、
値が[VAR[要求対象]]と同じ[[資源]]を表していなければ、
== [37] 攻撃かもしれませんから、[[記録]]して構いません。
== [36] [CODE[[[400]]]] [[応答]]を返す[['''べきです''']]。
= [33] [VAR[実体本体]]を、[[要求]]の [F[[[payload body]]]] に設定します。
= [26] [VAR[[[qop]]]] を、 [CODE(HTTP)@en[[[qop]]]] [[引数]]の値に設定します。
= [27] [VAR[qop]] が [CODE[[[auth]]]] か未指定なら、
== [28] [VAR[メソッド]]、[CODE[[[:]]]]、[VAR[要求対象]]を連結したものを返します。
= [29] [VAR[qop]] が [CODE[[[auth-int]]]] なら、
== [30] [VAR[メソッド]]、[CODE[[[:]]]]、[VAR[要求対象]]、
[CODE[[[:]]]]、[CODE[[VAR[[[H]]]] ([VAR[実体本体]])]] を連結したものを返します。
]FIG]

;; [38] [[要求対象]]と [CODE[[[uri=""]]]] の比較の方法は明確ではありません。
単純に[[要求URL]]と指定された値の比較で良いのか、
[[サーバー]]依存の比較で良いのか不明です。[[プロキシ]]による[[改竄]]
(意図的にせよそうでないにせよ。) を防ぐのが目的の検査ですから、
厳し目の方が良いのかもしれません。
([[要求対象]]直接の比較ではなく[[実効要求URL]]と比較するべきと思われますが、
[[RFC]] はそれすら明確にしていません。)

;; [12] [CODE[[VAR[[[H]]]] ()]] と [CODE[[VAR[[[KD]]]] ()]] は、
[[ハッシュアルゴリズム]]に依存して決まる[[関数]]です。

;; [39] [CODE[[[rspauth]]]] [[引数]]の [VAR[[[A2]]]] と微妙に違います。

* 文脈

[6] [[ダイジェスト認証]]の [[credentials]] の [CODE(ABNF)@en[[[auth-param]]]] として使うことができます [SRC[>>3]]。

* 歴史

[REFS[
- [2] [CITE@en[RFC 2069 - An Extension to HTTP : Digest Access Authentication]] ([TIME[2012-02-26 10:05:21 +09:00]] 版) <http://tools.ietf.org/html/rfc2069#section-2.1.2>
- [1] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#section-3.2.2>
]REFS]

[34] [[RFC 7616]] は値の定義で [CODE[[[request-uri]]]] を使っていますが、
その意味は規定していません。 [CODE[[[request-target]]]] の意味は規定されていますが、
使われていません。前の版の [[RFC 2617]] では [CODE[[[request-uri]]]]
の意味が定義されていて、それに相当する部分が [[RFC 7616]] では
[CODE[[[request-target]]]] に差し替わっています。これは [[RFC 723x]]
における用語の変更に追随しようとして、中途半端になっているようです。

;; 現時点で[[RFC Errata]]に報告はないみたいです。 [TIME[2015-12-30T14:46:36.400Z]]