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¶
-
Choix de @scure/bip39 : Bibliothèque pure JS auditée par Cure53, compatible Hermes (pas de WebAssembly), utilisée par les wallets crypto majeurs.
-
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.
-
Domain separation HKDF : Salt fixe (
"ProbatioVault::Recovery::v1") + info dynamique (user_id) = isolation cryptographique entre utilisateurs. -
H_verify avant déchiffrement : Permet de détecter une phrase incorrecte sans exposer K_recovery au réseau.
Workflow de gouvernance¶
-
Gate 3 et 5 en 1 itération : Spec et plan de haute qualité, scores > 9/10.
-
Review sécurité efficace : Identification de vulnérabilités réelles (zeroization) distinctes des faux positifs (mocks API).
-
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¶
-
INV-242-10 (screenshot) : Requiert implémentation native iOS (FLAG_SECURE équivalent).
-
INV-242-11/13 (backend) : Rate limiting et détection device dépendent de PD-243.
-
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