6. Schlüsselaktualisierung (Key Update)
Sobald der 1-RTT-Handshake abgeschlossen ist, können Endpunkte die Schlüssel aktualisieren, die zum Schutz von 1-RTT-Paketen verwendet werden. Dies ermöglicht den Schutz vor Schlüsselkompromittierung. Ein Endpunkt initiiert eine Schlüsselaktualisierung, indem es die Schlüssel aktualisiert, die es zum Senden von Paketen verwendet.
Die Schlüsselaktualisierung in QUIC ist vom KeyUpdate-Mechanismus von TLS getrennt. Die QUIC-Schlüsselaktualisierung verwendet die Schlüsselableitungsfunktionen der TLS-Bibliothek.
6.1. Initiierung einer Schlüsselaktualisierung (Initiating a Key Update)
Endpunkte pflegen separate Lese- und Schreibschlüssel. Ein Endpunkt initiiert eine Schlüsselaktualisierung, indem es seine Paketschreibschlüssel aktualisiert und beginnt, diese zum Schutz der von ihm gesendeten Pakete zu verwenden. Der Endpunkt erstellt ein neues geheimes Secret unter Verwendung der von TLS bereitgestellten KDF-Funktion.
Der Endpunkt aktualisiert dann seine Paketschutzschlüssel und verwendet die aktualisierten Schlüssel zum Schutz neuer Pakete.
6.2. Antwort auf eine Schlüsselaktualisierung (Responding to a Key Update)
Wenn ein Endpunkt ein Paket mit einer neuen Schlüsselgeneration empfängt, die größer ist als jeder zuvor empfangene Schlüssel, weiß es, dass der Peer seine Schlüssel aktualisiert hat. Der Endpunkt MUSS (MUST) seine Empfangsschlüssel aktualisieren, bevor er das Paket erfolgreich verarbeitet.
Wenn ein Endpunkt ein zweites Paket mit einer Schlüsselgeneration erkennt, die größer ist als die, die es verwendet hat, zeigt dies an, dass der Peer auf die Schlüsselaktualisierung reagiert hat. In diesem Fall MUSS (MUST) der Endpunkt seine Paketversandschlüssel aktualisieren, falls dies noch nicht geschehen ist.
6.3. Timing der Empfangsschlüsselgenerierung
Implementierungen können wählen, ältere Empfangsschlüssel für einige Zeit beizubehalten, um den Empfang von Paketen zu ermöglichen, die im Netzwerk verzögert wurden. Sobald ein Endpunkt jedoch ein 1-RTT-Paket empfängt, das die folgende Schlüsselgeneration erfordert, SOLLTE (SHOULD) es seine Empfangsschlüssel aktualisieren.
6.4. Senden mit aktualisierten Schlüsseln (Sending with Updated Keys)
Ein Endpunkt sendet niemals Pakete, die mit älteren Schlüsseln geschützt sind. Nur Pakete, die mit der neuesten Schlüsselgeneration geschützt sind, werden gesendet. Ältere Versandschlüssel MÜSSEN (MUST) verworfen werden, wenn neuere Schlüssel verfügbar sind.
6.5. Empfangen mit unterschiedlichen Schlüsseln (Receiving with Different Keys)
Für Pakete, die mit veralteten Schlüsseln geschützt sind und nach einer Aktualisierung durch einen Endpunkt ankommen, kann der Endpunkt diese Pakete entweder ohne Verarbeitung verwerfen oder versuchen, sie zu verarbeiten. Wenn die Implementierung wählt, ältere Schlüssel beizubehalten, kann sie verspätet ankommende Pakete verarbeiten.
6.6. Grenzen der AEAD-Nutzung (Limits on AEAD Usage)
Jede AEAD-Suite hat eine Grenze für die Datenmenge, die sie sicher verschlüsseln kann. Dies berücksichtigt sowohl die Anzahl der mit einem bestimmten Schlüssel geschützten Pakete als auch die Größe dieser Pakete.
Die Analyse in [AEBounds] und [ROBUST] zeigt, dass die Vertraulichkeitsgrenze für alle derzeit in QUIC akzeptierten AEADs erheblich größer ist als die Grenzen für den Schutz vor Fälschung.
Endpunkte MÜSSEN (MUST) die Anzahl der Bytes an Chiffretext zählen, die für jeden Verschlüsselungsschlüssel verschlüsselt wurden, und eine Schlüsselaktualisierung initiieren, bevor mehr als die Vertraulichkeitsgrenze für das verwendete AEAD verschlüsselt wird.
Die spezifischen Grenzen für jedes AEAD sind in Abschnitt 6.6 aufgeführt.
Für AEAD_AES_128_GCM und AEAD_AES_256_GCM:
- Vertraulichkeitsgrenze: 2^23 Pakete
- Integritätsgrenze: 2^52 Authentifizierungsversuche
Für AEAD_CHACHA20_POLY1305:
- Vertraulichkeitsgrenze: 2^23 Pakete
- Integritätsgrenze: 2^36 Authentifizierungsversuche
Für AEAD_AES_128_CCM:
- Vertraulichkeitsgrenze: 2^21.5 Pakete
- Integritätsgrenze: 2^23.5 Authentifizierungsversuche
6.7. Schlüsselaktualisierungs-Fehlercode (Key Update Error Code)
Der Fehlercode KEY_UPDATE_ERROR (0x0E) wird verwendet, um Fehler im Zusammenhang mit der Schlüsselaktualisierung zu signalisieren.