PD-97 — Plan d'implémentation¶
📚 Navigation User Story
| Document | | | ---------- | -- | | 📋 [Spécification](PD-97-specification.md) | | | 🛠️ **Plan d'implémentation** | *(ce document)* | | ✅ [Critères d'acceptation](PD-97-acceptability.md) | | | 📝 [Retour d'expérience](PD-97-rex.md) | | [← Retour à mobile-ios](../PD-195-epic.md) · [↑ Index User Story](index.md)Objectif¶
Implémenter le chiffrement AES-256-GCM client-side pour garantir le modèle Zero-Knowledge (le serveur ne voit jamais les données en clair).
Choix techniques retenus¶
- Algorithme : AES-256-GCM (NIST SP 800-38D)
- Bibliothèque :
@noble/ciphers(pure JS, audité) - IV : 12 bytes aléatoires par opération (CSPRNG)
- AAD : Support optionnel pour données associées
- Format :
IV (12) || Ciphertext || AuthTag (16)
Architecture ciblée¶
src/crypto/
├── aes-gcm.ts # Chiffrement/déchiffrement AES-256-GCM
├── envelope.ts # Gestion enveloppes K_master
├── constants.ts # Constantes crypto
├── types.ts # Types TypeScript
├── utils.ts # Helpers (hex, bytes)
├── zeroize.ts # Effacement mémoire
└── index.ts # Exports publics
src/hooks/
└── useCrypto.ts # Hook React pour crypto
Découpage technique¶
Phase 1 : Primitives AES-GCM¶
- Implémenter
encrypt(key, plaintext, aad?): - Générer IV 12 bytes via expo-crypto
- Chiffrer avec @noble/ciphers gcm
-
Retourner format compact (IV || CT || Tag)
-
Implémenter
decrypt(key, ciphertext, aad?): - Extraire IV (12 premiers bytes)
- Déchiffrer et vérifier tag
-
Retourner plaintext
-
Valider clé 32 bytes, IV 12 bytes
Phase 2 : Gestion enveloppes¶
- Implémenter
createMasterEnvelope(kMaster, kEncryption): - Chiffrer K_master avec K_encryption
-
Retourner enveloppe (IV + ciphertext + tag)
-
Implémenter
openMasterEnvelope(envelope, kEncryption): - Déchiffrer enveloppe
-
Retourner K_master
-
Support enveloppes device et recovery
Phase 3 : Chiffrement documents¶
- Implémenter
encryptDocument(plaintext, kDoc): - Chiffrer contenu avec K_doc
-
Retourner format standard
-
Implémenter
decryptDocument(ciphertext, kDoc): - Déchiffrer et vérifier intégrité
- Retourner contenu original
Phase 4 : Sécurité mémoire¶
- Implémenter
zeroize(buffer): - Remplir buffer avec zéros
-
Appel explicite GC si disponible
-
Pattern usage : try/finally avec zeroize
- Documenter limitations JS (strings immutables)
Phase 5 : Hook React¶
- Implémenter
useCrypto(): - Accès aux fonctions encrypt/decrypt
- Gestion état loading/error
- Intégration avec useAuth pour K_master
Phase 6 : Tests¶
- Tests vecteurs NIST SP 800-38D
- Tests intégrité (modification → échec)
- Tests pipeline complet (encrypt → decrypt)
- Tests edge cases (données vides, grandes tailles)
Points de vigilance¶
- IV unique : JAMAIS réutiliser un IV avec la même clé
- Tag size : Toujours 16 bytes (128 bits) pour GCM
- Memory : Effacer clés et plaintexts après usage
- Expo Go : @noble/ciphers fonctionne sans WebAssembly
Hors périmètre¶
- Dérivation des clés (→ PD-33, PD-34)
- Stockage K_master (→ PD-98)
- Transmission au serveur (→ API documents)