2. HMAC-based Key Derivation Function (HMAC-basierte Schlüsselableitungsfunktion)
2. HMAC-based Key Derivation Function (HMAC-basierte Schlüsselableitungsfunktion)
2.1. Notation (Notation)
HMAC-Hash bezeichnet die HMAC-Funktion [HMAC], die mit der Hash-Funktion 'Hash' instanziiert wurde. HMAC hat immer zwei Argumente: das erste ist ein Schlüssel und das zweite eine Eingabe (oder Nachricht). (Beachten Sie, dass im Extraktionsschritt 'IKM' als HMAC-Eingabe verwendet wird, nicht als HMAC-Schlüssel.)
Wenn die Nachricht aus mehreren Elementen besteht, verwenden wir die Verkettung (bezeichnet durch |) im zweiten Argument; zum Beispiel HMAC(K, elem1 | elem2 | elem3).
Die Schlüsselwörter "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" und "OPTIONAL" in diesem Dokument sind wie in [KEYWORDS] beschrieben zu interpretieren.
2.2. Step 1: Extract (Schritt 1: Extraktion)
HKDF-Extract(salt, IKM) -> PRK
Options (Optionen):
Hash: eine Hash-Funktion; HashLen bezeichnet die Länge der Hash-Funktionsausgabe in Oktetten
Inputs (Eingaben):
salt: optionaler Salt-Wert (ein nicht-geheimer Zufallswert); falls nicht angegeben, wird er auf eine Zeichenkette von HashLen Nullen gesetzt.IKM: Eingabeschlüsselmaterial (input keying material)
Output (Ausgabe):
PRK: ein pseudozufälliger Schlüssel (von HashLen Oktetten)
Die Ausgabe PRK wird wie folgt berechnet:
PRK = HMAC-Hash(salt, IKM)
2.3. Step 2: Expand (Schritt 2: Expansion)
HKDF-Expand(PRK, info, L) -> OKM
Options (Optionen):
Hash: eine Hash-Funktion; HashLen bezeichnet die Länge der Hash-Funktionsausgabe in Oktetten
Inputs (Eingaben):
PRK: ein pseudozufälliger Schlüssel von mindestens HashLen Oktetten (normalerweise die Ausgabe aus dem Extraktionsschritt)info: optionale Kontext- und anwendungsspezifische Informationen (kann eine Zeichenkette der Länge Null sein)L: Länge des Ausgabeschlüsselmaterials in Oktetten (<= 255*HashLen)
Output (Ausgabe):
OKM: Ausgabeschlüsselmaterial (von L Oktetten)
Die Ausgabe OKM wird wie folgt berechnet:
N = ceil(L/HashLen)
T = T(1) | T(2) | T(3) | ... | T(N)
OKM = first L octets of T
wobei:
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)
...
(wobei die an das Ende jedes T(n) angehängte Konstante ein einzelnes Oktett ist.)