nx_tls13_schedule.nx
buildroot/runtime/nx_tls13_schedule.nx
about
nx_tls13_schedule.nx -- TLS 1.3 key schedule cascade (RFC 8446 §7.1).
Phase 0b §D of the Nishi TLS 1.3 stack per
docs/NISHI_TLS13_GAP_AUDIT.md. Composes the just-landed
nx_hkdf + nx_tls13_kdf into the named 5-stage cascade that
produces every secret a TLS 1.3 session needs.
The cascade (no-PSK case, which is the 99%-common one):
0
|
v
HKDF-Extract(salt=0^Hash, IKM=0^Hash) = early_secret
|
v
Derive-Secret(., "derived", "") = derived_1 (salt for next HKDF-Extract)
|
v ECDHE shared
HKDF-Extract(salt=derived_1, IKM=ECDHE) = handshake_secret
|
+--> Derive-Secret(., "c hs traffic", H1) = client_hs_traffic_secret
+--> Derive-Secret(., "s hs traffic", H1) = server_hs_traffic_secret
v
Derive-Secret(., "derived", "") = derived_2 (salt for next HKDF-Extract)
|
v
HKDF-Extract(salt=derived_2, IKM=0^Hash) = master_secret
|
+--> Derive-Secret(., "c ap traffic", H2) = client_app_traffic_secret_0
+--> Derive-Secret(., "s ap traffic", H2) = server_app_traffic_secret_0
+--> Derive-Secret(., "exp master", H2) = exporter_master_secret
+--> Derive-Secret(., "res master", H3) = resumption_master_secret
Then per-traffic-secret AEAD key + IV derivation:
key = HKDF-Expand-Label(traffic_secret, "key", "", key_length)
iv = HKDF-Expand-Label(traffic_secret, "iv", "", iv_length)
finished_key = HKDF-Expand-Label(traffic_secret, "finished", "", Hash.length)
All transcript hashes (H1, H2, H3) are caller-supplied because
dependencies 3 imports · 12 importers
diagram shows first 10 each side; +0 more imports, +2 more importers in the complete lists below.
imports: nx_syscalls.nxnx_hkdf.nxnx_tls13_kdf.nx
imported by: nx_https_get_happy_test.nxnx_https_loopback_test.nxnx_tls13_client.nxnx_tls13_client_session_derive_app.nxnx_tls13_client_session_recv_sh.nxnx_tls13_full_tcp_test.nxnx_tls13_handshake.nxnx_tls13_handshake_io.nxnx_tls13_handshake_tcp_test.nxnx_tls13_loopback_test.nxnx_tls13_schedule_test.nxnx_tls13_server.nx
structs
| none |
consts
| 83 | const TLS13_HASH_LEN_SHA256: i64 = 32 |
| 88 | const NX_TLS13_LABEL_C_HS_TRAFFIC: i64 = 1 |
| 89 | const NX_TLS13_LABEL_S_HS_TRAFFIC: i64 = 2 |
| 90 | const NX_TLS13_LABEL_C_AP_TRAFFIC: i64 = 3 |
| 91 | const NX_TLS13_LABEL_S_AP_TRAFFIC: i64 = 4 |
| 92 | const NX_TLS13_LABEL_EXP_MASTER: i64 = 5 |
| 93 | const NX_TLS13_LABEL_RES_MASTER: i64 = 6 |
functions
| 99 | func tls13_early_secret(psk: *u8, psk_len: i64, out_32: *u8) -> i64 called by 3: nx_tls13_client_session_recv_shtls13_handshake_compute_handshake_keysmain calls 1: hkdf_extract |
| 114 | func tls13_derived(parent_secret: *u8, empty_hash: *u8, hash_len: i64, out: *u8) -> i64 |
| 123 | func tls13_handshake_secret( called by 3: nx_tls13_client_session_recv_shtls13_handshake_compute_handshake_keysmain calls 1: hkdf_extract |
| 135 | func tls13_master_secret( |
| 148 | func tls13_traffic_secret( |
| 212 | func tls13_traffic_key(traffic_secret: *u8, key_len: i64, out: *u8) -> i64 |
| 221 | func tls13_traffic_iv(traffic_secret: *u8, iv_len: i64, out: *u8) -> i64 |
| 230 | func tls13_finished_key(base_key: *u8, hash_len: i64, out: *u8) -> i64 |