2. HMAC-based Key Derivation Function (Fonction de dérivation de clé basée sur HMAC)
2. HMAC-based Key Derivation Function (Fonction de dérivation de clé basée sur HMAC)
2.1. Notation
HMAC-Hash désigne la fonction HMAC [HMAC] instanciée avec la fonction de hachage 'Hash'. HMAC a toujours deux arguments: le premier est une clé et le second une entrée (ou message). (Notez que dans l'étape d'extraction, 'IKM' est utilisé comme entrée HMAC, et non comme clé HMAC.)
Lorsque le message est composé de plusieurs éléments, nous utilisons la concaténation (notée |) dans le second argument; par exemple, HMAC(K, elem1 | elem2 | elem3).
Les mots-clés "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" et "OPTIONAL" dans ce document doivent être interprétés comme décrit dans [KEYWORDS].
2.2. Step 1: Extract (Étape 1: Extraction)
HKDF-Extract(salt, IKM) -> PRK
Options:
Hash: une fonction de hachage; HashLen désigne la longueur de la sortie de la fonction de hachage en octets
Inputs (Entrées):
salt: valeur de sel optionnelle (une valeur aléatoire non secrète); si elle n'est pas fournie, elle est définie sur une chaîne de HashLen zéros.IKM: matériel de clé d'entrée (input keying material)
Output (Sortie):
PRK: une clé pseudoaléatoire (de HashLen octets)
La sortie PRK est calculée comme suit:
PRK = HMAC-Hash(salt, IKM)
2.3. Step 2: Expand (Étape 2: Expansion)
HKDF-Expand(PRK, info, L) -> OKM
Options:
Hash: une fonction de hachage; HashLen désigne la longueur de la sortie de la fonction de hachage en octets
Inputs (Entrées):
PRK: une clé pseudoaléatoire d'au moins HashLen octets (généralement, la sortie de l'étape d'extraction)info: informations optionnelles de contexte et spécifiques à l'application (peut être une chaîne de longueur nulle)L: longueur du matériel de clé de sortie en octets (<= 255*HashLen)
Output (Sortie):
OKM: matériel de clé de sortie (de L octets)
La sortie OKM est calculée comme suit:
N = ceil(L/HashLen)
T = T(1) | T(2) | T(3) | ... | T(N)
OKM = first L octets of T
où:
T(0) = empty string (zero length)
T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)
T(2) = HMAC-Hash(PRK, T(1) | info | 0x02)
T(3) = HMAC-Hash(PRK, T(2) | info | 0x03)
...
(où la constante concaténée à la fin de chaque T(n) est un seul octet.)