Freigeben über


Fertigstellen von Nachrichten im TLS 1.0-Protokoll

Unmittelbar nach einer Änderungsverschlüsselungsspezifikationsmeldung wird eine Fertigmeldung gesendet, um den Erfolg von Schlüsselaustausch- und Authentifizierungsprozessen zu überprüfen. Die Endnachrichten im TLS 1.0-Protokoll werden mithilfe der Pseudo-Random Function (PRF) mit dem master Schlüssel, einer Bezeichnung und einem Startwert als Eingabe berechnet. PRF erzeugt eine Ausgabe beliebiger Länge. Die folgende Methode wird verwendet, um die PRF-Ausgabe zu generieren, die in TLS 1.0-Abschlussmeldungen verwendet wird.

Ein PRF-Hashhandle wird mit CryptCreateHash generiert, wobei der ALG_ID Wert auf CALG_TLS1PRF und das Handle für den im hKey-Parameter übergebenen master Schlüssels festgelegt ist. Die Bezeichnungs- und Ausgangswerte werden im Hashhandle mithilfe der Werte HP_TLS1PRF_LABEL bzw. HP_TLS1PRF_SEED im dwParam-Parameter mit der CryptSetHashParam-Funktion festgelegt. Schließlich ruft die Protokoll-Engine die Funktion CryptGetHashParam mit dem Wert auf, der im dwParam-Parameter HP_HASHVAL, um die PRF-Daten abzurufen, die in die Endmeldung eingeschlossen werden sollen. Beim Aufruf von CryptGetHashParam muss die Protokoll-Engine angeben, wie viele Byte von PRF erzeugt werden sollen. Dies erfolgt im pdwDataLen-Parameter , und die resultierenden Daten werden im Puffer platziert, auf den der pbData-Parameter verweist.

Im Folgenden ist der typische Quellcode für diese Protokoll-Engine aufgeführt:

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