メインコンテンツまでスキップ

2. HMAC-based Key Derivation Function (HMAC ベースの鍵導出関数)

2. HMAC-based Key Derivation Function (HMAC ベースの鍵導出関数)

2.1. Notation (表記法)

HMAC-Hash は, ハッシュ関数 'Hash' でインスタンス化された HMAC 関数 [HMAC] を表します。HMAC には常に2つの引数があります: 最初は鍵で, 2番目は入力 (またはメッセージ) です。(抽出ステップでは, 'IKM' は HMAC 鍵としてではなく, HMAC 入力として使用されることに注意してください。)

メッセージが複数の要素で構成される場合, 2番目の引数で連結 (| で表記) を使用します。例えば, HMAC(K, elem1 | elem2 | elem3) です。

この文書のキーワード "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY"、"OPTIONAL" は, [KEYWORDS] に記載されているとおりに解釈されるものとします。

2.2. Step 1: Extract (ステップ1: 抽出)

HKDF-Extract(salt, IKM) -> PRK

Options (オプション):

  • Hash: ハッシュ関数; HashLen はハッシュ関数出力の長さをオクテット単位で表します

Inputs (入力):

  • salt: オプションのソルト値 (非秘密のランダム値); 提供されない場合は, HashLen 個のゼロの文字列に設定されます。
  • IKM: 入力鍵材料 (input keying material)

Output (出力):

  • PRK: 疑似ランダム鍵 (pseudorandom key, HashLen オクテット)

出力 PRK は次のように計算されます:

PRK = HMAC-Hash(salt, IKM)

2.3. Step 2: Expand (ステップ2: 拡張)

HKDF-Expand(PRK, info, L) -> OKM

Options (オプション):

  • Hash: ハッシュ関数; HashLen はハッシュ関数出力の長さをオクテット単位で表します

Inputs (入力):

  • PRK: 少なくとも HashLen オクテットの疑似ランダム鍵 (通常は抽出ステップからの出力)
  • info: オプションのコンテキストおよびアプリケーション固有情報 (長さゼロの文字列でも可)
  • L: 出力鍵材料の長さ (オクテット単位) (<= 255*HashLen)

Output (出力):

  • OKM: 出力鍵材料 (output keying material, L オクテット)

出力 OKM は次のように計算されます:

N = ceil(L/HashLen)
T = T(1) | T(2) | T(3) | ... | T(N)
OKM = first L octets of T

ここで:

T(0) = empty string (zero length)
T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)
T(2) = HMAC-Hash(PRK, T(1) | info | 0x02)
T(3) = HMAC-Hash(PRK, T(2) | info | 0x03)
...

(各 T(n) の末尾に連結される定数は単一のオクテットです。)