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 autenticazione. I messaggi di fine nel protocollo TLS 1.0 vengono calcolati usando la funzione pseudo-casuale (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 handle hash PRF usando CryptCreateHash con il valore ALG_ID impostato su CALG_TLS1PRF e l'handle per la chiave master passata nel parametro hKey . I valori di etichetta e valore di inizializzazione vengono impostati nell'handle hash usando rispettivamente i valori HP_TLS1PRF_LABEL e HP_TLS1PRF_SEED nel parametro dwParam con la funzione CryptSetHashParam . 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 il prf produrrà. 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);