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

7.2. Output from Key Exchange (鍵交換からの出力)

7.2. Output from Key Exchange (鍵交換からの出力)

鍵交換は 2 つの値を生成する: 共有秘密 K と交換ハッシュ H。暗号化と認証の鍵はこれらから導出される。最初の鍵交換からの交換ハッシュ H は, さらにセッション識別子として使用され, これはこの接続の一意の識別子である。これは, 秘密鍵の所有の証明として署名されるデータの一部として認証方法によって使用される。一度計算されると, セッション識別子は, 後で鍵が再交換されても変更されない。

各鍵交換方法は, 鍵交換で使用されるハッシュ関数を指定する。鍵導出では同じハッシュアルゴリズムを使用しなければならない (MUST)。ここでは HASH と呼ぶ。

暗号化鍵は, 既知の値と K の HASH として次のように計算されなければならない (MUST):

  • クライアントからサーバーへの初期 IV: HASH(K || H || "A" || session_id)
  • サーバーからクライアントへの初期 IV: HASH(K || H || "B" || session_id)
  • クライアントからサーバーへの暗号化鍵: HASH(K || H || "C" || session_id)
  • サーバーからクライアントへの暗号化鍵: HASH(K || H || "D" || session_id)
  • クライアントからサーバーへの完全性鍵: HASH(K || H || "E" || session_id)
  • サーバーからクライアントへの完全性鍵: HASH(K || H || "F" || session_id)

鍵データはハッシュ出力の先頭から取得しなければならない (MUST)。必要なだけのバイトがハッシュ値の先頭から取得される。必要な鍵長が HASH の出力よりも長い場合, K と H とこれまでの鍵全体の連結の HASH を計算し, 結果のバイト (HASH が生成する分だけ) を鍵に追加することによって鍵が拡張される。このプロセスは, 十分な鍵マテリアルが利用可能になるまで繰り返される; 鍵はこの値の先頭から取得される。言い換えれば:

K1 = HASH(K || H || X || session_id)   (X は例えば "A")
K2 = HASH(K || H || K1)
K3 = HASH(K || H || K1 || K2)
...
key = K1 || K2 || K3 || ...

このプロセスは, K のエントロピー量が HASH の内部状態サイズよりも大きい場合, エントロピーを失う。