# Shade V3.10 — Social Key Recovery

**Status:** Done — landet i `@shade/recovery` 0.4.0, frosset i 4.0 GA.
**Effort:** L (4–8 uker)
**Forrige:** V3.2 + V3.3
**Adresserer:** V2.1-tillegg "sosial nøkkel-recovery"

---

## Mål

Løs det største UX-hullet i alle E2EE-systemer: **"Hva skjer hvis jeg
mister telefonen?"**. Bruker velger N "guardians" (familie / venner /
jobb-partnere); når bruker mister enheten, kan en threshold-andel av
guardians sammen returnere identity-nøkkelen — uten at noen enkelt guardian
kan gjøre det alene, og uten at server lærer noe.

---

## Scope

### Inn

- Shamir Secret Sharing (k-of-n) over identity private key (eller en
  backup-encryption-key).
- Distribusjon av shares via eksisterende 1:1 Shade-sesjoner — guardians
  lagrer share lokalt.
- Recovery-flow: ny enhet ber threshold guardians sende sine shares;
  rekonstruerer på ny enhet.
- Verifikasjons-step: ny enhet beviser identitet til hver guardian via OOB
  safety-number-sammenligning **før** guardian frigjør share.
- UX-guide: hvor mange guardians, hvilken threshold, hvordan rotere når en
  guardian mister enhet.

### Ut

- "Cloud guardian" / Shade-driftet recovery — vi tillater ingen sentralisert
  komponent som kan gjøre det alene.
- Auto-distribusjon (vi krever eksplisitt valg av guardians).

---

## Design

### Hva deles

```text
shareSecret = AES-256-GCM-encrypt(identityState, recoveryKey)
recoveryKey is Shamir-split(k, n) → shares[i]
shareSecret stored locally + on each guardian
each guardian receives one share via Shade.send
```

`identityState` er det samme som `Shade.exportBackup` (eksisterer i 0.3.x),
men her gjenbrukes formatet.

### Recovery-flow

1. Ny enhet genererer **temporary** identity + safety number.
2. Ny enhet kontakter guardians via prekey-server (OOB verifisering først).
3. Hver guardian godkjenner manuelt og returnerer sin share via
   `Shade.send`.
4. Ny enhet rekonstruerer `recoveryKey`, dekrypterer `shareSecret`,
   gjenoppretter identity.
5. Original identity roterer (gammel identitet markeres som
   "compromised — used for recovery").

### Guardian-UX

- Guardian-app/widget viser:
  *"Alice (din venn) har mistet sin enhet og ber om recovery share.
  Bekreft fingerprint før du sender."*
- Guardian kan **avslå** uten konsekvens.

---

## Leveranser

### Pakker

- `@shade/recovery` — Shamir + share-distribusjon.
- `@shade/widgets` — `<RecoverySetup />` (velg guardians) +
  `<RecoveryRequest />` (ny enhet ber) + `<RecoveryApprove />` (guardian
  godkjenner).

### Tester

- Unit: Shamir split/combine roundtrip; threshold-håndhevelse.
- Integration: full 3-of-5 recovery med 5 mock-guardians.
- Adversarial: 2 guardians koluderer (under threshold) → kan ikke
  rekonstruere.
- Adversarial: ondsinnet ny enhet uten safety-number-bekreftelse → ingen
  guardian skal frigjøre share.

### Dokumentasjon

- `docs/recovery.md` — full UX + threat model.
- Trusselmodell-utvidelse: kollusjon ≤ k-1, identitetsforfalskning, social
  engineering.

---

## Akseptansekriterier

- [ ] 3-of-5 recovery fungerer end-to-end på 2 separate enheter.
- [ ] Ingen koalisjon av (k-1) guardians kan rekonstruere `shareSecret`
      (verifisert med fast-check property test).
- [ ] Guardian-side widget krever fingerprint-bekreftelse før send (gate
      fra V3.3 forsterket).

---

## Avhengigheter

- V3.2 — nøkkelmateriale at-rest hos guardian skal være kryptert.
- V3.3 — fingerprint-gate på recovery-handshake.

---

## Risiko

- **UX er det vanskeligste.** "Hvem er min guardian?" er sosialt komplekst;
  bruker kan velge dårlig.
- **Social engineering.** Angriper imiterer offer over telefon → guardian
  gir share. Mitiger med harde fingerprint-gates + cool-down.
- **Dead guardians.** Hvis guardian dør / mister sin enhet uten å være
  erstattet, threshold synker. Periodisk "guardian health check"-prompt
  anbefales.

---

## Migrasjon

Ny pakke. Apper kan legge til recovery-widget i innstillinger.
