Principle
Private keys exist in plaintext only in RAM, only during signing operations, and are zeroized immediately after use.At rest
All private keys are encrypted with AES-256-GCM before being written to disk or transmitted. The encryption key is derived from a user-owned passphrase via Argon2id with high cost parameters.In memory
Rust’szeroize crate ensures private key memory is overwritten on drop:
Debug trait is deliberately not implemented for key types — preventing accidental logging.
Hardware keys
Supported:- YubiKey 5 (FIDO2 / PGP slots)
- Ledger Nano S / X (Solana app, Ethereum app)
- Trezor Model T
Rotation
ACTs (Arsenal Capability Tokens)
- Default: 1-hour rotation
- Minimum: 5 minutes
- Maximum: 24 hours
- Automatic; no human action needed
Per-entity treasury keys
- Recommended: every 90 days
- Rotation is a governance action (propose, vote, sign-over)
- Old key is zeroized + public record
Founder / hardware-backed keys
- Rotate on founder change
- Rotation ceremony: new key generated on new hardware, old key signs authorization, new key signs OA amendment
Master recovery key
- Never rotated except in documented emergency
- Stored in bank safety deposit box + co-custodian
- Rotation requires founder + co-custodian + 72-hour cooling period
Emergency
If a key is compromised:- Immediately rotate via emergency proposal
- All ACTs derived from compromised key are revoked
- Audit chain shows all actions signed by the compromised key; these are flagged for review
- Security incident report filed with regulators if required