共用方式為


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