5. HMAC and the Pseudorandom Function (HMAC und die Pseudozufallsfunktion)
Die TLS-Datensatzschicht verwendet einen schlüsselbasierten Nachrichtenauthentifizierungscode (MAC, Message Authentication Code), um die Nachrichtenintegrität zu schützen. Die in diesem Dokument definierten Cipher Suites verwenden eine Konstruktion namens HMAC, die in [HMAC] beschrieben ist und auf einer Hash-Funktion basiert. Andere Cipher Suites KÖNNEN bei Bedarf ihre eigenen MAC-Konstruktionen definieren.
Darüber hinaus wird eine Konstruktion benötigt, um Geheimnisse zu Datenblöcken für Zwecke der Schlüsselgenerierung oder -validierung zu expandieren. Diese Pseudozufallsfunktion (PRF, pseudorandom function) nimmt ein Geheimnis, einen Seed und ein identifizierendes Label als Eingabe und erzeugt eine Ausgabe beliebiger Länge.
In diesem Abschnitt definieren wir eine PRF, die auf HMAC basiert. Diese PRF mit der SHA-256-Hash-Funktion wird für alle in diesem Dokument definierten Cipher Suites und in TLS-Dokumenten verwendet, die vor diesem Dokument veröffentlicht wurden, wenn TLS 1.2 ausgehandelt wird. Neue Cipher Suites MÜSSEN eine PRF explizit spezifizieren und SOLLTEN im Allgemeinen die TLS-PRF mit SHA-256 oder einer stärkeren Standard-Hash-Funktion verwenden.
Zunächst definieren wir eine Datenerweiterungsfunktion P_hash(secret, data), die eine einzelne Hash-Funktion verwendet, um ein Geheimnis und einen Seed in eine beliebige Menge von Ausgabedaten zu expandieren:
P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
HMAC_hash(secret, A(2) + seed) +
HMAC_hash(secret, A(3) + seed) + ...
wobei + Verkettung anzeigt.
A() ist definiert als:
A(0) = seed
A(i) = HMAC_hash(secret, A(i-1))
P_hash kann so oft wie nötig iteriert werden, um die erforderliche Datenmenge zu erzeugen. Wenn beispielsweise P_SHA256 verwendet wird, um 80 Bytes Daten zu erstellen, muss es dreimal iteriert werden (bis A(3)), wodurch 96 Bytes Ausgabedaten erstellt werden; die letzten 16 Bytes der letzten Iteration werden dann verworfen, wodurch 80 Bytes Ausgabedaten übrig bleiben.
Die PRF von TLS wird erstellt, indem P_hash wie folgt auf das Geheimnis angewendet wird:
PRF(secret, label, seed) = P_<hash>(secret, label + seed)
Das Label ist eine ASCII-Zeichenkette. Es sollte in der exakten Form, wie es gegeben ist, ohne Längenbyte oder abschließendes Null-Zeichen eingeschlossen werden. Zum Beispiel würde das Label „slithy toves" durch Hashing der folgenden Bytes verarbeitet:
73 6C 69 74 68 79 20 74 6F 76 65 73