onepub-dev / onepub-dev/reVault
Define lockbox signer trust, authorship, and multi-author authorization
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 4
- Forks
- 0
- Avg merge
- 1h 55m
- Merged PRs (30d)
- 1
Description
Context
The lockbox format embeds owner public signing keys and signatures alongside the
commit-auth record. This is enough to test whether the commit was signed by the
corresponding private key, but an embedded key does not establish who controls
that key or whether that person was allowed to modify the lockbox.
If an attacker can replace an archive and the only trust material is inside that
same archive, the attacker can insert a new key, rewrite the content, and sign
the replacement. Verification will report a mathematically valid signature but
cannot honestly report "Alice authored this". Trust must come from outside the
artifact.
Related: #211 covers the original signature-validation question, #226 designs
reciprocal exchange of signing keys, and #227 defines signed/unsigned
plaintext/encrypted artifacts.
What an embedded public key is useful for
An embedded signing key is not worthless. Before identity trust exists it can:
- prove possession of the private key corresponding to that commit;
- provide a stable fingerprint for independent verification or TOFU pinning;
- bind a complete commit and its history against undetected modification after
the key has been pinned externally; - allow a later trust decision to be applied to an already received artifact;
- identify unexpected signer changes relative to locally stored state.
It must initially be labelled valid but untrusted, not "authentic" or
"authored by Alice".
Required assurance layers
Treat these as independent results:
- Integrity: the committed root matches the archive state.
- Signature validity: the signature verifies under the stated public key.
- Identity trust: the public key is bound to a contact through an
independently trusted process. - Author authorization: that trusted contact/key was permitted to create
this commit under the lockbox author policy at that point in history. - Freshness: the artifact is not an older, otherwise valid version.
A failure or unknown result at one layer must not be hidden by success at
another.
Multiple authors and authority
Reading/decrypting a lockbox must not automatically grant signing authority.
When multiple people may modify a lockbox, the format needs an explicit author
policy rather than one self-declared owner key.
The model should distinguish:
- recipients/readers who can decrypt content;
- authorized authors who can sign new commits;
- administrators/owners who can add, remove, rotate, or recover author keys;
- the signer of each historical commit;
- the current authorized-author list;
- the observed list of authors in retained history.
Author-policy changes must themselves be authorized and committed. Removing an
author must prevent that author from signing later commits without erasing the
fact that earlier commits were validly authored while the key was authorized.
The design must define quorum/threshold requirements for author-policy changes,
key recovery, and owner loss rather than assuming that any current writer can
silently replace the whole policy.
Trust establishment
The trusted binding belongs in the local vault/contact store, not in claims made
by the lockbox. A received signing key should start as pending/untrusted and
become trusted only after fingerprint verification through an independent
channel or another explicit policy source.
#226 proposes exchanging encryption and signing keys atomically while keeping
the trust decisions local and independent. Key transport, email control, a
profile name, and a self-signature are evidence, but none alone proves human
identity.
Key rotation should be accepted automatically only when the new key is signed
by a currently trusted key under the rotation policy. Lost-key recovery needs a
separate, explicit verification path and must not inherit trust silently.
User trust policies
Provide an explicit policy for opening and operating on archives:
permissive accept signed or unsigned archives; report all assurance results
warn continue, but prominently warn for absent, invalid, untrusted, or
unauthorized signatures
strict reject unsigned archives and commits that are invalid, untrusted,
or unauthorized
Invalid signatures should normally be treated more severely than absent
signatures because an invalid signature indicates corruption, tampering, an
incomplete write, or a broken implementation. Commands that mutate, extract,
execute, or consume secrets may need stricter defaults than read-only inspect.
The CLI/API should show a concise author list with fingerprint, contact binding,
trust state, authorization interval, commits signed, rotation/revocation state,
and how the trust decision was established.
Format and state questions
- Define a stable signer/key ID derived from canonical algorithm and public-key
bytes; do not use a display name as identity. - Bind the full author policy, signer key ID, commit sequence, previous commit,
archive mode, and logical root into the signed message. - Decide whether every commit has one author signature, multiple co-signatures,
or policy-dependent thresholds. - Decide what author metadata is public and what remains encrypted; public
signer data improves pre-decryption verification but leaks relationships and
identity metadata. - Define the external local trust record and its binding to contact generation,
signing-key rotation, and archive UUID/policy. - Define whether TOFU is supported, how it is presented, and how a changed key
is handled without training users to approve substitutions. - Define an external freshness anchor or explicitly report freshness as unknown
for standalone files. - Ensure whole-file replacement, signature stripping, author-policy rollback,
and cross-lockbox signature reuse cannot be mistaken for authorized history.
Threats and failure cases
- Embedded-key substitution and complete archive replacement.
- A valid signature from an unknown or malicious key.
- A trusted contact key that was never authorized for this lockbox.
- A reader/content-key holder attempting to become an author.
- Compromise, loss, rotation, expiry, or revocation of an author key.
- A removed author signing a later fork or replaying an older author policy.
- Signature stripping or signed-to-unsigned downgrade.
- Rollback to an older fully valid archive.
- Cross-archive, cross-profile, or cross-generation signature replay.
- Misleading names/emails inside an archive.
- Partial multi-signature commits and disagreement about threshold policy.
- Trust-store loss, restore, merge conflicts, and inconsistent trust decisions
across a user's devices.
Existing planning notes
rust/revault_lockbox_api/ARCHIVE_FORMAT.mddefines the current embedded
Ed25519 and ML-DSA-65 owner keys/signatures, commit chain, and external
freshness limitation.rust/revault_lockbox_api/README.mddescribes owner signing as write authority
and currently requires both signature algorithms.rust/revault_lockbox_api/IMPLEMENTATION_GUIDE.mddocuments the current
commit-auth write sequence.docs/format_versioning_and_migrations.mdanddocs/migration_guide.md
document that migration creates a new commit/signature history.rust/revault_key_server/CLI_VAULT_PUBLISH_DESIGN.mdalready distinguishes
signed key rotation from unsigned recovery and only auto-accepts rotation
under the previously verified signing key.- #211 and #226 contain the key-exchange and independent-fingerprint trust
planning that should feed archive verification.
Plan
- Write the signer/authorship threat model and normative assurance vocabulary.
- Define the vault contact trust record, fingerprint, verification evidence,
trust transitions, and persistence/backup behavior. - Define the versioned lockbox author policy, roles, authorization intervals,
policy-change authority, and threshold/quorum rules. - Define canonical signed fields and domain separation for commits, policy
changes, rotation, recovery, and archive modes. - Define author history, removal, revocation, rotation, and recovery semantics.
- Define permissive/warn/strict policy behavior for inspect, open, extract,
execute, copy, share, and mutate operations. - Specify CLI/API verification reports and author-list UX without overstating
unknown identity or freshness. - Connect #226 contact trust records to lockbox signer matching and author
authorization checks. - Decide whether format changes and migration/export tooling are required.
- Add adversarial tests for substitution, stripping, downgrade, replay,
rollback, unauthorized writers, removed authors, rotation, recovery, and
threshold failures. - Update the archive format, security model, key exchange, user guide, and
troubleshooting documentation. - Complete an independent security review before trusted-authorship claims
are enabled by default.
Acceptance criteria
- Verification reports integrity, signature validity, identity trust, author
authorization, and freshness independently. - An embedded or self-signed key is never treated as trusted by itself.
- Users can inspect current authorized authors and historical commit signers.
- Decryption/read access does not imply signing/write authority.
- Author additions, removals, rotations, recovery, and historical validity have
documented and tested semantics. - Reciprocal exchange supplies candidate signer keys, while an independent local
decision establishes trust. - Permissive, warn, and strict modes behave consistently across CLI and API
operations. - Signature stripping, key substitution, unauthorized signing, policy rollback,
and cross-context replay are detected. - Standalone rollback limitations are clearly reported unless an external
freshness anchor is available. - Documentation never says "authored by X" unless the signature is valid, X's
key is trusted, and X was authorized for that commit.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with rust/revault_lockbox_api/ARCHIVE_FORMAT.md, README.md, and IMPLEMENTATION_GUIDE.md, then review issues #211 and #226 for existing signing and trust assumptions. This is a broad security-design effort: completion requires documented assurance layers, author-policy and trust semantics, CLI/API behavior, adversarial tests, and updates to the listed format and user documentation.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- cryptography, security
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100