Key Lifecycle/PROTOCOL

Decentralized Account Recovery

User-initiated recovery when access is lost. Email-based distributed challenge validated by ORK nodes, producing new PRISM shares via the shared DKG ceremony - without the key ever materializing.

25 min read

Overview

This document specifies the Decentralized Account Recovery ceremony - the protocol by which a user reclaims authority over their digital identity after losing access to their password or device. Recovery is user-initiated: the user provides their username, the ORK swarm independently dispatches recovery emails, and the user clicks a threshold (t=14t = 14) of links to authorize the generation of a new PRISM secret.
Architecturally, this protocol is a different authorization front-end to the same PRISM DKG back-end used in Protocol: PRISM Password Change. The email challenge (Phases 1-4) replaces the ConvertPass PRISM preamble. Once tt authorization tokens are collected, the DKG ceremony (Phases 5-8) is identical. Only the PRISM secret changes. The CMK, gCMK, VUID, gCMKAuth, and swarm membership are untouched.
The key cryptographic distinction from PRISM Password Change: recovery selfRequest tokens use two-layer encryption (AES_ORK → relay channel key), omitting the PRISMAuth layer that proves password knowledge. The email challenge replaces the password proof.
Loading diagram...

Preconditions

ConditionDetail
UserKnows their username. Has access to email inbox(es) registered during Protocol: Account Creation / KeyGen. Does not possess the current password.
Recovery emails establishedDuring Account Creation, the SWE randomly assigned 1-20 user-provided email addresses across the 20 ORKs (one per ORK, with possible overlap). Each ORK stores its (single) assigned address as CMKEmailAddress. The SWE destroyed the mapping.
ORK swarmEach ORK holds a committed record: CMK_i (unchanged), gCMK (unchanged), PRISM_i (to be replaced), PRISMAuth_i (to be replaced), CMKEmailAddress.

Protocol Flow

Phases 1-3: Recovery Authorization (Unique to This Protocol)

Loading diagram...
The relay pattern: The Home ORK establishes a relay channel (ChannelID, 1-hour TTL). When the user clicks an email link, the resulting HTTP request hits the Home ORK, which extracts the encrypted token and holds it. The SWE long-polls the Home ORK for updates, collecting tokens as they arrive. The SWE never exposes a direct public endpoint. The Home ORK provides deduplication (rejecting repeated mIdORK_i) and progress feedback ("N more links to go!").
Two-layer vs. three-layer encryption: In PRISM Password Change, selfRequest tokens are triple-encrypted (AES_ORK → ECDH → PRISMAuth), with the PRISMAuth layer proving password knowledge. In recovery, the PRISMAuth layer is absent because the password is lost. The email challenge - requiring tt independent link clicks - replaces the password proof as the authorization gate.
Independent ORK dispatch: Each ORK independently retrieves its single stored CMKEmailAddress, constructs a recovery email with its own encrypted token, and sends it. No ORK knows which addresses other ORKs hold, whether the user will succeed, or which other emails were sent. The threshold requirement (14 of 20) ensures no partial compromise of email accounts suffices.

Phase 4: New Password Entry

Once tt tokens are collected, the SWE prompts the user for a new password and blinds it:
gBlurNewPass=H2P(newPassword)rgBlurNewPass = \textsf{H2P}(newPassword) \cdot r
where H2PH2P is a deterministic string-to-curve mapping and rr is a random blinding scalar. This blinded password point is used in the subsequent DKG ceremony to derive the new PRISM secret, without ever exposing the password or the PRISM secret in plaintext.
Loading diagram...

Phases 5-8: PRISM DKG (Shared with PRISM Password Change)

From this point, the protocol is identical to Protocol: PRISM Password Change, Phases 2-5.
Loading diagram...
Recovery-specific differences from PRISM Password Change:
UpdateShard goes to all nn ORKs, not just the II that provided email tokens. ORKs without valid tokens set activeORK = false - they contribute PRISM shares (maintaining threshold health) but produce S_i = null (no partial group signature). The activeORK flag is determined by whether the user clicked that ORK's email link, rather than by ConvertPass participation.
Purpose codes: The local RecoveryRequest uses Purpose = "RECOVER" (ORK-level authorization token). The mimDB (Mimir Database - The Fabric's synced repository) PermissionMessage uses Purpose = "RESET" (same as Password Change). From the DKG and mimDB perspective, PRISM regeneration is identical regardless of the authorization front-end.
For the full specification of UpdateShard, SetPRISM, Test, and Commit internals - Schnorr verification, Accountable Group Signature construction, uncommitted/committed state management, SafeKeep packaging, mimDB write - see Protocol: PRISM Password Change, Phases 2-5.

Algorithms

Algorithm 1

Algorithm 2

Recovery vs. Password Change vs. Healing: Architectural Distinctions

PropertyAccount RecoveryPRISM Password ChangeKey Healing
TriggerUser lost accessUser wants new passwordORK detects stale digest
Initiated byUserUserSystem (automatic)
Old password required?NoYesN/A
Authorization mechanismDistributed email challenge (tt link clicks) + CMK group signatureOld-password PRISM + CMK group signaturePre-authorized SafeKeep records
selfRequest encryption2 layers (AES_ORK → relay channel key)3 layers (AES_ORK → ECDH → PRISMAuth)N/A
Authorization window1 hour~30 secondsN/A
What changesPRISM secret, PRISM verifiersPRISM secret, PRISM verifiersIndividual ORK's local share state
What doesn't changeCMK, gCMK, VUID, gCMKAuth, swarmCMK, gCMK, VUID, gCMKAuth, swarmCMK, gCMK, VUID, gCMKAuth, swarm
mimDB Purpose"RECOVER""RESET"N/A
User awarenessExplicitExplicitTransparent

Notation Reference

SymbolDescription
G\mathcal{G}Generator point on Curve25519
AbA \cdot bScalar-point multiplication
H()H(\cdot)SHA-256 unless stated otherwise
DH(a,B)\textsf{DH}(a, B)Diffie-Hellman: BaB \cdot a
H2P()\textsf{H2P}(\cdot)Hash-to-point (Elligator 2 on Curve25519)
uid\text{uid}User identifier: uidH(username)\text{uid} \leftarrow H(\text{username})
gNewPass\text{gNewPass}, gBlurNewPass\text{gBlurNewPass}New password-derived / blinded curve points
rrBlinding scalar for new password
PRISMiPRISM'_iORK ii's new random PRISM sub-secret
PRISMYiPRISMY_iORK ii's combined new PRISM shard
newPRISMAuthinewPRISMAuth_iORK ii's new PRISM verifier: DH(mSecORKi,gNewPRISMAuth)\textsf{DH}(mSecORK_i, gNewPRISMAuth)
gNewPRISMAuthgNewPRISMAuthNew PRISM auth base point: GH(gNewPasss)\mathcal{G} \cdot H(\text{gNewPass} \cdot s')
CMKiCMK_i, gCMKgCMKORK ii's CMK shard / user's CMK public key (unchanged)
mSecORKimSecORK_i, mgORKimgORK_iORK ii's long-term private / public key
aesKeyiaesKey_iORK ii's symmetric key
mIdORKimIdORK_iORK ii's public identifier
ECDHijECDH_{ij}Pairwise shared secret between ORKs ii and jj
SessKeySessKey, gSessKeyPubgSessKeyPub (UU)SWE's session private / public key
AES_ENCa(B)\textsf{AES\_ENC}_{a}(B)AES256 encryption of message BB with key aa
AES_DECa(B)\textsf{AES\_DEC}_{a}(B)AES256 decryption of message BB with key aa
ENCA(B)\textsf{ENC}_{A}(B)X25519-based El-Gamal encryption of message BB with public key AA
DECa(B)\textsf{DEC}_{a}(B)X25519-based El-Gamal decryption of message BB with private key aa
ChannelIDChannelIDRecovery relay channel identifier on the Home ORK (1hr TTL)
RecoveryRequestRecoveryRequestAuth structure: (uid,"RECOVER",gSessKeyPub,expiry)(\text{uid}, \text{"RECOVER"}, gSessKeyPub, \text{expiry})
selfRequestiselfRequest_iPer-ORK authorization token (double-encrypted)
encRequestiencRequest_isession-key-encrypted selfRequestiselfRequest_i (carried in email link)
activeORKactiveORKBoolean: was this ORK's email link clicked and token validated?
CMKEmailAddressiCMKEmailAddress_iORK ii's stored recovery email (from Account Creation)
nn, tt, IISwarm size (20), threshold (14), tokens collected
SS, SiS_iAggregate / partial Accountable Group Signature
gRgR, gRigR_iAggregate / partial signature nonce
mDigestmDigestDigest: Current key's Accountable Group Signature digest of participating ORKS: H(ORKsBitwise  PermissionMessage)H(ORKsBitwise\ \|\ PermissionMessage)
ORKsBitwiseORKsBitwiseBitwise array of participating ORKs

Actors and Trust Assumptions

ActorDescriptionTrust Assumption
UserHas lost access. Provides username, clicks email links, enters new password. Does not possess current password.-
Vendor SiteTriggers SWE rendering. Not otherwise involved.Standard web trust.
Secure Web EnclaveBrowser agent. Orchestrates email challenge, collects tokens via long-polling, executes PRISM DKG, test sign-in, Commit.Potentially adversarial. Cannot bypass threshold - needs tt valid tokens.
Home ORKEntry point. Provides roster, establishes recovery relay channel, collects link clicks, deduplicates, enforces 1hr timeout.No elevated trust. Cannot forge tokens or route clicks to wrong SWE (session-bound).
CMK ORKs (n=20n = 20)Each independently dispatches recovery email, validates tokens, generates PRISM shares, signs state transition.Up to 13 may collude. Zero ORK-to-ORK communication during email dispatch.
User EmailDelivers recovery emails to user.Adversary has no access to threshold number of user's email accounts. Each Email system reliable but not confidential. Compromised email sees links but cannot forge/decrypt selfRequests (AES_ORK sealed).
mimDBStores updated key record in Fabric's repository.Append-only integrity.

Layer Traversal

LayerHow Recovery Engages It
LegitimacyECDH session establishment. Long-polling relay collects email link clicks. Voucher validation for DKG operations.
AuthorityPrimary layer for Phases 5-8. PRISM shares generated, distributed, combined, stored via Nested Shamir DKG. Old PRISM replaced atomically at commit. CMK untouched.
AgencyNot engaged during email authorization (Phases 1-4). No MPC operation. Engaged during test sign-in (Phase 7): blind signature verifies new PRISM.
SettlementVouchers govern and fund email recovery, DKG and Commit operations.

Security Properties

PropertyMechanismAssumption
Threshold email authorizationRecovery requires t=14t = 14 independent selfRequest tokens. Attacker needs access to email accounts linked to 14\geq 14 distinct ORKs.Threshold assumption
No password exposure (new)New password blinded as gBlurNewPass\text{gBlurNewPass}. No ORK sees raw password point. Old password never used or transmitted.Blinding scalar randomness
CMK preservationCMK, gCMK, VUID, gCMKAuth, swarm membership unchanged. Only PRISM and verifiers replaced.-
CMK-based authorizationGroup signature uses keyAuth=gCMKkeyAuth = gCMK and CMKiCMK_i shards. Email proves identity; CMK proves swarm authorization.DLP hardness
No key reconstructionDKG generates new PRISM shares. Complete PRISM and complete CMK never materialize.-
Independent ORK email dispatchEach ORK independently constructs and sends its email. No coordinator, no central mail gateway.SMTP availability
Encrypted authorization tokensselfRequests double-encrypted (AES_ORK → relay channel key). Email provider can inspect link URL but cannot forge or decrypt payload.AES security
Relay isolationSWE not directly exposed. Home ORK terminates link callbacks and holds tokens for long-polling collection.-
1-hour temporal boundRecoveryRequest expiry and relay channel timeout = 3600s. Limits attack window for compromised inboxes.Accurate ORK clocking
Audit traildLog(RecoveryRequested) at each ORK. Distributed tamper-evident record of recovery attempts.dLog integrity
Active/passive ORK separationOnly ORKs whose email links were clicked produce partial group signatures. Passive ORKs contribute PRISM shares but not authorization.-
Two-phase commitUncommitted state until test sign-in succeeds. Old password remains valid until explicit commit.-
SafeKeep for absent ORKsMissing ORKs' new PRISM shares packaged as SafeKeep records, healable via Protocol: Key Healing.ECDH + AES security
Transport-independent securityAll token encryption via ECDH/AES, not TLS. Security independent of email or transport confidentiality.-

Call Summary

CallDirectionPurpose
GetKeyORKsSWE → Home ORKRetrieve swarm roster. Establish recovery relay channel (ChannelIDChannelID, 1hr TTL).
RequestRecoverySWE → all nn ORKsEach ORK builds double-encrypted selfRequest, dispatches recovery email, logs dLog.
Email link relayHome ORK → SWE (via long-polling)Per click: parse, deduplicate, hold for SWE poll. Return (encRequesti,mIdORKi)(encRequest_i, mIdORK_i) when polled.
UpdateShardSWE → all nn ORKsPRISM DKG round 1. numKeys=1, null swarm, gBlurNewPass, selfRequest_i as auth.
SetPRISMSWE → II ORKsPRISM DKG round 2. Share distribution, Schnorr proofs, group signature, uncommitted state.
SignInSWE → II ORKsTest authentication with new password against uncommitted state.
CommitSWE → II ORKsVerify aggregate signature, transition to committed, mimDB write, archive.

References

  • Hall, J. L., Hertzog, Y., et al. (2023). Manifesting Unobtainable Secrets: Threshold Elliptic Curve Key Generation using Nested Shamir Secret Sharing. arXiv:2309.00915. Presented at AustMS 2021.
  • Tide Developer Documentation: docs.tidecloak.com
Related Protocol Articles: