Changed in 0.3.5Earlier builds stored the raw 256-bit key as
encryption_key_b64 inside ~/.sovseal/config.json (mode 0600). As of 0.3.5, custody moved to the OS keychain; on first run after upgrade the old field is migrated into the keychain and tombstoned in the file. If you have automation that reads encryption_key_b64, update it.Master key custody (OS keychain)
The master key is held by the platform credential store via@napi-rs/keyring:
- macOS — Keychain
- Windows — Credential Manager
- Linux — Secret Service / libsecret
Subkey derivation (HKDF-SHA256)
Working keys are never used raw. The master is split by purpose using HKDF-SHA256 with domain-separation labels, so a compromise of one context cannot be replayed against another:k_restencrypts memorytextat rest in the local LanceDB store.k_syncseals the ciphertext that replicates to the server.
CryptoKeys — they exist only inside the running process and cannot be exported back out.
What the local config file holds now
~/.sovseal/config.json (0600) holds identity and routing only — no key material:
encryption_key_b64 is replaced with a tombstone marker; the live key is in the keychain.
Loss & recovery
Related
- AES-256-GCM — the cipher used for both at-rest and sync.
- Zero-Knowledge Guarantees — what the server can and cannot see.
- Trust Center — the consolidated threat model.