Terminer les messages dans le protocole TLS 1.0
Un message de fin est envoyé immédiatement après un message de spécification de chiffrement de modification pour vérifier la réussite des processus d’échange de clés et d’authentification. Les messages de fin dans le protocole TLS 1.0 sont calculés à l’aide de la fonction pseudo-aléatoire (PRF) avec la clé master, une étiquette et une valeur initiale comme entrée. PRF produit une sortie de longueur arbitraire. La méthode suivante est utilisée pour générer la sortie PRF utilisée dans les messages de fin TLS 1.0.
Un handle de hachage PRF est généré à l’aide de CryptCreateHash avec la valeur ALG_ID définie sur CALG_TLS1PRF et le handle sur la clé master passée dans le paramètre hKey. Les valeurs d’étiquette et de départ sont définies sur le handle de hachage à l’aide des valeurs HP_TLS1PRF_LABEL et HP_TLS1PRF_SEED, respectivement, dans le paramètre dwParam avec la fonction CryptSetHashParam . Enfin, le moteur de protocole appelle la fonction CryptGetHashParam avec la valeur HP_HASHVAL dans le paramètre dwParam pour récupérer les données PRF à inclure dans le message de fin. Lors de l’appel à CryptGetHashParam, le moteur de protocole doit spécifier le nombre d’octets de données générés par PRF. Cette opération est effectuée dans le paramètre pdwDataLen et les données obtenues sont placées dans la mémoire tampon pointée par le paramètre pbData .
Voici le code source classique pour ce moteur de protocole :
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);