5. HMAC and the Pseudorandom Function (HMACと擬似乱数関数)
TLSレコード層は、メッセージ完全性を保護するために鍵付きメッセージ認証コード (MAC, Message Authentication Code) を使用します。本文書で定義されている暗号スイートは、[HMAC] に記載されているHMACと呼ばれる構造を使用しており、これはハッシュ関数に基づいています。必要に応じて、他の暗号スイートは独自のMAC構造を定義してもよい (MAY) です。
さらに、鍵生成または検証の目的で、秘密をデータブロックに拡張する構造が必要です。この擬似乱数関数 (PRF, pseudorandom function) は、秘密、シード、および識別ラベルを入力として受け取り、任意の長さの出力を生成します。
本セクションでは、HMACに基づく1つのPRFを定義します。SHA-256ハッシュ関数を使用したこのPRFは、本文書で定義されているすべての暗号スイート、およびTLS 1.2がネゴシエートされた場合の本文書より前に公開されたTLS文書の暗号スイートに使用されます。新しい暗号スイートはPRFを明示的に指定しなければならず (MUST)、一般的にはSHA-256またはより強力な標準ハッシュ関数を使用したTLS PRFを使用すべきです (SHOULD)。
まず、単一のハッシュ関数を使用して秘密とシードを任意の量の出力に拡張するデータ拡張関数P_hash(secret, data)を定義します:
P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
HMAC_hash(secret, A(2) + seed) +
HMAC_hash(secret, A(3) + seed) + ...
ここで + は連結を示します。
A()は次のように定義されます:
A(0) = seed
A(i) = HMAC_hash(secret, A(i-1))
P_hashは、必要な量のデータを生成するために必要な回数だけ反復できます。例えば、P_SHA256を使用して80バイトのデータを作成する場合、A(3)まで3回反復する必要があり、96バイトの出力データを作成します。その後、最後の反復の最後の16バイトが破棄され、80バイトの出力データが残ります。
TLSのPRFは、次のように秘密にP_hashを適用することによって作成されます:
PRF(secret, label, seed) = P_<hash>(secret, label + seed)
ラベル (label) はASCII文字列です。長さバイトや末尾のnull文字なしで、指定された正確な形式で含める必要があります。例えば、ラベル「slithy toves」は、次のバイトをハッシュすることによって処理されます:
73 6C 69 74 68 79 20 74 6F 76 65 73