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) etconstants.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 | FAUX — keyDerivation.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¶
-
Les constantes doivent être importées, pas redéfinies —
keyDerivation.tsaurait dû importerCONTEXT_ENCRYPTIONdeconstants.tsau lieu de définir"ProbatioVault::Encryption::v1"inline. -
Expo Go impose des contraintes majeures — L'absence de WebAssembly dans Hermes est un bloqueur architectural qui doit être documenté dès le design.
-
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é. -
Les paramètres adaptatifs sont dangereux —
DEVICE_PARAMS["low"]avec 32 MiB déroge à la spec sans valeur ajoutée réelle (aucun device ciblé officiellement). -
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).