完成 TLS 1.0 通訊協定中的訊息
完成訊息會在變更加密規格訊息之後立即傳送,以驗證金鑰交換和驗證程式的成功。 TLS 1.0 通訊協定中的完成訊息是使用 虛擬隨機函 式 (PRF) 搭配 主要金鑰、標籤和種子作為輸入來計算。 PRF 會產生任意長度的輸出。 下列方法是用來產生 TLS 1.0 完成訊息中使用的 PRF 輸出。
使用CryptCreateHash產生 PRF雜湊控制碼,並將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);