Compartir a través de


Finalizar mensajes en el protocolo TLS 1.0

Un mensaje de finalización se envía inmediatamente después de un mensaje de especificación de cifrado de cambios para comprobar que el intercambio de claves y los procesos de autenticación se han realizado correctamente. Los mensajes finales del protocolo TLS 1.0 se calculan mediante la función pseudoaleatoria (PRF) con la clave maestra, una etiqueta y una inicialización como entrada. PRF genera una salida de longitud arbitraria. El método siguiente se usa para generar la salida PRF usada en los mensajes de finalización de TLS 1.0.

Se genera un identificador hash PRF mediante CryptCreateHash con el valor de ALG_ID establecido en CALG_TLS1PRF y el identificador de la clave maestra pasada en el parámetro hKey . Los valores de etiqueta y inicialización se establecen en el identificador hash mediante los valores HP_TLS1PRF_LABEL y HP_TLS1PRF_SEED, respectivamente, en el parámetro dwParam con la función CryptSetHashParam . Por último, el motor de protocolo llama a la función CryptGetHashParam con el valor HP_HASHVAL en el parámetro dwParam para recuperar los datos PRF que se incluirán en el mensaje de finalización. Al realizar la llamada a CryptGetHashParam, el motor de protocolo debe especificar cuántos bytes de datos producirá PRF. Esto se hace en el parámetro pdwDataLen y los datos resultantes se colocan en el búfer al que apunta el parámetro pbData .

A continuación se muestra el código fuente típico de este motor 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);