TLS 1.0 プロトコルでメッセージを終了する
キー交換と認証プロセスの成功を確認するために、変更暗号仕様メッセージの直後に完了メッセージが送信されます。 TLS 1.0 プロトコルの終了メッセージは、マスター キー、ラベル、シードを入力として使用して擬似ランダム関数 (PRF) を使用して計算されます。 PRF は、任意の長さの出力を生成します。 TLS 1.0 完了メッセージで使用される PRF 出力を生成するには、次の方法を使用します。
PRF ハッシュ ハンドルは 、CryptCreateHash を使用して生成され、 ALG_ID 値は CALG_TLS1PRF に設定され、ハンドルは hKey パラメーターで渡されたマスター キーに設定されます。 ラベルとシード値は、CryptSetHashParam 関数を使用して dwParam パラメーターにそれぞれHP_TLS1PRF_LABEL値とHP_TLS1PRF_SEED値を使用してハッシュ ハンドルに設定されます。 最後に、プロトコル エンジンは、dwParam パラメーターにHP_HASHVAL値を指定して関数 CryptGetHashParam を呼び出して、完了メッセージに含める PRF データを取得します。 CryptGetHashParam の呼び出しを行う場合、プロトコル エンジンは PRF が生成するデータのバイト数を指定する必要があります。 これは pdwDataLen パラメーターで行われ、結果のデータは pbData パラメーターが指すバッファーに配置されます。
このプロトコル エンジンの一般的なソース コードを次に示します。
CRYPT_DATA_BLOB Data;
HCRYPTHASH hFinishHash;
BYTE rgbFinishPRF[12];
BYTE rgbCliHashOfHandshakes[36];
//------------------------------------------------------------
// get client finish message
CryptCreateHash(
hProv,
CALG_TLS1PRF,
hMasterKey,
0,
&hFinishHash);
Data.pbData = (BYTE*)"client finished";
Data.cbData = 15;
CryptSetHashParam(
hFinishHash,
HP_TLS1PRF_LABEL,
(BYTE*)&Data,
0);
Data.pbData = rgbCliHashOfHandshakes;
Data.cbData = sizeof(rgbCliHashOfHandshakes);
CryptSetHashParam(
hFinishHash,
HP_TLS1PRF_SEED,
(BYTE*)&Data,
0);
cbFinishPRF = sizeof(rgbFinishPRF);
CryptGetHashParam(
hFinishHash,
HP_HASHVAL,
rgbFinishPRF,
&cbFinishPRF,
0);
CryptDestroyHash(hFinishHash);