Compartilhar via


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