RFC 9001
Overview
▶RFC 9001 specifies the integration between TLS 1.3 and QUIC. Unlike traditional TLS-over-TCP, QUIC does not use the TLS record layer for encryption. Instead, TLS provides the handshake protocol and key schedule, while QUIC handles packet protection directly.
This split design allows QUIC to encrypt packets at different protection levels during the handshake and provides header protection that TLS-over-TCP cannot offer.
Encryption Levels
▶Each encryption level uses distinct keys derived from the TLS key schedule via HKDF. Packet number encryption (header protection) uses a separate key derived from the same traffic secret.
| Level | QUIC Packet Type | Keys From | Protects |
|---|---|---|---|
| Initial | Initial packets | Connection ID-derived | First flight (unverified peer) |
| Handshake | Handshake packets | Handshake traffic secret | Certificate exchange |
| 0-RTT | 0-RTT packets | Pre-shared key (resumption) | Early application data |
| 1-RTT | Short header packets | Application traffic secret | All post-handshake data |
TLS-QUIC Interface
▶TLS handshake messages are carried in QUIC CRYPTO frames, not TLS records. QUIC provides the reliable, ordered delivery that TLS expects (per encryption level). Once keys are derived, QUIC uses them directly for AEAD encryption of packets.
┌────────────────────────────────┐ │ TLS 1.3 Handshake │ │ (ClientHello, ServerHello, │ │ Certificates, Finished) │ └──────────┬───────────────┬────┘ │ CRYPTO frames │ Key schedule ▼ ▼ ┌────────────────────────────────┐ │ QUIC Transport │ │ - Packet protection (AEAD) │ │ - Header protection │ │ - Packet number encryption │ │ - Key update mechanism │ └────────────────────────────────┘
Key Derivation
▶QUIC uses the TLS 1.3 key schedule (HKDF-based) to derive packet protection keys. For each encryption level, the traffic secret is expanded into a key, IV, and header protection key.
- quic key: HKDF-Expand-Label(secret, "quic key", "", key_length) — AEAD encryption key
- quic iv: HKDF-Expand-Label(secret, "quic iv", "", 12) — AEAD nonce/IV
- quic hp: HKDF-Expand-Label(secret, "quic hp", "", key_length) — header protection key
Header Protection
▶QUIC encrypts the packet number and certain header flags using a header protection algorithm. This prevents on-path observers from reading packet numbers, which could be used for traffic analysis. The header protection key is derived from the same traffic secret used for packet protection.
Key Update
▶QUIC supports key updates without a full TLS handshake. Either endpoint can initiate a key update by toggling the Key Phase bit in the short header. The new keys are derived from the current application traffic secret using HKDF-Expand-Label.
3GPP Relevance
▶- QUIC/HTTP/3 security: Defines the security model for any future HTTP/3-based SBI transport
- TLS 1.3 reuse: Uses the same TLS 1.3 cipher suites mandated by TS 29.500 for SBI security
- 0-RTT considerations: Replay protection for 0-RTT data is critical in NF-to-NF communication
- Key update: Long-lived NF connections benefit from periodic key rotation without connection restart
- Middlebox challenges: Header protection prevents inspection by intermediate network functions