Skip to content

REALITY: P256/P384 server-side KEX + HelloRetryRequest support (evaluate whether it's worth it) #84

Description

@vxfemboy

Summary

REALITY.5b (server-side ServerHello emission, in progress) implements server-side key exchange for X25519MLKEM768 (4588) + X25519 (29) only. This issue tracks the deferred, larger question of supporting P256 (23) + P384 (24) server-side — which requires HelloRetryRequest (HRR) handling — and whether it is worth doing at all.

Why P256/P384 are hard here (the HRR problem)

Our client (like real Chrome 150) sends TLS 1.3 key_shares only for its top two groupsX25519MLKEM768 and X25519 — while offering P256/P384 in supported_groups without a key_share (see crates/yip-utls/src/hello.rs::key_share_body). Under RFC 8446, a server that wants to use a group for which the client sent no key_share must send a HelloRetryRequest, asking the client to resend its ClientHello with that group's key_share (a full extra round trip).

So for the REALITY relay to byte-match a dest that selects P256/P384, we'd need HRR support in two places:

  1. capture_dest_flight (REALITY.5a, already shipped) — it currently assumes a 1-RTT handshake and would misparse a dest that HRRs. Supporting P256/P384 means reopening 5a to handle the HRR round trip during capture.
  2. 5b/5c/5d emission — the relay would have to emit its own HRR and then process the client's re-sent ClientHello — a whole additional flight in both directions.

By contrast, 4588 and X25519 need no HRR (the client sent those key_shares), so they're a clean 1-RTT path.

Why it's probably not worth it (the "evaluate" part)

A modern TLS 1.3 server facing a Chrome ClientHello that offers X25519MLKEM768 (post-quantum hybrid) + X25519 overwhelmingly selects one of those — it does not fall back to plain P256/P384 ECDHE for the key exchange. So a dest that would trigger HRR for a Chrome hello is rare (old/misconfigured servers). Before building HRR (a substantial addition spanning capture + emission), we should gather evidence: probe a broad set of realistic --reality-dest candidates and measure how many actually select P256/P384 (i.e. would HRR). If ~none do, this stays wontfix.

Interim behavior (REALITY.5b/c/d)

An SNI whose dest selects a group outside {4588, 29} degrades to splice-only (the existing per-SNI degrade path) — fail-safe, no fidelity claim for that SNI, no HRR needed.

References

  • crates/yip-utls/src/hello.rs (key_share_body — key_shares for 4588 + X25519 only)
  • REALITY.5b spec (server-side ServerHello emission)
  • Milestone spec: docs/superpowers/specs/2026-07-15-reality-tls-milestone-design.md
  • Surfaced during REALITY.5b design.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions