次の方法で共有


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);