Aller au contenu principal

5. HMAC and the Pseudorandom Function (HMAC et la fonction pseudo-aléatoire)

La couche d'enregistrement TLS utilise un code d'authentification de message avec clé (MAC, Message Authentication Code) pour protéger l'intégrité des messages. Les suites de chiffrement définies dans ce document utilisent une construction connue sous le nom de HMAC, décrite dans [HMAC], qui est basée sur une fonction de hachage. D'autres suites de chiffrement PEUVENT définir leurs propres constructions MAC, si nécessaire.

De plus, une construction est nécessaire pour effectuer l'expansion de secrets en blocs de données à des fins de génération ou de validation de clés. Cette fonction pseudo-aléatoire (PRF, pseudorandom function) prend en entrée un secret, une graine et une étiquette d'identification et produit une sortie de longueur arbitraire.

Dans cette section, nous définissons une PRF, basée sur HMAC. Cette PRF avec la fonction de hachage SHA-256 est utilisée pour toutes les suites de chiffrement définies dans ce document et dans les documents TLS publiés avant ce document lorsque TLS 1.2 est négocié. Les nouvelles suites de chiffrement DOIVENT spécifier explicitement une PRF et, en général, DEVRAIENT utiliser la PRF TLS avec SHA-256 ou une fonction de hachage standard plus forte.

Tout d'abord, nous définissons une fonction d'expansion de données, P_hash(secret, data), qui utilise une seule fonction de hachage pour étendre un secret et une graine en une quantité arbitraire de sortie :

P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
HMAC_hash(secret, A(2) + seed) +
HMAC_hash(secret, A(3) + seed) + ...

+ indique la concaténation.

A() est défini comme :

A(0) = seed
A(i) = HMAC_hash(secret, A(i-1))

P_hash peut être itéré autant de fois que nécessaire pour produire la quantité de données requise. Par exemple, si P_SHA256 est utilisé pour créer 80 octets de données, il devra être itéré trois fois (jusqu'à A(3)), créant 96 octets de données de sortie ; les 16 derniers octets de l'itération finale seront ensuite rejetés, laissant 80 octets de données de sortie.

La PRF de TLS est créée en appliquant P_hash au secret comme suit :

PRF(secret, label, seed) = P_<hash>(secret, label + seed)

L'étiquette (label) est une chaîne ASCII. Elle doit être incluse dans la forme exacte dans laquelle elle est donnée sans octet de longueur ni caractère null final. Par exemple, l'étiquette « slithy toves » serait traitée en hachant les octets suivants :

73 6C 69 74 68 79 20 74 6F 76 65 73