Skip to content

[mip-001] envelope: per-owner vault-envelope key so hardware co-owners can open shares - #4

Open
ganymedio wants to merge 2 commits into
mainfrom
mip-001/vault-envelope-key-hardware
Open

[mip-001] envelope: per-owner vault-envelope key so hardware co-owners can open shares#4
ganymedio wants to merge 2 commits into
mainfrom
mip-001/vault-envelope-key-hardware

Conversation

@ganymedio

@ganymedio ganymedio commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Problem

MIP-001's dk[Vault] envelope encrypts to the birational map of each co-owner's on-chain Ed25519 key, which opens only with the Ed25519 private scalar. A hardware wallet never exposes that scalar and has no ECDH/decryption primitive (it only signs), so a Ledger co-owner cannot open the envelope — leaving only the manual mv-dk-vault-raw-v1: copy-paste fallback. Multisig treasuries are a primary hardware use case, so this is a real UX gap.

Fix: per-owner vault-envelope key (vek)

Replace the recipient encryption key with a per-owner vault-envelope key — an X25519 keypair where:

  • the private half is reconstructable per backing and never persisted at rest: hardware → derived from a device signature over a fixed message; software → a mnemonic sub-path (…/2'/0'); keyless → pepper HKDF;
  • the public half is published to a new off-chain vault-envelope-key registry (alongside the envelope store; no new Move module), authenticated with an Ed25519 ownerSig the dealer verifies against the owner's on-chain key before sealing.

This lets hardware co-owners open envelopes using only the device's signing capability — no key export — while keeping the store's end-to-end-encryption trust model intact (a malicious store can't substitute a recipient key without forging the owner's signature).

Notes

  • No version bump. None of the software has been released, so v1 is redefined in place rather than introducing v2.
  • Payload unchanged. dk[Vault] still travels only inside the envelope; only the recipient encryption key changed.
  • Threads through: high-level overview, hardware-wallets section, data-ownership table, envelope format/seal/open, initial-share flow, SDK required-changes ([mip-001] envelope: per-owner vault-envelope key so hardware co-owners can open shares #4), reference implementation, and the security trust model.

…s can open shares

The dk[Vault] envelope encrypted to the birational map of each co-owner's
on-chain Ed25519 key, openable only with the Ed25519 private scalar — which
hardware wallets never expose. Since multisig treasuries are a primary hardware
use case, replace the recipient key with a per-owner vault-envelope key (vek):

- private half reconstructable per backing (device signature on hardware,
  mnemonic path on software, pepper HKDF on keyless), never persisted at rest;
- public half published to a vault-envelope-key registry and authenticated with
  an Ed25519 ownership signature the dealer verifies against the owner's
  on-chain key before sealing.

No version bump — nothing has shipped, so v1 is redefined in place. The payload
(dk[Vault]) and the store's end-to-end-encryption trust model are unchanged.
```
{ ownerAddress, vekPub, ownerSig }
ownerSig = Ed25519-Sign(ownerSigningKey,
utf8("MovementConfidentialAsset/VaultEnvelopeKey/v1") ‖ vekPub)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here I think ownerAddress should also be included in the signed payload, so that when the key pair is lost or leaked, the existing ownerSig can't be replayed to register that vekPub under a different address

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, updated payload to include ownerAddress.

…/TOC + envelope appendix

- ownerSig now signs domain ‖ ownerAddress ‖ vekPub so a valid signature
  cannot be replayed to register a vekPub under a different address (one
  Ed25519 key can be authoritative for more than one account via key
  rotation or reuse). Updated in the registry definition, the dealer
  verification, the SDK signVaultEnvelopeKey/verifyVaultEnvelopeKey spec,
  and the Security Considerations trust model.
- Add a bulleted TL;DR and a table of contents after the title.
- Move the mv-dk-vault-v1 wire format, per-recipient sealing, and opening
  into Appendix A; leave a one-line pointer in Multisig accounts and fix
  the affected cross-references.
@ganymedio
ganymedio requested a review from rubujubi July 24, 2026 14:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants