Concluir mensagens no protocolo TLS 1.0
Uma mensagem de término é enviada imediatamente após uma mensagem de especificação de criptografia de alteração para verificar o sucesso dos processos de troca e autenticação de chaves. As mensagens de término no protocolo TLS 1.0 são calculadas usando PRF (Função Pseudo-Aleatória) com a chave master, um rótulo e uma semente como entrada. O PRF produz uma saída de comprimento arbitrário. O método a seguir é usado para gerar a saída prf usada em mensagens de término do TLS 1.0.
Um identificador de hash PRF é gerado usando CryptCreateHash com o valor ALG_ID definido como CALG_TLS1PRF e o identificador para a chave master passada no parâmetro hKey. Os valores de rótulo e semente são definidos no identificador de hash usando os valores HP_TLS1PRF_LABEL e HP_TLS1PRF_SEED, respectivamente, no parâmetro dwParam com a função CryptSetHashParam . Por fim, o mecanismo de protocolo chama a função CryptGetHashParam com o valor HP_HASHVAL no parâmetro dwParam para recuperar os dados PRF a serem incluídos na mensagem de término. Ao fazer a chamada para CryptGetHashParam, o mecanismo de protocolo deve especificar quantos bytes de dados o PRF produzirá. Isso é feito no parâmetro pdwDataLen e os dados resultantes são colocados no buffer apontado pelo parâmetro pbData .
Veja a seguir o código-fonte típico para este mecanismo de protocolo:
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);