Completare i messaggi nel protocollo TLS 1.0
Un messaggio di fine viene inviato immediatamente dopo un messaggio di specifica di crittografia delle modifiche per verificare l'esito positivo dei processi di scambio di chiavi e di autenticazione. I messaggi di fine nel protocollo TLS 1.0 vengono calcolati usando Pseudo-Random Funzione (PRF) con la chiave master , un'etichetta e un valore di inizializzazione come input. Prf produce un output di lunghezza arbitraria. Il metodo seguente viene usato per generare l'output PRF usato nei messaggi di fine TLS 1.0.
Viene generato un handlehashPRF usando CryptCreateHash con il valore ALG_ID impostato su CALG_TLS1PRF e l'handle alla chiave master passata nel parametro hKey. I valori label e seed vengono impostati nell'handle hash usando rispettivamente i valori HP_TLS1PRF_LABEL e HP_TLS1PRF_SEED nel parametro dwParam con la funzioneCryptSetHashParam. Infine, il motore di protocollo chiama la funzione CryptGetHashParam con il valore HP_HASHVAL nel parametro dwParam per recuperare i dati PRF da includere nel messaggio di fine. Quando si effettua la chiamata a CryptGetHashParam, il motore di protocollo deve specificare il numero di byte di dati che verrà generato da PRF. Questa operazione viene eseguita nel parametro pdwDataLen e i dati risultanti vengono inseriti nel buffer a cui punta il parametro pbData.
Di seguito è riportato il codice sorgente tipico per questo motore di protocollo:
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);