Onym Recovery Trustee: Shamir Threshold Implementation
Implementation profile draft 0.1 — August 2026
No one trustee holds the recovery secret. A declared threshold can recover; fewer shares cannot. Availability and collusion move from one provider to a set the holder chooses.
This document maps the abstract Recovery Trustee seat to independently selected trustees holding shares created with Shamir's Secret Sharing. The v1 wire profile uses the final SLIP-0039 share format for interoperability and wraps each share in session-bound public-key encryption for enrollment and recovery.
The client splits a random recovery-unlock key, not the BIP-39 mnemonic text.
That unlock key protects the vault's canonical RecoveryArtifact. This keeps
the trustee profile independent of the identity's seed, curve, or migration
format and lets authenticated decryption reject an incorrect reconstruction.
The profile does not make trustees trustless. Any threshold of them can recover. Too few available trustees permanently block recovery. Human recognition, service authentication, coercion resistance, payment, and operational storage remain separate risks.
1. Conformance declaration
| Abstract concept | Shamir trustee mapping |
|---|---|
| Implementation profile | onym:recovery-implementation:shamir-trustees-slip39-v1 |
| Custody class | Holder-selected t-of-n threshold |
| Protected secret | Random 256-bit recovery-unlock key (RUK) |
| Share format | SLIP-0039, one group with t-of-n member shares |
| Trustee | One independently enrolled member-share slot |
| Protected object | AEAD-encrypted canonical RecoveryArtifact |
| Enrollment transfer | One share HPKE-sealed to one trustee key |
| Recovery transfer | Same share HPKE-sealed to one fresh destination key/session |
| Integrity | Share checksums/reconstruction digest plus final artifact AEAD |
| Individual malicious-share proof | Not provided; this is not verifiable secret sharing |
| Recovery modes | Secret restoration; authority migration when the identity profile supports it |
The profile maps:
onym:recovery-profile:trustee-v1
-> onym:recovery-implementation:shamir-trustees-slip39-v1
An implementation must claim this complete identifier. An arbitrary Shamir library, proprietary mnemonic share, or set of encrypted file fragments is not wire-compatible.
2. Threshold meaning
For t-of-n trustees:
- any
tvalid shares can reconstructRUK; - fewer than
tshares reveal no information aboutRUKunder the secret- sharing construction; - the system tolerates at most
n - tunavailable trustees; and - any
tcolluding, compromised, coerced, or deceived trustees can recover.
Examples:
| Policy | Availability | Collusion boundary |
|---|---|---|
| 2-of-3 | One trustee may be unavailable | Any two can recover |
| 3-of-5 | Two trustees may be unavailable | Any three can recover |
| 5-of-7 | Two trustees may be unavailable | Any five can recover |
There is no universally best threshold. A higher t resists collusion but
increases loss risk. A larger n adds operational and metadata surface. The
UI shows both sentences—“these many can steal” and “these many may disappear”
—before confirmation.
SLIP-0039 supports at most 16 members in one group. This profile therefore
requires 2 <= t <= n <= 16. A 1-of-1 arrangement uses the cloud or another
single-custodian profile, not a misleading threshold label.
3. Trustee selection and independence
A trustee can be:
- a human using a dedicated trustee application;
- an organization with a reviewed recovery process;
- a hardware device kept in another location;
- a paid online trustee service; or
- another automated agent that can protect and release one share.
The holder should select different administrative, credential, device, cloud, geographic, and legal failure domains. Three services owned by one parent, three accounts recovered through one email address, or three virtual machines under one administrator are not meaningfully independent.
Each signed trustee manifest declares an operator and trustDomain. A UI may
warn about known overlap, but cannot prove social or corporate independence
from self-asserted metadata. Investigation by Discovery providers and holder
judgment remain part of the trust decision.
4. Cryptographic construction
4.1 Required suites
The v1 profile uses:
- a 256-bit
RUKfrom a cryptographically secure random source; - AES-256-GCM with a fresh 96-bit nonce for the recovery artifact;
- SHA-256 for protocol object and ciphertext digests;
- SLIP-0039 for one-group
t-of-nmember sharing ofRUK; - RFC 9180 HPKE Base mode using DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, and AES-256-GCM for transfers to trustees and recovery destinations; and
- Ed25519 for fresh session proofs and signed outer enrollment/trustee objects.
The profile pins canonical encodings, byte order, HPKE info, AEAD associated
data, SLIP-0039 parameters, and fixtures. Implementations use reviewed
libraries with cross-platform vectors; they do not implement polynomial
arithmetic in UI code.
4.2 Artifact encryption
The healthy vault serializes the abstract RecoveryArtifact and computes:
identityBindingCommitment = SHA-256(canonical(
"onym-recovery-identity-binding-v1",
identityBindingSalt,
identitySubject,
descriptorDigest
))
AAD = canonical(
implementationProfileId,
enrollmentId,
enrollmentSequence,
policyDigest,
identityBindingCommitment,
recoveryMode,
artifactId
)
artifactCiphertext = AES-256-GCM-Seal(
key = RUK,
nonce = fresh 96-bit nonce,
plaintext = canonical RecoveryArtifact,
associatedData = AAD
)
The client places the ciphertext, nonce, every AAD field, and a digest over the
canonical header and ciphertext into the abstract ProtectedRecoveryArtifact.
That object may be replicated with every trustee or stored through one or more
opaque blob locations. It is not a secret key, but its header, location, and
enrollment binding are private metadata. A recovery policy declares the
artifact availability rule separately from its share threshold.
4.3 SLIP-0039 parameters
This profile encodes the 32-byte RUK as the SLIP-0039 master secret with:
{
"masterSecretBits": 256,
"groupCount": 1,
"groupThreshold": 1,
"memberCount": "n",
"memberThreshold": "t",
"extendableBackup": false,
"passphrase": "",
"iterationExponent": 0
}
The empty SLIP-0039 passphrase is intentional: the declared trustee threshold is the complete cryptographic recovery authority. A forgotten extra passphrase would defeat recovery, while a weak remembered passphrase would add little protection against colluding trustees. A future profile may define a holder-retained factor, but must present the resulting permanent-loss risk and use a new implementation identifier.
SLIP-0039's 15-bit identifier and share metadata help reject mixed share sets, but they are not the Onym enrollment ID. Every share is also carried inside an outer, cryptographically bound 256-bit enrollment and session context.
SLIP-0039 is mostly incompatible with BIP-39. The client must not present a SLIP-0039 trustee share as a BIP-39 recovery phrase or instruct the user to import it into the ordinary Onym seed screen.
4.4 Share envelope
Before delivery, each mnemonic share is represented canonically as lowercase SLIP-0039 words separated by one ASCII space and placed in a private envelope:
{
"shareEnvelopeVersion": 1,
"implementationProfileId": "onym:recovery-implementation:shamir-trustees-slip39-v1",
"enrollmentId": "<random-256-bit-id>",
"enrollmentSequence": 1,
"policyDigest": "<sha256>",
"identityBindingCommitment": "<opaque-commitment-from-policy>",
"artifactDigest": "<sha256>",
"artifactId": "<same-random-256-bit-id-as-protected-artifact>",
"recoveryMode": "secret-restoration",
"trusteeComponentId": "onym:component:<trustee-id>",
"slot": "<random-opaque-slot-id>",
"trusteeChallenge": "<fresh-single-use-challenge-issued-for-this-slot>",
"memberIndex": "<0-through-n-minus-1>",
"memberThreshold": "t",
"memberCount": "n",
"trusteePolicy": {
"candidateFactors": ["<this-trustee-factor-bindings>"],
"cooldown": "P2D",
"sessionLifetime": "P7D",
"maximumAttempts": 3,
"notifications": ["<this-trustee-destination-references>"],
"holderVeto": "<this-trustee-veto-method-and-deadline>",
"lapsePolicy": "<this-trustee-grace-export-destruction-rule>"
},
"slip39Share": "<canonical-share-words>",
"createdAt": "2026-08-01T00:00:00Z",
"expiresAt": "2027-08-01T00:00:00Z",
"authorizationPublicKey": "<recovery-and-trustee-scoped-ed25519-public-key>",
"holderAuthorization": "<ed25519-signature-over-canonical-envelope-with-this-field-omitted>"
}
This signed envelope is the Shamir mapping of the abstract
TrusteeEnrollmentAuthorization: it contains the full-policy digest and only
this trustee's identity, slot, share parameters, and enforcement policy. The
holder authorization authenticates every envelope field, including the share,
before the entire envelope is HPKE-sealed to that trustee. HPKE Base mode
provides confidentiality to the trustee; the Ed25519 authorization provides
sender authentication. Only the intended trustee learns its member index,
policy, or words. The coordinator receives a ciphertext and digest, not the
share or the full trustee roster.
The authorization proves control of the recovery-scoped enrollment key, not a claimed human relationship. A human trustee independently confirms the invitation and displayed key fingerprint with the holder before accepting; a name, avatar, message, or valid self-created key alone cannot establish who asked them to become a trustee.
Trustees never send share words through email, SMS, ordinary messenger chat, support tickets, a public notary, clipboard telemetry, or QR codes rendered by an untrusted web page. A human trustee uses a conforming app that decrypts, stores, and later re-encrypts the envelope without displaying words by default.
5. Enrollment ceremony
5.1 Preconditions
While the identity is healthy, the holder selects:
- recovery mode and identity/descriptor binding;
tandn;- exactly
ncurrent trustee manifests and enrollment public keys; - each trustee's candidate-recognition/factor policy;
- cooldown, notifications, veto, session lifetime, and attempt limits;
- protected-artifact locations and replication rule; and
- each trustee offer, term, lapse, export, and deletion behavior.
Each trustee then issues a fresh, expiring, single-use enrollment challenge after accepting the human invitation or authenticating the service enrollment and entitlement. A published HPKE key without this challenge is insufficient to create stored trustee state.
The UI highlights shared failure domains and refuses duplicate component IDs, duplicate member indices, duplicate slots, expired manifests, or incompatible implementation profiles.
5.2 Generate and distribute
The healthy vault:
- creates a random enrollment ID,
RUK, artifact ID, and artifact nonce; - encrypts the canonical artifact with
RUKand the exact enrollment AAD; - invokes a conforming SLIP-0039 implementation to create
nshares at thresholdt; - creates one outer share envelope per trustee containing only that trustee's policy and slot, then signs it with the distinct recovery-and- trustee-scoped Ed25519 authorization key recorded for that slot;
- HPKE-seals each signed envelope to that trustee's current enrollment public
key, binding the profile, policy, enrollment, artifact, trustee, slot,
trustee-issued challenge, and authorization-key digest in
info; - sends the protected artifact and only the intended sealed share to each selected trustee;
- collects and verifies all
nsigned enrollment receipts; - creates and verifies the encrypted recovery map defined below; and
- destroys plaintext shares and
RUKfrom process memory on a best-effort basis after activation.
The enrollment is not active if fewer than n selected trustees acknowledge.
The holder may deliberately create a revised policy with a lower n; the UI
must not silently activate a partially enrolled set under the old policy.
It is also not active until the holder confirms a usable recovery-map copy and
its separate map key.
5.3 Trustee receipt
Each trustee:
- decrypts the envelope and verifies its recovery-and-trustee-scoped Ed25519 holder authorization over every field;
- verifies the exact abstract and implementation profiles, its own component and slot, the artifact digest, the opaque full-policy digest binding, and its local trustee policy;
- consumes the matching unexpired, single-use challenge and refuses an unsolicited or replayed enrollment;
- accepts only the current enrollment sequence for that enrollment and authorization key, refusing replay or rollback;
- validates the SLIP-0039 checksum, member threshold, member count, and member index against the signed envelope;
- confirms any invitation or human relationship through the prearranged independent path rather than trusting display text; and
- stores the share under its local protection and verifies durable read-back before returning:
{
"receiptVersion": 1,
"operation": "enroll",
"componentId": "onym:component:<trustee-id>",
"enrollmentId": "<same-id>",
"enrollmentSequence": 1,
"policyDigest": "<same-sha256>",
"artifactDigest": "<same-sha256>",
"artifactId": "<same-artifact-id>",
"slot": "<same-slot>",
"sealedContributionDigest": "<digest-of-enrollment-ciphertext>",
"storageClass": "<manifest-declared-class>",
"status": "active",
"storedAt": "2026-08-01T00:00:00Z",
"expiresAt": "2027-08-01T00:00:00Z",
"signature": "<trustee-signature>"
}
The receipt proves the trustee's assertion, not continued possession. The client should request signed, non-secret readiness attestations periodically and prompt replacement before the active set falls below policy.
5.4 Offline verification drill
The holder may perform a recovery drill to a temporary local destination. The
client gathers t destination-encrypted shares, reconstructs RUK, verifies
the artifact, and then destroys the temporary plaintext without changing the
identity. Trustees and the client label the session drill in its private
policy context.
A drill exercises real recovery authority and leaks recovery timing to the selected trustees. It is rate-limited, notified, and never run silently by telemetry or a background health check.
5.5 Recovery map and fresh-device bootstrap
The complete trustee roster cannot be public or sent to every trustee, but a
fresh device still needs it. After enrollment, the healthy vault creates this
private ShamirRecoveryMap:
{
"recoveryMapVersion": 1,
"recoveryProfileId": "onym:recovery-profile:trustee-v1",
"implementationProfileId": "onym:recovery-implementation:shamir-trustees-slip39-v1",
"enrollmentId": "<current-enrollment-id>",
"enrollmentSequence": 1,
"policy": "<canonical-holder-private-RecoveryPolicy>",
"protectedArtifact": "<ProtectedRecoveryArtifact-or-private-locators>",
"trusteeManifests": ["<current-signed-manifest-for-each-trustee>"],
"trusteeReceipts": ["<signed-current-enrollment-receipts>"]
}
The map contains no RUK, root secret, mnemonic, or trustee share. It does
contain a sensitive social graph and recovery-routing metadata. The vault
encrypts it with AES-256-GCM under a separate random 256-bit recovery-map key
and fresh nonce, binding the implementation profile and a random map ID as
associated data. The ciphertext may be replicated; the holder stores the map
key offline as a recovery card, QR, hardware record, or another independently
chosen private channel.
On a fresh device, the candidate imports the map ciphertext and key. The vault
authenticates and decrypts it, verifies policy and receipt signatures, rejects
rollback, retrieves the current protected artifact, and constructs the
abstract RecoveryBootstrap. The candidate can then address the current
trustees and build RecoverySession without the old identity key.
A trustee or paid provider may additionally offer authenticated lookup of its own slot, but the base profile has no public roster discovery. If the holder loses every recovery-map key and cannot rediscover enough trustees through prearranged relationships or provider accounts, recovery may fail even though the shares still exist. The enrollment UI tests recovery-map import and states this limitation explicitly.
6. Recovery session
6.1 Candidate request
Using the verified recovery map or a profile-compatible private lookup, the
recovering vault obtains the enrollment ID, current sequence, policy digest,
artifact ID, protected artifact and digest, and trustee routes. It then
generates a fresh HPKE destination key, a fresh Ed25519 session-proof key, and
a random session ID, and builds and signs the abstract RecoverySession. The
proof shows control of the request and binds the HPKE key; it does not
authenticate the old identity. The request includes the bootstrap bindings,
both destination keys, expiry, and factor evidence permitted for each trustee.
The old identity cannot be required to sign the request. Authentication comes from the pre-enrolled trustee policy: human recognition, an offline recovery code, a surviving independent authenticator, institutional proof, or another declared mechanism. A trustee does not learn or demand factors enrolled only with another trustee.
6.2 Trustee decision
Each trustee independently:
- resolves the exact current enrollment and rejects stale sequences;
- verifies the session signature made by the fresh proof key and its binding to the HPKE destination key;
- checks its local candidate policy and allowed factor evidence;
- applies attempt limits, cooldown, independent notification, and veto;
- confirms that the requested artifact digest and recovery mode match;
- decrypts its stored share envelope only inside its protected trustee application or service;
- seals the share envelope to the session destination with HPKE; and
- signs an abstract
TrusteeContributionor bounded refusal.
HPKE info includes:
"onym-shamir-recovery-contribution-v1",
sessionId,
enrollmentId,
enrollmentSequence,
policyDigest,
artifactId,
artifactDigest,
trusteeComponentId,
slot,
destinationKeysDigest,
expiresAt
A signature or share response from another session, destination, enrollment, or sequence is invalid even if the underlying SLIP-0039 words are genuine.
6.3 Coordination
Any party can coordinate the session. The new client may contact trustees directly, use one trustee as coordinator, or use a separately operated relay. The coordinator may count signed approvals and relay ciphertext, but cannot decrypt contributions or lower the threshold.
The candidate can collect contributions asynchronously until the session expires. Only one contribution per distinct current slot counts. Duplicate component IDs, member indices, or signatures do not create extra threshold weight.
6.4 Local reconstruction
After receiving at least t valid contributions, the recovering vault:
- verifies every trustee manifest, signature, slot, sequence, policy, artifact, session, destination, and expiry binding;
- HPKE-opens contributions with the session destination private key;
- validates outer envelopes and SLIP-0039 checksums;
- rejects mixed identifiers, thresholds, groups, member indices, or duplicate shares;
- combines exactly the profile-compatible shares locally to reconstruct
RUK; - reconstructs the enrolled associated data from the verified protected- artifact header and opens the artifact using AES-256-GCM;
- verifies the identity subject, descriptor digest, artifact schema, and recovery mode;
- imports or migrates inside the vault's holder-facing recovery ceremony;
- binds fresh device authentication and executes downstream compromise review; and
- destroys plaintext shares,
RUK, artifact plaintext, and both session private keys from memory on a best-effort basis.
The client never uploads the reconstructed RUK or plaintext artifact to the
coordinator, trustees, crash service, or notary.
6.5 Integrity without verifiable secret sharing
SLIP-0039 checksums help detect damaged encodings and its recovered-secret digest helps reject an incorrect combination. The final AES-GCM tag and identity binding provide another mandatory integrity check.
This profile does not implement Feldman, Pedersen, or another verifiable secret sharing scheme. A trustee can submit a well-formed but wrong share and cause recovery failure; the basic profile may not identify which trustee cheated. The UI says “invalid contribution set,” not “artifact lost,” and preserves signed evidence for a private dispute.
Clients do not auto-correct mnemonic words or silently search broad share subsets. Automated correction can transform invalid input into different valid input. Any diagnostic retry is explicit, bounded, local, and never reveals share contents.
7. Operation mapping
| Abstract operation | Shamir behavior |
|---|---|
enroll |
Deliver one HPKE-sealed SLIP-0039 share per trustee and replicate artifact |
read-enrollment |
Return signed per-trustee sequence, expiry, and non-secret readiness |
bootstrap-recovery |
Decrypt and verify the holder's recovery map or use declared private trustee/provider lookup |
begin-recovery |
Create one destination-bound request for the current trustee set |
contribute-recovery |
Each approving trustee HPKE-seals its stored share to the destination |
read-recovery |
Aggregate signed non-secret session and contribution status |
cancel-recovery |
Candidate or enrolled veto cancels collection; trustees refuse later release |
finalize-recovery |
Client records successful local combine/import and may notify trustees |
rotate-enrollment |
Create a fresh RUK, artifact, SLIP-0039 set, and enrollment sequence |
revoke-enrollment |
Every reachable trustee destroys/revokes its old slot; client treats sequence as invalid |
export-enrollment |
Obtain threshold contributions to a fresh holder-controlled destination |
close-enrollment |
Revoke policy and request share/artifact deletion from all trustees |
No single trustee can complete export-enrollment or recovery. A trustee's
valid contribution is necessary evidence but not a successful recovery.
8. Rotation and trustee replacement
This profile does not support in-place addition, removal, or renumbering of one ordinary share. Every policy or trustee-set change creates:
- a new random
RUK; - a newly encrypted artifact;
- a fresh SLIP-0039 identifier and complete share set;
- a higher enrollment sequence; and
- new receipts from all newly selected trustees.
A healthy vault can create this new enrollment directly from the identity
material it already controls. A recovering vault first obtains t old shares,
restores locally, and then performs the new enrollment. Only after the new set
is verified active does it revoke and request deletion of every old share.
Deletion receipts cannot prove a trustee made no copy. Fresh RUK and
ciphertext prevent old shares from opening the new enrollment, but old shares
can still open an old artifact copy. In secret-restoration mode, that old
artifact may contain the same root secret. Strong revocation therefore
requires authority migration and downstream support, not merely re-sharing.
Proactive share refresh without reconstructing the secret and verifiable distributed key generation are possible research directions, but are outside this v1 profile.
9. Lapse and availability
Each trustee defines its own offer and lapse policy. The holder's local recovery dashboard computes current readiness from fresh signed status:
active compatible trustees >= t -> threshold presently reachable
active compatible trustees < t -> recovery endangered
This is not a guarantee of future cooperation. A synchronized outage, jurisdictional order, disaster, account compromise, or human refusal can still remove several trustees together.
A paid trustee must declare grace, export, deletion, and whether an unpaid
record can still approve recovery. A lapsed trustee cannot charge an
undisclosed emergency fee. The UI prompts a healthy holder to re-share before
the remaining active set approaches t.
The policy may mix free human trustees and paid providers. Payment failure at one provider does not change the cryptographic threshold or appoint a replacement.
10. Human trustee experience
A conforming human-trustee application:
- explains that accepting a share creates a security and availability duty;
- verifies the holder's invitation and profile before accepting;
- stores the share under local device authentication and encrypted backup rules declared to the holder;
- displays an opaque holder-chosen label locally without publishing the social relationship;
- reminds the trustee to review readiness periodically without exposing share words;
- shows recovery destination fingerprint, request age, declared reason, cooldown, and independent contact instructions;
- requires deliberate approval and never approves from a notification tap;
- supports refusal, suspected-fraud reporting, device migration, and holder-requested deletion; and
- does not treat possession of the holder's public profile or a convincing story as protocol proof.
Human recognition is subjective. The holder should prearrange how a trustee will recognize a legitimate candidate under device loss and what independent contact path to use. The app must not upload address books or infer trustees without consent.
11. Trustee storage obligations
Each trustee protects its share at rest using its declared storage class. A service trustee may use an HSM/KMS; a human trustee app may use platform secure storage and an encrypted, separately controlled device backup. The manifest states whether the share survives device loss and who can restore it.
A trustee must:
- keep enrollment and recovery private;
- prevent share export through routine logs, UI, support, clipboard, or analytics;
- reject stale or malformed outer envelopes;
- authenticate local operators and protect release keys;
- issue readiness, approval, refusal, rotation, and deletion receipts;
- notify under the enrolled policy;
- disclose loss or suspected copy of a share promptly; and
- never transfer the slot to another operator without a full holder-authorized re-enrollment.
Replicating one trustee's share improves that trustee's availability but does not add a trustee. If another party can restore the replica independently, the operator must disclose that party inside its trust domain.
12. Privacy boundary
Each trustee can learn that it serves one opaque enrollment, the locally chosen holder label if any, its own candidate factors, recovery attempts sent to it, payment state, and its own decision. It need not learn the other trustees or the holder's messages, names, groups, addresses, balances, or applications.
The client retains the canonical RecoveryPolicy and full trustee array. It
sends a trustee only the signed share envelope that maps the abstract per-
trustee authorization: the common policy digest plus that trustee's component,
slot, share parameters, and enforcement terms. The trustee cannot recompute
the private full-policy digest, but can verify the holder signature over its
own complete duties and require all later requests to bind that digest.
The coordinator can observe which endpoints participate, timing, payload sizes, and completion status unless a stronger routing profile hides them. The encrypted artifact and shares must not be posted to a public ledger merely to coordinate availability.
The client should contact trustees independently or through privacy-preserving transport, pad contribution envelopes where a profile specifies it, and use scoped trustee/account keys. These measures reduce linkability; they do not hide trustee relationships from a global network observer.
Recovery receipts remain private. A dispute may disclose the minimum receipt necessary to the selected adjudicator. Publicly naming a human trustee can create coercion and targeting risk.
13. Payment and incentives
Every trustee defines its own payment model. An offer may be:
- voluntary and free;
- reciprocal between identities;
- one-time per enrollment or re-sharing ceremony;
- periodic for protected storage and readiness;
- per reviewed recovery request; or
- institution-funded.
A threshold enrollment may contain different offers and rails. The client shows the total expected cost and the consequences of each independent lapse. Payment is made to each selected trustee under its offer, after disclosed channel fees, taxes, refunds, UI/broker splits, and contributor shares.
A trustee earns only for its declared service. It gains no ownership of the
identity, no right to see other trustees, no vote in unrelated seats, and no
royalty on the holder's later messages, assets, banking, charity, or recovery.
Approval cannot be sold to an attacker: a recovery fee buys policy evaluation
or completed service, not a guaranteed approved decision.
14. Threat summary
| Failure | Consequence | Mitigation or honest limit |
|---|---|---|
Fewer than t trustees available |
Permanent or delayed recovery failure | Choose n - t tolerance, independent domains, readiness checks, timely re-sharing |
Any t trustees collude |
They reconstruct RUK and artifact |
Choose trusted independent parties; threshold defines, not removes, this risk |
Candidate deceives t trustees |
Unauthorized recovery | Prearranged factors, session-bound destination, cooldown, notification, independent verification |
| Coordinator compromised | Metadata exposure, delay, censorship | Direct/multiple routes; HPKE prevents share plaintext disclosure |
| One share stolen | No recovery below threshold, but loss of safety margin | Prompt disclosure and complete re-sharing |
| Malicious wrong share | Recovery fails and culprit may be unclear | Outer signatures, SLIP-0039 checks, final AEAD; VSS is out of scope |
| Mixed old/new shares | Invalid reconstruction or rollback attempt | Enrollment sequence, artifact digest, fresh identifier, strict set validation |
| Trustee copied an old share | Old artifact may remain recoverable | Fresh enrollment protects new artifact; migrate root authority for strong revocation |
| Recovering device compromised | Plaintext is stolen after combination | Trusted endpoint ceremony, minimal memory lifetime, immediate rotation |
| Public trustee graph | Coercion and correlation | Private enrollment/receipts, scoped IDs, no public ledger by default |
15. Conformance fixtures
In addition to the abstract suite, the profile publishes and tests:
- generation and combination vectors for 2-of-3, 3-of-5, and boundary
n = 16SLIP-0039 sets; - holder-authorized enrollment envelopes and refusal of missing, invalid, wrong-key, wrong-trustee, or stale-sequence authorizations, plus a fixture proving that one envelope contains no other trustee entry and that an unsolicited or reused trustee challenge is refused;
- canonical share words and strict rejection of mixed identifiers, groups, thresholds, duplicate indices, invalid checksums, and unsupported parameters;
- AES-256-GCM artifact vectors with every associated-data binding changed in negative cases;
- enrollment HPKE vectors for each trustee and recovery HPKE vectors for a fresh destination;
- recovery-map encryption, authenticated import, current-sequence bootstrap, rollback refusal, and failure after all bootstrap paths are lost;
- rejection of a valid share response replayed into another session, destination, enrollment, or sequence;
- threshold completion with
tcontributions and non-completion witht - 1; - malicious well-formed share and final artifact-integrity failure;
- cooldown, veto, refusal, timeout, duplicate trustee, and late contribution;
- full re-sharing on threshold or trustee-set change and refusal of every old contribution against the new artifact; and
- log, crash, UI snapshot, clipboard, notification, and analytics scans for
share words,
RUK, artifact plaintext, candidate factors, and destination private keys.
Cross-platform fixtures must run in every supported vault and trustee app. Round-tripping through one library alone does not prove interoperability.
16. Status
This is a proposed implementation profile, not a deployed Onym recovery network. Production use requires canonical fixtures, reviewed libraries, independent cryptographic and UX assessment, trustee applications, incident procedures, full recovery and re-sharing drills, and clear provider/human trustee terms.
References
- Adi Shamir, “How to Share a Secret,” Communications of the ACM 22(11), 1979: https://doi.org/10.1145/359168.359176
- SatoshiLabs, “SLIP-0039: Shamir's Secret-Sharing for Mnemonic Codes”: https://github.com/satoshilabs/slips/blob/master/slip-0039.md
- IETF RFC 9180, “Hybrid Public Key Encryption”: https://www.rfc-editor.org/rfc/rfc9180
- NIST SP 800-38D, “Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC”: https://csrc.nist.gov/pubs/sp/800/38/d/final
This document is maintained in the public onym-system repository and rendered here from a pinned commit. The repository is the authoritative source — latest version on main →