Fertig stellen von Nachrichten im TLS 1.0-Protokoll
Eine Abschlussmeldung wird unmittelbar nach einer Änderungsverschlüsselungsspezifikation gesendet, um den Erfolg von Schlüsselaustausch- und Authentifizierungsprozessen zu überprüfen. Die Fertig stellenden Nachrichten im TLS 1.0-Protokoll werden mithilfe der Pseudo-Random Function (PRF) mit dem Hauptschlü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-Abschlussnachrichten verwendet wird.
Ein PRF-Hashhandl wird mithilfe von CryptCreateHash generiert, bei dem der Wert der _ ALG-ID auf CALG TLS1PRF und das Handle für den Hauptschlüssel festgelegt ist, der im _ hKey-Parameter übergeben wird. Die Bezeichnungs- und Startwerte werden auf dem Hashhandling 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 HP HASHVAL im _ dwParam-Parameter auf, um die PRF-Daten abzurufen, die in die Abschlussmeldung eingeschlossen werden sollen. Beim Aufruf von CryptGetHashParam muss die Protokoll-Engine angeben, wie viele Bytes von Daten PRF erzeugt werden. Dies erfolgt im pdwDataLen-Parameter, und die resultierenden Daten werden im Puffer platziert, auf den der pbData-Parameter zeigt.
Im Folgenden finden Sie den typischen Quellcode für diese Protokoll-Engine:
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);