Architecture
EdSSAβs hot path is a single function: verify_token(&[u8; N], &ActiveEdssaState<N>).
Everything else is plumbing around keeping the state fresh and
the verifier honest.
FIG. 1 β Overall system architecture
π Figure pending publication. FIG. 1 is part of the A1-publication-ready patent application; it will land here alongside the public migration step that drops the figures into
docs-site/src/figures/fig-1-architecture.png.
The system is three layers:
- Client. Mints a token from
(seed, sub_id, claim_state)and stampsX-EdSSA-Token: <fleet_id>-<token>on every outbound request. - Verifier (
edssa-server-ce). Sits as a sidecar; on each inbound request it loads the fleetβsActiveEdssaStatevia a wait-freeArcSwapand performs the O(N) match. - Backend. Receives forwarded traffic with the
X-EdSSA-Tokenheader stripped (Zero-Trust edge separation β the credential never crosses the verify-to-app boundary).
FIG. 2 β Credential construction
π Figure pending publication. FIG. 2 will land at
docs-site/src/figures/fig-2-construction.png.
Token construction:
- The client knows the fleetβs seed and picks a sub-ID for the request.
- For each slot
i β [chaff_count, N β SUB_ID_SLOTS), the client derives the secret byte:- CE first cut:
wire_byte(SHA-256(seed β i_le)[0]). - Enterprise (with the ratchet running): the ratchetβs cell at
position
iis hashed forward on a clock-driven cadence; the verifier publishes the newActiveEdssaStateatomically.
- CE first cut:
- Chaff slots
[0, chaff_count)carry random bytes the verifier ignores. - Sub-ID slots
[N β SUB_ID_SLOTS, N)carry the ASCII-hex encoding of the sub-ID (encode_sub_id).
Verification mirrors the construction step-for-step. Bytes at
chaff positions donβt contribute to the match count; the match
count must reach threshold_T for the token to be accepted.
FIG. 3 β Synchronisation and tolerance windowing
π Figure pending publication. FIG. 3 will land at
docs-site/src/figures/fig-3-synchronisation.png.
The Enterprise buildβs drift corrector (F-16) gates ratchet advancement on a median-of-3 over independent time-anchoring oracles. CE pins the verifier state at boot and does not run a ratchet, so this figure is purely informational for CE operators.
Plasticity presets (ADR-008)
| Preset | N | C | T | M = N β C β SUB_ID_SLOTS β T | When to use |
|---|---|---|---|---|---|
high-security | 64 | 16 | 44 | 0 | No margin; every secret byte must match. HFT credentials, control-plane authority. |
balanced (default) | 64 | 16 | 33 | 11 | Tolerates ~25 % byte loss. Most application-tier M2M. |
high-resilience | 64 | 16 | 22 | 22 | Half of R_eff may flip. Radio links, IoT mesh, lossy WAN paths. |
CE pins N = 64 and accepts all three presets. Operators can
override chaff_C / threshold_T per-fleet if the preset doesnβt
fit; width_N is the only field CE refuses to deviate from.
Wire format
| Field | Bytes | Notes |
|---|---|---|
| Fleet ID | 3β32 ASCII chars ([a-z0-9-], no leading/trailing dash) | Sent as the part of the header before the last - |
| Token | EDSSA_TOKEN_WIDTH = 64 bytes | Wire-safe by construction (wire_byte mapping) |
| Sub-ID slots | Last 4 bytes of the token | ASCII hex; SUB_ID_MAX = 0xFFFF |
Header: X-EdSSA-Token: <fleet_id>-<token>.
ADR-004 documents why the parser splits at the last dash
(token bytes never contain -, so the fleet-token boundary is
unambiguous).
What changes in Enterprise
| Feature | CE | Enterprise |
|---|---|---|
| Multi-fleet routing | β | β |
| Token widths | 64 only | 32 / 64 / 128 / 256 |
| Ratchet driver | β (static state) | β (Phase-2 ratchet) |
| Drift corrector (F-16) | n/a | β |
| Audit Tier 3 (trace) | β | β |
| Audit Tier 4 (Merkle / F-21) | β | β |
| Tier-3 response chain (F-19) | β | β |
| F-03 swarm | β | β |
| F-04 relay roles | edge-only | edge-only / peer / anchor |
| Payload channel (F-26..28) | β | β |
| Cooperative recovery (F-24/F-25) | β | β |
| ML-KEM onboarding (F-07) | β | β |