Full Key Schedule (RFC 8446 §7.1)
0 (or PSK)
│
├─ HKDF-Extract(salt=0, IKM=PSK) → Early Secret (ES)
│ ├─ Derive-Secret(ES, "ext binder" | "res binder", "") → binder keys
│ ├─ Derive-Secret(ES, "c e traffic", ClientHello) → client_early_traffic_secret
│ └─ Derive-Secret(ES, "e exp master", ClientHello) → early_exporter_master_secret
│
├─ Derive-Secret(ES, "derived", "") → ES_derived
├─ HKDF-Extract(salt=ES_derived, IKM=DHE) → Handshake Secret (HS)
│ ├─ Derive-Secret(HS, "c hs traffic", CH..SH) → client_hs_traffic_secret
│ └─ Derive-Secret(HS, "s hs traffic", CH..SH) → server_hs_traffic_secret
│
├─ Derive-Secret(HS, "derived", "") → HS_derived
└─ HKDF-Extract(salt=HS_derived, IKM=0) → Master Secret (MS)
├─ Derive-Secret(MS, "c ap traffic", CH..SF) → client_app_traffic_secret_0
├─ Derive-Secret(MS, "s ap traffic", CH..SF) → server_app_traffic_secret_0
├─ Derive-Secret(MS, "exp master", CH..SF) → exporter_master_secret
└─ Derive-Secret(MS, "res master", CH..CF) → resumption_master_secret