add linked sshsigchain v2 core

This commit is contained in:
Eric Wendland 2026-07-18 20:22:58 +02:00
commit 8780350d41
8 changed files with 1305 additions and 0 deletions

View file

@ -0,0 +1,41 @@
# ADR 0018: Linked SSHSIGCHAIN v2
## Status
Accepted for the new generic core and geth keychain profile. Legacy static
sigchain publication is deprecated pending explicit v2 command migration.
## Context
The prior static JSONL keychain flow replayed records after sorting mutable
timestamps and used a downloaded allowed-signers projection to verify its own
checkpoint. That permits self-bootstrapping trust and makes revocation,
rollback, and fork semantics inadequate for a trust foundation.
## Decision
Geth adopts SSHSIGCHAIN v2 as the replacement design:
- root trust is an explicit `(chain ID, profile, namespace, root key)` tuple;
- records are linearly ordered by sequence and linked by a digest over their
signed content and SSHSIG signature;
- the initial root is only a genesis requirement, not a permanent bypass;
- profile authorization runs against the causally preceding state;
- key lifecycle is represented by causal add/revoke records, not timestamp
validity fields; and
- payloads use deterministic binary codecs with a strict round-trip check.
The generic core is transport-independent. Geth continues using Iroh for all
node-to-node communication; SSH remains an identity/signature integration and
not a geth transport.
## Consequences
The v2 core can be published and implemented by applications without importing
geth's resource model. Geth's keychain profile is intentionally narrow and
tested against self-bootstrap, fork, and backdated-revocation attacks.
Existing static v1 bundles cannot safely migrate in place. Operators must pin a
new v2 trust tuple and create a new genesis chain. Head persistence and later
witness/transparency support remain follow-up work; neither is implied by a
single signed checkpoint.