Proposal: Caution-held Shares, and WebAuthn Transport #7
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Current status — 2026-09-24
The V1 external-PGP/passkey/mixed-holder design is implemented. This remains the design/trust-model umbrella; it is no longer an unimplemented transport proposal.
Published PR heads checked on 2026-09-24: Platform
1f7e296, Locksmith9f702bb, Bootproof821b5c6. Platform's dependency/model/mock/default-runtime pins are aligned at Locksmithd2876e9; subsequent Locksmith changes concern examples, configuration, documentation and terminology. These are published implementation states, not merged/deployed-state claims.Implemented through #10, #11, #12, Platform #383 and #384: separate Keymaker and key-service lifecycles; external-PGP root recovery; proof-bound holder associations; attested destination-bound single-use UV approval; recryption inside the key-service enclave; native/browser flows and guided dashboard creation. Explicit ImportedV0 recovery is now separate supported functionality. Signed freshness and cross-session replay regressions also exist.
Remaining design/security decisions: effective credential/holder revocation for existing snapshots; common-root compromise scope and constrained private-key capabilities; root/token recovery and migration; service availability/access controls; independent review/fuzzing; exact-revision Nitro/hardware/restart acceptance. A passkey approves one share; multiple passkeys are not extra quorum votes. Distinct holders backed by the same root are not independent custody-compromise domains.
Accepted scope remains: operator-configured service URLs/trust files; Keymaker-owned one-shot serialization with no additional Platform queue; enclave-lifetime key-service root; current proofed V1 generation. Explicit holder-assisted
ImportedV0recovery has since been added separately; it does not restore V0 generation, silently downgrade failed V1 verification, or migrate a secret by generating a new quorum. The accepted CA-certified UID/context profile and fixed V1 encodings remain; a general structure-hash registry is deferred.The implemented protocol and later clarification comments supersede the historical proposal below, including its speculative transport/schema details. See the current release contract. No ticket is closed by this status update; implementation PRs remain open/unmerged.
Historical proposal
Caution Secret Unlocking Strategy
Out of band: Client runs
caution apps verify --save-pcrsso Locksmith can use those PCRs for attestationExisting Flow: OpenPGP
Proposed Flow: WebAuthn + Caution Share Storage
Note: 'Caution' in this instance is the enclave that stores the shares,
'enclave' refers to the customer's enclave that is receiving shards
Use Cases:
Threats:
#[serde(deny_unknown_fields)]or even better: add a dummy slot just to hold the signaturesHow the bundle is generated:
When reconstituting:
Necroproof timestamps can be used to ensure versions of Keymaker that are found to later be vulnerable can't be used to verify existing bundles. If we release a new version of Keymaker in 2027, for example, we only trust bundles made with that version or newer after 2027. When reconstituting, if someone provides a Keymaker bundle but it's timestamped to 2026, we can accept it.
When deriving public certificates, build a DerivationPath off of
m/pgp'/kmkr'/, then chain the organization ID. For every u32, remove the highest bit. Chain the bundle ID, removing the highest bit. You should getm/pgp'/kmkr'/[u32'/u32'/u32'/u32': org ID]/[u32'/u32'/u32'/u32': bundle ID]/<index>'Cross-repo decomposition for platform #384:
The platform org-user bundle work now has concrete Locksmith/Keymaker implementation tickets:
I left #7 as the authoritative design thread for the WebAuthn signed transport and opened a separate implementation issue so the transport can have testable acceptance criteria without overwriting the proposal text.
Consistency note after PR #13 landed: the public certificate service request no longer accepts a caller-supplied
bundle_id. The service route generates a fresh bundle UUID server-side, uses it for derivation/notions/proofed response data, and returns it inPublicCertificateBundle::V1.bundle_id.So the high-level design from this thread still stands, but the concrete split is now:
Few clarifications and requirements:
The V1 creation-to-recovery flow has now been exercised end to end.
Implemented:
This supersedes earlier comments saying WebAuthn recovery is unimplemented. It does not complete every linked issue: