Aller au contenu

PD-33 — Retour d'expérience


📚 Navigation User Story | Document | | | ---------- | -- | | 📋 [Spécification](PD-33-specification.md) | | | 🛠️ [Plan d'implémentation](PD-33-plan.md) | | | ✅ [Critères d'acceptation](PD-33-acceptability.md) | | | 📝 **Retour d'expérience** | *(ce document)* | [← Retour à crypto](../PD-189-epic.md) · [↑ Index User Story](index.md)

1. Résumé exécutif

La User Story PD-33 visait à implémenter la dérivation de K_encryption via Argon2id avec des paramètres cryptographiques stricts (64 MiB, t=3, p=4, Associated Data normative). L'implémentation est fonctionnelle et conforme RFC 9106, mais présente 4 écarts MAJEURS : divergence du format Associated Data, présence d'un fallback PBKDF2 interdit, paramètres adaptatifs hors norme, et tests insuffisamment stricts. Verdict : ACCEPTÉ AVEC RÉSERVES.


2. Points fluides

  • Architecture claire : séparation nette entre keyDerivation.ts (service) et constants.ts (paramètres)
  • Détection WebAssembly : fonction isWebAssemblyAvailable() robuste avec test minimal de module
  • Détection Expo Go : identification correcte via Constants.executionEnvironment
  • Guard production : le fallback PBKDF2 est bloqué en production (!__DEV__)
  • Domain separation : principe correctement appliqué via secret (associated data)
  • Effacement mémoire : wipeKey() implémenté avec best-effort JavaScript
  • Tests RFC 9106 : vecteurs officiels IETF validés
  • Documentation inline : commentaires JSDoc complets et clairs

3. Points difficiles

Difficulté Contexte
WebAssembly indisponible dans Expo Go Le moteur Hermes ne supporte pas WASM, imposant un fallback pour le développement local
Import dynamique argon2-browser Nécessité d'importer argon2-bundled.min.js dynamiquement avec cast TypeScript complexe
Immutabilité des strings JavaScript Effacement du password impossible de manière fiable (assignation password = "" est best-effort)
Paramètres adaptatifs vs normatifs Tension entre conformité stricte spec et support devices anciens (iPhone 8-11)
Format Associated Data Ambiguïté entre convention :: (code) et _ (spec) non détectée en revue

4. Hypothèses révélées tardivement

Hypothèse initiale Réalité découverte
Expo Go supporte WebAssembly FAUX — Hermes (moteur JS Expo) ne supporte pas WASM
Un seul profil Argon2id suffit PARTIELLEMENT FAUX — Devices anciens (iPhone 8) timeout avec 64 MiB
Associated Data est un détail FAUX — Le format exact (_ vs ::) impacte l'interopérabilité
constants.ts serait utilisé partout FAUXkeyDerivation.ts définit ses propres contextes inline

5. Invariants complexes à implémenter

Invariant Complexité
Argon2id obligatoire en production Gestion de l'erreur WebAssembly avec message explicite et blocage
Domain separation stricte Contextes différents K_encryption vs K_auth avec même salt
Paramètres OWASP 2024 Équilibre 64 MiB (sécurité) vs UX mobile (temps < 1s)
Zero-Knowledge absolu Password, salt, K_encryption jamais dans logs, traces, exceptions

6. Dette technique

Dette Impact Priorité
Contexte Associated Data divergent keyDerivation.ts utilise :: au lieu de _ défini dans constants.ts HAUTE
DEVICE_PARAMS non supprimé Profil "low" (32 MiB, p=2) existe mais ne devrait pas être utilisable MOYENNE
Fallback PBKDF2 présent Code mort en production mais présent dans le bundle BASSE
detectDeviceCapability() stub Retourne toujours "medium", détection réelle non implémentée BASSE

7. Risques résiduels

Risque Probabilité Impact Mitigation suggérée
Interop failure avec backend/autres clients si format AD diffère Moyenne ÉLEVÉ Aligner sur constants.ts (_ separator)
Bypass DEVICE_PARAMS "low" par développeur pressé Faible MOYEN Supprimer profil "low" ou le marquer deprecated
Memory leak password en cas d'exception avant wipe Faible MOYEN Wrap try/finally systématique
Timeout Argon2id sur device très ancien Faible FAIBLE CRYPTO_TIMEOUTS déjà défini (30s)

8. Améliorations processus

Amélioration Bénéfice attendu
Revue croisée spec/constants.ts avant implémentation Détecter divergences de format (Associated Data) plus tôt
Test d'intégration cross-module Valider que keyDerivation.ts utilise bien constants.ts
CI avec profil "strict" Forcer paramètres normatifs dans tous les tests, pas seulement RFC vectors
Linter custom pour contextes Détecter usages de strings hardcodées au lieu de constantes
Documentation des choix Expo Go REX formalisé pour futurs devs sur contraintes Hermes/WASM

9. Enseignements clés

  1. Les constantes doivent être importées, pas redéfinieskeyDerivation.ts aurait dû importer CONTEXT_ENCRYPTION de constants.ts au lieu de définir "ProbatioVault::Encryption::v1" inline.

  2. Expo Go impose des contraintes majeures — L'absence de WebAssembly dans Hermes est un bloqueur architectural qui doit être documenté dès le design.

  3. Les fallbacks "DEV-ONLY" restent du code — Même protégé par __DEV__, le fallback PBKDF2 est dans le bundle et peut être source de confusion ou de faille si le guard est contourné.

  4. Les paramètres adaptatifs sont dangereuxDEVICE_PARAMS["low"] avec 32 MiB déroge à la spec sans valeur ajoutée réelle (aucun device ciblé officiellement).

  5. Les tests doivent refléter la spec, pas l'implémentation — Les tests valident le code actuel mais pas les exigences normatives (Associated Data exact, paramètres stricts).