- ADR-001: inherit the alknet TLS design as the baseline; deviations recorded as alktls ADRs - ADR-002: TlsError ships the ADR-088 six-variant shape from day one (typed #[from] sources; NoqWrap; no string catch-all) - ADR-003: the QUIC feature is noq (iroh's extracted fork), pre- consumer rename; default = [] per the lean-crate convention (corrects the extracted code's default = ["quinn"]) - ADR-004: complete accessors — for_tcp_tls() adopted, rustls_config() adopted; server accessors borrow (&self), client accessors consume - ADR-005: identity + credentials + fingerprint types move into alktls; auth layer stays out - ADR-006: eight-module layout; seed tests + integration invariant pins (exact nine-scheme list, client enable_early_data) - specs: overview (transport picture, terminology), server.md (ACME lifecycle, invariants), client.md (verifier selection matrix, root- store fallback); open-questions.md promotes OQ-TLS-01..08 (all resolved at entry) - Cargo.toml: quinn feature -> noq (per ADR-003); AGENTS.md aligned Architecture review pass done: 0 critical, 2 major (ADR-002 AcmeConfig doc comment contradiction; ADR-003 unrecorded default deviation) and 8 minors all addressed; cross-references verified against alknet ADRs, rustls/noq/iroh sources. Verified: cargo test, test --all-features, clippy -D warnings, fmt --check, doc --no-deps
4.6 KiB
status, last_updated
| status | last_updated |
|---|---|
| accepted | 2026-09-10 |
ADR-001: Inherit the alknet TLS design; alktls as the rewrite's TLS crate
Status
Accepted (2026-09-10)
Context
alktls is the extraction of the TLS handling from alknet
(crates/alknet-tls + the config types in crates/alknet-core), the
last crate extracted before the alknet rewrite begins. alknet already
recorded the full TLS design as ADRs (082/083/084/086/087/088/089/
091, plus ADR-027's identity model and ADR-034's verifier selection)
and a complete crate spec (docs/architecture/crates/tls/README.md).
The extracted code runs in production today and every
behavior-preservation invariant was verified present in Phase 0
(docs/research/phase-0.md §Prior art).
Phase 1 must decide how this crate relates to that body of decisions: re-litigate, inherit wholesale, or inherit with recorded deviations.
Decision
alktls inherits the alknet TLS design. The alknet ADRs and the
crates/tls README are adopted as this crate's authoritative prior
decisions; Phase 1 does not re-litigate them. This ADR records that
inheritance as alktls' own baseline, so this repo's ADR numbering
starts from a coherent baseline instead of dangling references into
another repo's architecture.
Concretely, alktls adopts:
TlsServerConfig/TlsClientConfigas the central types, built once, shared across transports viaArc(alknet ADR-082). The inner rustls config isClone(Arc-shared resolvers);TlsServerConfigis notClone(it holds the ACME task'sJoinHandle).- The config-construction scope boundary: this crate builds configs; handshake outcomes flow through the transport's connector; ACME runtime errors are stream events logged in the spawned task (alknet ADR-088 §6).
- The behavior-preservation invariants verbatim:
max_early_data_size = u32::MAXon all server paths plusenable_early_data = trueon every client config (the client half of the 0-RTT invariant),aws_lc_rs::default_provider()on all paths,AcceptAnyCertVerifier's nine-schemesupported_verify_schemes(), crate-sideacme-tls/1append for the ACME path only, non-empty root store viawebpki-rootsfallback (alknet ADR-082, ADR-084, ADR-088 §5). - The identity model:
TlsIdentityfour variants,Acmeserver-only, client-auth presentation follows the local identity, verifier selection fail-closed (alknet ADR-027, ADR-034, ADR-091). - One ACME state machine per domain, shared across transports; never a second order for a served domain (alknet ADR-082 §The cert-reuse problem).
- iroh stays key-not-config: no
for_iroh(); the identity type exposes 32-byte Ed25519 access foriroh_base::SecretKey(alknet ADR-082 §Iroh is different).
Where alktls deviates from or refines the inherited design, the
deviation is recorded as an alktls ADR (001.. this series) rather than
silently diverging. The known deviations/corrections at time of
writing: the TlsError shape (ADR-002), the QUIC feature (ADR-003,
which also corrects the extracted code's default = ["quinn"] back
to the spec's default = []), the API surface completion (ADR-004),
and config-type ownership (ADR-005).
Consequences
Positive:
- The crate implements proven code, not a new design; Phase 2 is a port with a verified behavior checklist, not an invention.
- Design rationale is already written and battle-tested; this repo's ADR series stays small and points at the alknet reasoning where the full argument lives.
- The alknet rewrite consumes one crate with one consistent ADR lineage instead of reverse-engineering decisions from scattered alknet ADRs.
Negative:
- alktls ADRs are derivative — a reader must consult alknet's ADRs for the full rationale of the inherited posture (mitigated: each alktls ADR restates the decision it pins, and the Phase 0 doc carries the verified line references).
- If alknet's rewrite later re-decides an inherited posture, both series need a superseding note.
References
docs/research/phase-0.md— the Phase 0 inventory (verified invariants, gaps, noq investigation)- alknet ADR-082 (extraction), ADR-083 (endpoint takes no TLS config),
ADR-084 (aws-lc-rs), ADR-027 (identity model), ADR-034 (verifier
selection), ADR-086 §3 (split ALPN lists), ADR-087
(
TlsClientConfig), ADR-088 (TlsError, root-store fallback), 089 (dial seam), 091 (ConnectionCredentials) - alknet
docs/architecture/crates/tls/README.md— the full crate spec this crate implements - ADR-002 — the
TlsErrorshape (gap #1) - ADR-003 — the QUIC feature: noq replaces quinn
- ADR-004 — the API surface (gap #2, accessor shapes)
- ADR-005 — config-type ownership (gap #3)