Identity and PKI
The accepted algorithm set is closed, and the algorithm name is part of the signed material — so a signature produced under one algorithm cannot be reinterpreted under another.
Cryptographic inventory
| Purpose | Mechanism |
|---|---|
| Owner root identity, delegations, governance log, standing law | Ed25519 |
| Intermediate CA and machine certificates | X.509, ECDSA P-256 with SHA-256 |
| Record and capture integrity within a workspace | HMAC-SHA-256, 32-byte key |
| Content identity (artifacts, law documents, transfers) | SHA-256 |
| Key identifiers | SHA-256 over a domain-separation label concatenated with the public key, truncated to 12 bytes, hex-encoded, with a class prefix |
| Management interface authorisation | OIDC resource server with JWKS |
The accepted algorithm set is closed, and the algorithm name is part of the signed material — so a signature produced under one algorithm cannot be reinterpreted under another. On the instruction path Ed25519 is hard-pinned and an HMAC envelope is refused before any key material is touched; the consequence is that a local process holding the shared workspace HMAC key cannot mint standing law or an instruction, even though it can sign records. Version changes are explicit refusals of the unknown version, never a guess.
The trust root is born on paper
The owner root is an Ed25519 key pair created in a ceremony, whose purpose is to produce a root whose private half exists only on paper.
- The engine generates the key pair using the platform CSPRNG.
- It renders the private half as a numbered word list over a 2,048-word dictionary embedded in the binary, eleven bits per word. No printer driver, no external tool, no clipboard, no shell-out to any crypto utility.
- It requires proof of capture: a witness reads the words back from the paper and the engine compares them position by position.
- Only on an exact match does it erase the private key, its public counterpart and the word list from disk.
A mismatch erases nothing and refuses by name, reporting word counts and positions only, never a word value — so the failure message is safe to paste into a ticket. A scripted read-back pointing the engine at its own word-list file is refused as self-referential.
Root creation uses an exclusive-create file operation and refuses to overwrite an existing root, because re-minting would silently invalidate every prior signature.
After the ceremony, compromising the control plane does not compromise the root, because the root is not on it.
Intermediate authority
The root certifies a P-256 intermediate CA, which issues the short-lived leaf certificates machines use. Intended production custody is an HSM or secure enclave; a software-held key file is documented as the fallback and test configuration, not the recommendation.
Actors and delegation
An actor is a named identity in an append-only registry with a status. A delegation is a root-signed grant naming the delegate, their key identifier, the scope, the specific work streams, and a validity window with a not-before and an expiry. The signature covers every field, so a grant cannot be widened after signing.
- The scope vocabulary is closed — exactly one scope is recognised. A grant naming any other scope authorises nothing; it does not fail open into general authority.
- An expiry is a ceiling, never a trigger. Nothing gains permission through the passage of time.
- Only the root ratifies standing law or issues further delegations.
- Actor status is checked independently of the grant, so a retired actor is refused even with a valid signature and an unexpired grant.
Standing law and instructions
Ratifying law produces a root-signed manifest listing each document with its SHA-256 and a note, carrying a monotonic serial number — the anti-rollback high-water mark, so replaying a superseded body of law is detectable. Given a document the engine walks the full chain: these bytes hash to this ratified entry, in this untampered manifest, signed by this root.
Individual instructions are signed separately and verified back to the same root before a run is composed. Verification is structural: internally, "this document was verified" is a value constructible only by walking the chain, so an unverified document cannot be mistaken for a verified one downstream.
Private key handling
| Control | Detail |
|---|---|
| Permissions | Owner read/write only. Any group or other bit is a refusal. |
| Check order | Path inspected without following symlinks → must be a regular file → permission mask → exact key length → only then is the value read. |
| Machine keys | Generated on the machine that will use them; the certificate request is self-signed in process, so no key material crosses that boundary. |
| Transmission | Nothing in the system transmits a private key. SSH identities are recorded as paths, never values. |
| In-memory | The secret type renders as a fingerprint, so ordinary logging or string formatting cannot leak it. |