Aller au contenu

PD-242 — Retour d'expérience (REX)

Story : PD-242 — Implémenter enveloppe cryptographique de récupération (K_recovery) Date début : 2026-02-19 Date fin : 2026-02-19 Durée totale : ~6 heures


1. Résumé

Story crypto implémentant le système de recovery BIP-39 pour ProbatioVault iOS. Architecture zero-knowledge permettant à l'utilisateur de récupérer sa clé maître K_master en cas de perte de device, sans que le backend n'ait accès aux secrets.

Périmètre réalisé : - Génération phrase BIP-39 (24 mots, 256 bits entropie) - Dérivation K_recovery via HKDF-SHA3-256 avec domain separation - Création Recovery_Envelope (AES-256-GCM) - Hash de vérification H_verify (SHA3-256) - 3 écrans : création, restauration, régénération - 3 composants UI : MnemonicDisplay, MnemonicInput, RecoveryProgress - 49 tests unitaires (bip39 + recoveryService)


2. Métriques

Gates

Gate Type Itérations Score moyen Verdict
3 CONFORMITY_CHECK 1 9.38/10 GO
5 AMBIGUITY 1 9.50/10 GO
8 CLOSURE 1 8.25/10 GO

Convergence : Toutes les gates passées en 1 seule itération.

Écarts par type

Type Gate 3 Gate 5 Gate 8 Total
ECT (écart technique) 1 0 0 1
AMB (ambiguïté) 0 4 0 4
SEC (sécurité) 0 0 2 2
MINEUR 1 4 3 8
MAJEUR 0 0 0 0
BLOQUANT 0 0 0 0

Code

Métrique Valeur
Fichiers créés 11
Lignes de code ~2235
Tests PD-242 49
Tests crypto totaux 663
Dépendances ajoutées 1 (@scure/bip39)

3. Points forts

Architecture crypto

  1. Choix de @scure/bip39 : Bibliothèque pure JS auditée par Cure53, compatible Hermes (pas de WebAssembly), utilisée par les wallets crypto majeurs.

  2. Pattern try/finally pour zeroization : Garantit la destruction de K_recovery même en cas d'exception. Pattern identifié et corrigé lors de la review sécurité étape 7.

  3. Domain separation HKDF : Salt fixe ("ProbatioVault::Recovery::v1") + info dynamique (user_id) = isolation cryptographique entre utilisateurs.

  4. H_verify avant déchiffrement : Permet de détecter une phrase incorrecte sans exposer K_recovery au réseau.

Workflow de gouvernance

  1. Gate 3 et 5 en 1 itération : Spec et plan de haute qualité, scores > 9/10.

  2. Review sécurité efficace : Identification de vulnérabilités réelles (zeroization) distinctes des faux positifs (mocks API).

  3. Traçabilité invariants : Mapping clair INV-242-* → tests → code.


4. Points d'amélioration

Dépendances non résolues

Élément Story dépendante Impact
API backend recovery PD-243 Mocks dans screens
Protection screenshot Ticket à créer FLAG_SECURE natif
Rate limiting Backend scope Non implémenté
Détection nouveau device Backend scope Non implémenté

Écarts résiduels Gate 8

  1. INV-242-10 (screenshot) : Requiert implémentation native iOS (FLAG_SECURE équivalent).

  2. INV-242-11/13 (backend) : Rate limiting et détection device dépendent de PD-243.

  3. Tests E2E : Non réalisables sans backend réel.


5. Patterns identifiés

Pattern réutilisable : Zeroization try/finally

let sensitiveKey: Uint8Array | null = null;
try {
  sensitiveKey = deriveKey(...);
  // Utiliser la clé
  processWithKey(sensitiveKey);
} catch (error) {
  handleError(error);
} finally {
  if (sensitiveKey) {
    zeroize(sensitiveKey);
  }
}

Appliquer à : Toute manipulation de clé cryptographique.

Pattern réutilisable : Validation croisée LLM

La distinction entre faux positifs (mocks identifiés comme vulnérabilités) et vraies vulnérabilités requiert une analyse contextuelle : - S-01 "bypass H_verify" → Mock API, faux positif - S-02/S-03 "zeroization manquante sur exception" → Vraie vulnérabilité, corrigée


6. Durée par étape

Étape Durée estimée Notes
0 - Besoin 30 min Interactif PO
1 - Spec 45 min Fallback Claude
2 - Tests 30 min Fallback Claude
3 - Gate 20 min GO direct
4 - Plan 40 min 8 tâches, 8 CC
5 - Gate 20 min GO direct
6 - Implémentation 120 min 8 tâches
7 - Acceptabilité 60 min Reviews + corrections
8 - Gate 30 min GO direct
9 - REX 20 min Ce document
Total ~6h

7. Tickets à créer

Ticket Type Priorité Description
PD-XXX Feature P2 Protection screenshot iOS (FLAG_SECURE) pour MnemonicDisplay
PD-243 Feature P1 API backend recovery (POST/GET/DELETE envelope)

8. Learnings pour data/learnings.jsonl

{"story":"PD-242","gate":8,"verdict":"GO","tags":["#crypto","#bip39","#zeroization","#try-finally"],"learning":"Pattern try/finally obligatoire pour zeroization de clés sensibles - identifié par review sécurité ChatGPT","date":"2026-02-19"}

9. Satisfaction

Critère Score (1-10)
Qualité spec 9
Qualité plan 9
Qualité code 8
Fluidité workflow 9
Pertinence gates 8
Moyenne 8.6

10. Améliorations process

10.1 Prompt review sécurité (haute priorité)

Fichier : templates/prompts/7c Review Security.md Amélioration : Ajouter instruction pour distinguer mocks/stubs des vrais endpoints lors de l'analyse de fuites réseau.

## Contexte mock/stub

Avant d'identifier une vulnérabilité réseau :
1. Vérifier si le code contient des commentaires `// TODO`, `// MOCK`, `// STUB`
2. Si oui, classifier comme "écart documenté" et non "vulnérabilité"
3. Les vrais appels réseau utilisent généralement des imports API réels

Justification : S-01 identifié comme vulnérabilité alors que c'était un mock documenté.

10.2 Pattern zeroization dans template agent-developer (moyenne priorité)

Fichier : agents/agent-developer.md Amélioration : Inclure le pattern try/finally pour toute tâche crypto.

## Règles crypto

Pour toute manipulation de clé sensible (K_*, seed, etc.) :
- Déclarer la variable avec `let ... | null = null`
- Utiliser un bloc try/finally
- Appeler `zeroize()` dans le finally

Justification : Éviter que les futures stories crypto oublient la zeroization sur exception.

10.3 Checklist INV-* pour Gate 8 (basse priorité)

Fichier : templates/prompts/8 Revue d'acceptabilité (post-correction).md Amélioration : Inclure tableau de mapping INV-* → test → statut dans le template.

Justification : Facilite la vérification systématique de tous les invariants.


Références

  • PD-97 : Pipeline crypto zero-knowledge iOS
  • PD-98 : Stockage K_master dans Keychain iOS
  • Architecture technique v4.1 (doc 42) — Recovery Envelope
  • BIP-0039 : Mnemonic code for generating deterministic keys
  • @scure/bip39 : https://github.com/paulmillr/scure-bip39