Keymaker: generate v1 quorum bundles from structured OpenPGP/WebAuthn keys #10
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
V1 generation is implemented; final review and acceptance mapping remain.
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: Structured external-PGP/passkey/mixed holders, quorum dimensions, certificate capabilities, independent holder key identities, preserved credential associations, and the complete proof-bound response are implemented. The accepted scope excludes V0 generation; explicit ImportedV0 recovery does not change this.
Remaining: Map the retained generation/negative-case criteria to current tests and complete review/merge of PR #15. Hosted access and actual network restrictions are tracked in Platform #349; termination/replacement behavior in #2. Record the exact deployed Keymaker/PCRs for integrated acceptance. These operational requirements are not missing V1 schema implementation.
Evidence: current implementation/documentation, V1 contract. The September 23 default release suite passed 11 tests; all 19 certificate-service cases passed across the initial run and socket-permission rerun. Those results apply to
c33e35e, not a fresh full-suite run of the later terminology change. Earlier generation/model/loader/synthetic results remain scoped to the revisions recorded in their documentation. Current PRs remain open/unmerged.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.Motivation
Platform's organization-user quorum flow needs to assemble typed key material from:
The public certificate service now generates its own per-request bundle UUID, derives OpenPGP public certificates for the requested organization/count, embeds organization and bundle identity as critical Caution CA UID certification notations, and returns a
Proofed<PublicCertificateBundle>containingdata.bundle_idplus armored public certificates. Platform uses those returned certificates and bundle id when assembling the Keymaker v1 request.The implementation now accepts the shared V1 request envelope and returns proofed V1 responses; the legacy V0 route is not retained. The new flow should not depend on clients submitting arbitrary service URLs, arbitrary derivation paths, or untyped JSON blobs.
Generation requirements
keymaker_models::generate_quorum::GenerateQuorumRequest::V1at/generate_quorum; reject legacy V0 requests clearly.bundle_idas canonical 16-byte UUID bytes.threshold,max, andkeyring.len()consistently; rejectthreshold == 0,threshold > max, and mismatchedmax.Key::OpenPGP { cert }for user-provided OpenPGP certificates;Key::WebAuthn { credential, cert }for Caution-backed/WebAuthn-associated certificates.keyring_hashor inlinenecroprooffields exist on v1.bundle_id,label,keyring,threshold,max,shardfile, andpublic_key.Acceptance criteria
/generate_quorumaccepts valid v1 requests and returns valid v1 responses.max, malformed/unsupported certs, duplicate effective keys, and mismatched bundle-context data where that context is present in certificate metadata.bundle_id,label, structuredkeyring,thresholdandmaxmatch the request, thatshardfile/public_keyare parseable, and that the outer proof covers the complete V1 payload.Key::OpenPGPandKey::WebAuthnentries.keyring_hashor inlinenecroproof; the current response requires its top-level proof envelope.Related work
Updated this issue for the finalized public certificate service foundation on current
main.Main consistency fixes:
bundle_idwith the current[u8; 16]model;keyring_hash/necroprooffields for v1.Updated per reviewer clarification: Keymaker should not load a Caution quorum or re-derive Caution-backed public certificate material for v1 generation.
The issue now treats the platform API/public certificate service boundary as responsible for deriving/validating Caution-backed certificates before they reach Keymaker. Keymaker's initial v1 responsibility is to parse the submitted certs, enforce shard-generation key capability requirements, preserve
Key::WebAuthn { credential, cert }associations, and return the structured v1 bundle without requiring public-cert-service trust anchors or necroproof verification.Platform now supports PGP-only, WebAuthn-only and mixed bundle creation.
Platform commits:
ee9ab08,706b2d8; quorum-parameter binding: Locksmith0e70535, Platformf2d0ab4.Real certificate-service bootstrap and Nitro validation remain outstanding. This does not implement WebAuthn recovery or complete legacy compatibility.
V1 generation is implemented and integrated into the demonstrated end-to-end flow: structured OpenPGP/WebAuthn/mixed inputs, quorum/certificate/duplicate-key validation, preserved credential associations and proof-bound output.
Remaining acceptance gap: the route only accepts V1; the promised legacy V0 request path is absent. Keep this issue open unless that compatibility requirement is explicitly retired.
Please also reconcile the contract wording:
Fully implemented.