Caution-backed organization-user quorum bundle creation #384
Labels
No labels
Compat/Breaking
Component/Enclave-Builder
Component/Infrastructure
Deploy/BYOC
Deploy/Full-managed
Deploy/Self-hosted
Interface/API
Interface/CLI
Interface/Git
Interface/Web
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Status/Abandoned
Status/Blocked
Status/Need More Info
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
public/platform#384
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 API/CLI/dashboard feature is implemented. Service access, final acceptance and review remain open. Guided dashboard creation is no longer a missing feature.
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.Done: organization-member/key discovery; signed API/CLI generation; external-PGP, passkey and mixed holders; independent certificate/Keymaker proof checks; storage/download/manage operations; guided dashboard creation with manual public-PGP additions, explicit approval-method selection, threshold and review; passkey eligibility and 64-credential bounds; native cancellation and browser-relay cleanup; updated setup/recovery documentation. Current product contract.
Separate explicit ImportedV0 import/recovery and policy-free ImportedV0 packaging are implemented. They do not add V0 generation, automatic fallback from failed V1 verification, or earlier-V1 migration. Legacy scope.
Remaining:
Accepted scope: operator-configured URLs and trust files; no endpoint database; Keymaker owns one-shot serialization and Platform does not add a queue. Restart supervision/replacement is implemented; it does not supply caller authorization. The September 23 review was on
44a475d/c33e35e; this status refresh did not rerun the full stack.Implemented CLI behavior
caution secret init(newremains an alias) supports explicit per-holder custody:Username/UUID selectors and registered PGP registration-ID/full-fingerprint selection resolve to exact organization members/keys. One selected PGP certificate or one derived certificate with a credential snapshot represents each organization holder; multiple passkeys do not increase quorum weight. Interactive confirmation shows custody and threshold. Missing/ambiguous/ineligible selections fail before generation; there is no silent Caution-backed fallback.
Existing
--from-org-users/--caution-backedselectors remain documented, and manual/direct PGP-only generation uses current V1. CLI output/download retains the complete proof envelope.caution secret inspectverifies persisted bundle evidence and exposes holder/context details; recovery supports native and browser approval. See the creation contract and Platform recovery and validation.Implemented dashboard behavior
The Secrets tab now provides a configure/review/create flow. It supports organization holders and manually added public PGP certificates, explicit passkey/external-PGP selection, threshold/count validation, a holder summary, signed creation, and an uncertain-outcome state without automatic retry. Multiple passkeys still authorize one share. Private-key uploads are rejected.
Implementation and local UI/browser validation are documented in the current dashboard section. Real-authenticator and deployed service acceptance remain separate.
Implemented API behavior
API route paths (relative to the configured API base):
GET /quorum-bundles/participants: active organization members, registered public PGP keys and credential counts, without private keys or raw credential bindings.POST /quorum-bundles/from-org-users: signed, authenticated hosted generation/storage.POST /quorum-bundles: proof-verified upload; existing list/get/update/delete routes remain.Generation accepts optional
name, requiredthreshold, explicitparticipants(user_id,key_source, optionalpgp_key_id), optional localpgp_certificates,allow_caution_backed_keysandlabels. Key sources areexisting_pgpandcaution_backed_pgp. Hosted callers cannot set service URLs. Platform computesmaxfrom the assembled holders and validates threshold/count and independent key identities.The current handler resolves the authenticated user's organization and enforces selected-member/key eligibility; gateway-signed authorization is required for creation and bundle mutations. It does not introduce a separate owner/admin-only generation gate. Whether product policy should impose that additional role restriction remains an explicit decision below.
Certificates, holder/credential associations and proof-bound quorum parameters are preserved through storage and full-bundle download. See the API implementation.
Keymaker and public key service configuration
Hosted organization-user generation calls both services from Platform only. CLI/UI generation requests cannot supply or override service addresses.
Use operator-managed
KEYMAKER_URLandPUBLIC_CERTIFICATE_SERVICE_URL, together with independently provisioned PCR policies and the Caution CA. A database-backed static-IP registry is not required for this milestone. Missing/invalid required configuration fails affected operations closed. Direct PGP-only CLI generation remains a separate explicit mode; it does not override hosted configuration.Certificate issuance authentication is implemented by Platform
5ebbe00and Locksmith30938f6. Platform requires backend-onlyPUBLIC_CERTIFICATE_SERVICE_TOKEN(32 random bytes encoded as 64 hex characters), matching the custody service's encrypted vault input, and sends it only to/v1/public-certificatesover HTTPS with redirects disabled. PGP-only creation does not need this token. The TLS terminator is trusted with the bearer credential; certificate/proof verification remains independent.The token is not forwarded to Keymaker and does not authorize shard release: public recryption routes retain WebAuthn approval. Hosted Keymaker access control and the original API-network-only reachability requirement are still outstanding; the bearer token does not make either service network-private. Certificate issuance and recryption still share one service/listener, with authentication applied only to issuance.
Local/synthetic validation is recorded with those commits. Live issuance/recovery/restart acceptance for the current candidate is not yet recorded; token provisioning, deployment revisions and independent PCR-policy updates must be included in that record; see the migration and acceptance runbook.
Keymaker concurrency
Keymaker owns its single-use serialization and reset lifecycle, tracked in Locksmith #2. Do not add a Platform semaphore or queue in this milestone.
Platform sends one bounded generation attempt, propagates busy/error/timeout results, and does not retry generation automatically. A timeout can mean generation completed remotely. Each new quorum consumes a fresh Keymaker instance; configured host supervision now replaces terminated instances automatically. Recovery, approval retries and application enclave restarts do not consume Keymaker. Replacement downtime and lost-response outcomes remain explicit failures, without automatic generation replay.
Current Keymaker contract
The shared model defines:
GenerateQuorumRequest::V1, withbundle_id: [u8; 16],label,threshold,maxand structuredkeyring.GenerateQuorumResponse = Proofed<GenerateQuorumBundle>. The outer object is{data, necroproof};datais taggedversion: "V1"and includesbundle_id,label,keyring, requiredthreshold/max,shardfileandpublic_key.Key::OpenPGP { cert }orKey::WebAuthn { credential, cert }. Multiple credentials for one holder authorize one share.keyring_hashor inline payload proof is required. V0, unproofed and earlier V1 bundles missing required quorum parameters are unsupported.Implemented backend generation flow
max, send one bounded current-V1 Keymaker generation request, verify the complete proofed response and compare requested bundle/labels/holders/quorum parameters. Keymaker owns single-use serialization/reset; busy/error/timeout never causes an automatic generation retry.Data/model status
Registered user-owned public PGP keys and credential discovery are implemented. Hosted selection resolves exact active registrations and checks organization ownership; no new PGP-key table is pending for this flow. Service endpoints remain operator configuration, without a database endpoint registry.
Guided dashboard creation is implemented. Remaining work is service access/security, acceptance evidence and the optional owner/admin policy decision. Existing bundles sharing encryption material are not repaired by stricter new-generation checks and need separate assessment/migration if present.
Security requirements
Documentation updates
After the feature lands, update CLI and user-facing docs to explain:
caution secret new --from-org-users;--caution-backed;caution secret new <keyring>users.Do not consider the feature complete without docs. If docs are deferred to a later PR, the implementation PR should use
Refs #...rather than closing this issue.Acceptance criteria
v1::keyring: Vec<Key>from selected existing OpenPGP and Caution/public-key-service-derived WebAuthn certificates./generate_quorumwith the current V1 request and preserves/verifies the complete proof-wrapped V1 response. Legacy V0 callers are unsupported.bundle_id,label,keyring,threshold,max,shardfile, andpublic_key.caution secret init(aliasnew), explicit per-holder custody and the documented--from-org-users/--caution-backedselectors.Suggested tests
threshold > max;GenerateQuorumRequest::V1from mixed existing OpenPGP and Caution/public-key-service-derived WebAuthn certificates;quorum_bundles;Remaining product and access decisions
Resolved implementation choices: canonical 16-byte UUIDs; proof-wrapped current V1 with required threshold/max; V1 Keymaker route; fixed participant/generation API routes; one selected registered PGP certificate or one derived certificate per organization holder; multiple passkeys as one share; server-computed max. These no longer need to be posed as open wire-format questions.
In-repository prerequisite
Keep #383 separate from this issue: #383 defines and implements the certificate derivation/proof service, while this issue tracks the platform API/CLI/dashboard organization-user quorum bundle flow that consumes that service. Do not close this issue until the #383 service contract is implemented and integrated for Caution-backed participants.
Cross-repository implementation dependencies
This platform feature depends on Locksmith/Keymaker work tracked separately:
The platform API/CLI/UI work should treat these as prerequisites before closing this issue: Keymaker must accept/generate V1 bundles from structured key material, Locksmith must verify/load current proofed V1 bundles and reject unsupported legacy formats, and the WebAuthn signed transport plan from
caution/locksmith#7must be implemented for Caution-backed shard recryption.Updated the issue body against latest
caution/locksmithmain(0bb7924). Keymaker models now have top-level V1-only envelopes while the legacyv0structs still exist undergenerate_quorum::v0; the current Keymaker route still servesv0. I also corrected the V1 response fields to match currentkeymaker-models(bundle_id,label,keyring,shardfile,public_key) and left the[u8; 32]bundle-id representation and V1 route migration as explicit open questions.Added cross-repository dependency tracking for the Keymaker/Locksmith prerequisites:
Also cross-linked these from
caution/locksmith#7, leaving that issue as the authoritative WebAuthn transport design thread.The API/CLI V1 flow and WebAuthn recovery are integrated and exercised end to end. Explicit custody selection, membership/eligibility checks, deterministic holder assembly, proof verification, storage and required-artifact deployment preflight are implemented.
Outstanding acceptance differences:
Keep open until these items are implemented or explicitly removed from scope. Update older descriptions of WebAuthn recovery as blocked and record the completed E2E evidence.