PD-242 — Cahier de tests¶
Navigation User Story
| Document | | | ---------- | -- | | [Specification](PD-242-specification.md) | | | [Plan d'implementation](PD-242-plan.md) | | | **Tests** | *(ce document)* | | [Retour d'experience](PD-242-rex.md) | | [← Retour a crypto](../PD-189-epic.md) · [Index User Story](index.md)References¶
- EPIC : PD-189 — CRYPTO
- JIRA : PD-242
- Composant : Client-side crypto (mobile iOS)
- Specification : PD-242-specification.md
Matrice de couverture¶
Invariants de securite¶
| Invariant | Tests couvrant | Type |
|---|---|---|
| INV-242-01 | TC-SEC-01, TC-SEC-02 | SEC |
| INV-242-02 | TC-SEC-03, TC-SEC-04 | SEC |
| INV-242-03 | TC-SEC-05 | SEC |
| INV-242-04 | TC-SEC-06 | SEC |
| INV-242-05 | TC-BIP-01, TC-BIP-02 | SEC |
| INV-242-06 | TC-CRYPTO-01, TC-CRYPTO-02, TC-CRYPTO-03 | CRYPTO |
| INV-242-07 | TC-CRYPTO-04, TC-CRYPTO-05 | CRYPTO |
| INV-242-08 | TC-VERIFY-01, TC-VERIFY-02 | SEC |
| INV-242-09 | TC-UX-01, TC-UX-02 | UX |
| INV-242-10 | TC-ARCH-01 | ARCH |
| INV-242-11 | TC-SEC-07 | SEC |
| INV-242-12 | TC-SEC-08 | SEC |
| INV-242-13 | TC-SEC-09, TC-SEC-10 | SEC |
Criteres d'acceptation¶
| Critere | Tests couvrant |
|---|---|
| TA-1 | TC-BIP-01, TC-BIP-02, TC-BIP-03, TC-VEC-01 |
| TA-2 | TC-CRYPTO-01, TC-CRYPTO-02 |
| TA-3 | TC-CRYPTO-04, TC-CRYPTO-05 |
| TA-4 | TC-NEG-01, TC-NEG-02 |
| TA-5 | TC-VERIFY-01, TC-VERIFY-02 |
| TA-6 | TC-SEC-03, TC-LOG-01 |
| TA-7 | TC-UX-01, TC-UX-02 |
| TA-8 | TC-E2E-01 |
| TA-9 | TC-E2E-02 |
| TA-10 | TC-PERF-01, TC-PERF-02 |
| TA-11 | TC-SEC-07 |
| TA-12 | TC-SEC-08 |
| TA-13 | TC-SEC-09, TC-SEC-10 |
| TA-14 | TC-VEC-01, TC-VEC-02 |
| TA-15 | TC-COMPAT-01 |
| TA-16 | TC-API-01, TC-API-02, TC-API-03 |
Scenarios de test¶
Tests BIP-39¶
TC-BIP-01 — Validite phrase generee¶
Objectif : Verifier que la phrase generee est valide BIP-39 Type : Unitaire Priorite : P0 Couvre : INV-242-05, TA-1
Prerequis : - Module de generation BIP-39 initialise - CSPRNG disponible
Donnees de test : N/A (generation aleatoire)
Etapes : 1. Appeler generateMnemonic() 2. Verifier la structure du resultat
Resultat attendu : - Phrase contient exactement 24 mots - Chaque mot appartient a la wordlist BIP-39 English - Le checksum est valide (8 bits SHA-256)
Automatisable : Oui
TC-BIP-02 — Entropie 256 bits¶
Objectif : Verifier que l'entropie est de 256 bits Type : Unitaire Priorite : P0 Couvre : INV-242-05, TA-1
Prerequis : - 100 phrases generees
Donnees de test : 100 executions de generateMnemonic()
Etapes : 1. Generer 100 phrases 2. Verifier qu'aucune n'est dupliquee 3. Calculer l'entropie statistique
Resultat attendu : - 0 doublons sur 100 generations - Distribution uniforme des mots - Entropie >= 255 bits (avec marge statistique)
Automatisable : Oui
TC-BIP-03 — Rejet phrase invalide (checksum)¶
Objectif : Verifier le rejet des phrases avec checksum invalide Type : Unitaire Priorite : P0 Couvre : TA-1
Prerequis : N/A
Donnees de test :
Phrase valide : "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art"
Phrase invalide (dernier mot modifie) : "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon zoo"
Etapes : 1. Valider la phrase valide 2. Valider la phrase invalide
Resultat attendu : - Phrase valide → validation OK - Phrase invalide → erreur "Invalid checksum"
Automatisable : Oui
Tests cryptographiques¶
TC-CRYPTO-01 — Determinisme derivation HKDF¶
Objectif : Verifier que la derivation est deterministe Type : Unitaire Priorite : P0 Couvre : INV-242-06, TA-2
Prerequis : N/A
Donnees de test :
mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art"
user_id: "550e8400-e29b-41d4-a716-446655440000"
Etapes : 1. Deriver K_recovery avec les parametres ci-dessus 2. Deriver K_recovery une seconde fois (memes parametres) 3. Comparer les deux cles
Resultat attendu : - K_recovery_1 === K_recovery_2 (bit-a-bit) - Longueur = 32 bytes
Automatisable : Oui
TC-CRYPTO-02 — Vecteur de test HKDF-SHA3-256¶
Objectif : Valider l'implementation HKDF-SHA3-256 Type : Unitaire Priorite : P0 Couvre : INV-242-06, TA-2
Prerequis : N/A
Donnees de test :
IKM (seed BIP-39 de phrase test) : (voir TC-VEC-01)
salt : "ProbatioVault::Recovery::v1"
info : "550e8400-e29b-41d4-a716-446655440000"
L : 32
Etapes : 1. Calculer HKDF-SHA3-256 avec les parametres 2. Comparer avec la valeur attendue precalculee
Resultat attendu : - Hash correspond au vecteur attendu - Implementation conforme RFC 5869 + FIPS 202
Automatisable : Oui
TC-CRYPTO-03 — Domain separation¶
Objectif : Verifier que des user_id differents produisent des cles differentes Type : Unitaire Priorite : P0 Couvre : INV-242-06
Prerequis : N/A
Donnees de test :
mnemonic : (identique pour les deux)
user_id_1 : "550e8400-e29b-41d4-a716-446655440000"
user_id_2 : "550e8400-e29b-41d4-a716-446655440001"
Etapes : 1. Deriver K_recovery_1 avec user_id_1 2. Deriver K_recovery_2 avec user_id_2 3. Comparer
Resultat attendu : - K_recovery_1 !== K_recovery_2 - Distance de Hamming significative
Automatisable : Oui
TC-CRYPTO-04 — Chiffrement AES-256-GCM¶
Objectif : Verifier le chiffrement de l'envelope Type : Unitaire Priorite : P0 Couvre : INV-242-07, TA-3
Prerequis : N/A
Donnees de test :
Etapes : 1. Chiffrer K_master avec K_recovery 2. Verifier la structure du resultat
Resultat attendu : - envelope.nonce = 12 bytes - envelope.ciphertext = 32 bytes - envelope.tag = 16 bytes - Total = 60 bytes
Automatisable : Oui
TC-CRYPTO-05 — Dechiffrement round-trip¶
Objectif : Verifier le round-trip chiffrement/dechiffrement Type : Unitaire Priorite : P0 Couvre : INV-242-07, TA-3
Prerequis : N/A
Donnees de test :
Etapes : 1. Chiffrer K_master 2. Dechiffrer envelope 3. Comparer
Resultat attendu : - K_master_decrypted === K_master_original (bit-a-bit)
Automatisable : Oui
Tests de verification¶
TC-VERIFY-01 — Verification H_verify correct¶
Objectif : Verifier que H_verify permet de valider la bonne phrase Type : Unitaire Priorite : P0 Couvre : INV-242-08, TA-5
Prerequis : N/A
Donnees de test :
Etapes : 1. Calculer H_verify = SHA3-256(K_recovery || user_id) 2. Stocker H_verify 3. Recalculer H_verify_candidate avec meme phrase 4. Comparer
Resultat attendu : - H_verify === H_verify_candidate
Automatisable : Oui
TC-VERIFY-02 — Verification H_verify incorrect¶
Objectif : Verifier que H_verify detecte une mauvaise phrase Type : Unitaire Priorite : P0 Couvre : INV-242-08, TA-5
Prerequis : N/A
Donnees de test :
Etapes : 1. Calculer H_verify avec phrase originale 2. Calculer H_verify_candidate avec phrase incorrecte 3. Comparer
Resultat attendu : - H_verify !== H_verify_candidate
Automatisable : Oui
Tests de securite¶
TC-SEC-01 — K_recovery non transmise en clair¶
Objectif : Verifier qu'aucune requete reseau ne contient K_recovery Type : Integration Priorite : P0 Couvre : INV-242-01
Prerequis : - Proxy reseau configure (mitmproxy ou Charles) - Flux creation recovery execute
Donnees de test : N/A
Etapes : 1. Configurer capture reseau 2. Executer flux creation recovery complet 3. Analyser toutes les requetes
Resultat attendu : - Aucune requete ne contient K_recovery (ni en clair, ni en base64) - Seuls Recovery_Envelope et H_verify sont transmis
Automatisable : Partiel (capture manuelle, analyse automatique)
TC-SEC-02 — TLS obligatoire¶
Objectif : Verifier que les communications sont chiffrees TLS Type : Integration Priorite : P0 Couvre : INV-242-01
Prerequis : Proxy reseau
Etapes : 1. Tenter connexion HTTP (non HTTPS) 2. Verifier le rejet
Resultat attendu : - Connexion HTTP rejetee - Seul HTTPS accepte
Automatisable : Oui
TC-SEC-03 — Phrase non stockee localement¶
Objectif : Verifier que la phrase n'est pas stockee Type : Integration Priorite : P0 Couvre : INV-242-02, TA-6
Prerequis : - Device avec flux recovery complete - Acces au filesystem (jailbreak test ou simulateur)
Etapes : 1. Completer flux creation recovery 2. Scanner tous les fichiers de l'app 3. Scanner Keychain 4. Scanner UserDefaults 5. Chercher les 24 mots
Resultat attendu : - Aucun fichier ne contient les 24 mots - Keychain ne contient pas la phrase - UserDefaults ne contient pas la phrase
Automatisable : Partiel
TC-SEC-04 — Phrase non stockee backend¶
Objectif : Verifier que le backend ne stocke pas la phrase Type : Integration Priorite : P0 Couvre : INV-242-02
Prerequis : Acces base de donnees backend (env test)
Etapes : 1. Completer flux creation recovery 2. Inspecter la base de donnees 3. Chercher toute trace de la phrase
Resultat attendu : - Seuls Recovery_Envelope et H_verify stockes - Aucun champ contenant la phrase
Automatisable : Oui (query DB)
TC-SEC-05 — Destruction memoire K_recovery¶
Objectif : Verifier l'effacement de K_recovery apres usage Type : Unitaire Priorite : P1 Couvre : INV-242-03
Prerequis : Instrumentation memoire (Instruments / Xcode)
Donnees de test : N/A
Etapes : 1. Executer derivation K_recovery 2. Verifier que K_recovery est presente en memoire 3. Appeler destruction 4. Verifier que K_recovery est effacee
Resultat attendu : - Apres destruction, le buffer est remplace par zeros - Note : best-effort car JavaScript strings immutables
Automatisable : Partiel (inspection memoire manuelle)
TC-SEC-06 — Backend ne peut pas dechiffrer¶
Objectif : Verifier zero-knowledge cote backend Type : Audit Priorite : P0 Couvre : INV-242-04
Prerequis : Acces code backend
Etapes : 1. Analyser le code backend 2. Verifier qu'aucune fonction de dechiffrement n'existe 3. Verifier que K_recovery n'est jamais recue
Resultat attendu : - Backend stocke uniquement ciphertext (envelope) et hash (H_verify) - Aucun code de dechiffrement AES-GCM
Automatisable : Non (audit code)
TC-SEC-07 — Protection screenshot¶
Objectif : Verifier la protection contre les screenshots Type : E2E Priorite : P1 Couvre : INV-242-11, TA-11
Prerequis : Device physique iOS
Etapes : 1. Afficher ecran de phrase recovery 2. Prendre screenshot (boutons physiques) 3. Verifier le contenu du screenshot
Resultat attendu : - Screenshot capture ecran vide ou masque - Phrase non visible dans le screenshot
Automatisable : Non (action physique)
TC-SEC-08 — Timeout affichage¶
Objectif : Verifier le masquage automatique apres timeout Type : E2E Priorite : P1 Couvre : INV-242-12, TA-12
Prerequis : N/A
Etapes : 1. Afficher ecran de phrase recovery 2. Attendre 120 secondes sans action 3. Verifier l'etat de l'ecran
Resultat attendu : - Phrase masquee automatiquement apres 120s - Countdown visible pendant l'affichage - Re-authentification requise pour reafficher
Automatisable : Oui
TC-SEC-09 — Rate limiting user_id¶
Objectif : Verifier le rate limiting par user_id Type : Integration Priorite : P0 Couvre : INV-242-13, TA-13
Prerequis : Backend disponible
Donnees de test :
Etapes : 1. Envoyer 5 tentatives avec phrase incorrecte 2. Envoyer 6eme tentative 3. Attendre 15 minutes 4. Envoyer nouvelle tentative
Resultat attendu : - Tentatives 1-5 : erreur "Invalid phrase" - Tentative 6 : erreur 429 "Rate limit exceeded" - Apres 15 min : tentative acceptee
Automatisable : Oui
TC-SEC-10 — Rate limiting IP¶
Objectif : Verifier le rate limiting par IP Type : Integration Priorite : P1 Couvre : INV-242-13
Prerequis : Backend disponible, IP de test
Etapes : 1. Envoyer 20 tentatives depuis meme IP (users differents) 2. Envoyer 21eme tentative 3. Attendre 15 minutes 4. Envoyer nouvelle tentative
Resultat attendu : - Tentative 21 : erreur 429 - Apres 15 min : acceptee
Automatisable : Oui
Tests UX¶
TC-UX-01 — Re-saisie obligatoire¶
Objectif : Verifier que l'onboarding exige la re-saisie complete Type : E2E Priorite : P0 Couvre : INV-242-09, TA-7
Prerequis : N/A
Etapes : 1. Demarrer onboarding 2. Arriver a l'ecran de phrase 3. Tenter de skip la re-saisie 4. Tenter de saisir seulement 12 mots
Resultat attendu : - Skip impossible (bouton absent ou desactive) - Validation partielle impossible (erreur "24 words required")
Automatisable : Oui
TC-UX-02 — Validation ordre des mots¶
Objectif : Verifier que l'ordre des mots est valide Type : E2E Priorite : P0 Couvre : INV-242-09, TA-7
Prerequis : N/A
Donnees de test : Phrase avec mots dans le desordre
Etapes : 1. Afficher phrase (ex: mot1 mot2 mot3 ...) 2. Saisir dans le desordre (mot3 mot1 mot2 ...) 3. Valider
Resultat attendu : - Erreur "Invalid phrase order" ou "Checksum invalid" - Validation refusee
Automatisable : Oui
Tests architecture¶
TC-ARCH-01 — Detection nouveau device¶
Objectif : Verifier le declenchement automatique du flux recovery Type : E2E Priorite : P0 Couvre : INV-242-10
Prerequis : Compte existant avec recovery configuree
Etapes : 1. Installer app sur nouveau device 2. Se connecter avec compte existant 3. Observer l'ecran affiche
Resultat attendu : - Detection absence K_master dans Keychain - Ecran propose "Recuperer mon coffre" (pas login standard)
Automatisable : Partiel
Tests E2E¶
TC-E2E-01 — Flux recovery complet¶
Objectif : Valider le flux E2E de restauration Type : E2E Priorite : P0 Couvre : TA-8
Prerequis : - Device A avec compte configure - Device B vierge - Phrase sauvegardee
Etapes : 1. Device A : creer compte → sauvegarder phrase 2. Device B : installer app 3. Device B : "Recuperer mon coffre" 4. Device B : saisir phrase 5. Device B : verifier acces coffre
Resultat attendu : - K_master restauree sur Device B - Acces aux documents OK - Device A et B ont meme K_master
Automatisable : Partiel
TC-E2E-02 — Invalidation ancienne envelope¶
Objectif : Verifier que la regeneration invalide l'ancienne phrase Type : E2E Priorite : P0 Couvre : TA-9
Prerequis : Compte avec recovery configuree
Etapes : 1. Noter phrase A 2. Regenerer phrase → phrase B 3. Tenter restauration avec phrase A 4. Tenter restauration avec phrase B
Resultat attendu : - Phrase A : erreur "Invalid phrase" (H_verify mismatch) - Phrase B : restauration OK
Automatisable : Oui
Tests de performance¶
TC-PERF-01 — Generation phrase¶
Objectif : Verifier la performance de generation Type : Performance Priorite : P1 Couvre : TA-10
Prerequis : iPhone 12 ou plus recent
Etapes : 1. Mesurer temps de generation phrase (100 iterations) 2. Calculer moyenne et P95
Resultat attendu : - Moyenne < 50ms - P95 < 100ms
Automatisable : Oui
TC-PERF-02 — Derivation complete¶
Objectif : Verifier la performance du flux complet Type : Performance Priorite : P0 Couvre : TA-10
Prerequis : iPhone 12 ou plus recent
Etapes : 1. Mesurer temps total : phrase → K_recovery → envelope → H_verify 2. 10 iterations
Resultat attendu : - Temps total < 3 secondes - Moyenne < 2 secondes
Automatisable : Oui
Tests de compatibilite¶
TC-COMPAT-01 — Portabilite envelope¶
Objectif : Verifier que l'envelope est dechiffrable cross-platform Type : Integration Priorite : P1 Couvre : TA-15
Prerequis : Implementation reference (Node.js ou autre)
Donnees de test :
Etapes : 1. Generer envelope sur iOS 2. Exporter envelope (base64) 3. Dechiffrer avec implementation reference 4. Comparer K_master
Resultat attendu : - Dechiffrement reussi - K_master identique
Automatisable : Oui
Tests API¶
TC-API-01 — POST /recovery/envelope¶
Objectif : Verifier le stockage de l'envelope Type : Integration Priorite : P0 Couvre : TA-16
Prerequis : Backend disponible
Donnees de test :
Etapes : 1. POST /recovery/envelope avec payload 2. Verifier response
Resultat attendu : - Status 201 Created - Envelope stockee en base
Automatisable : Oui
TC-API-02 — GET /recovery/envelope avec H_verify¶
Objectif : Verifier la recuperation de l'envelope Type : Integration Priorite : P0 Couvre : TA-16
Prerequis : Envelope stockee
Etapes : 1. GET /recovery/envelope/:user_id avec header X-H-Verify-Candidate correct 2. Verifier response
Resultat attendu : - Status 200 - Body contient envelope
Automatisable : Oui
TC-API-03 — GET /recovery/envelope avec H_verify incorrect¶
Objectif : Verifier le rejet si H_verify incorrect Type : Integration Priorite : P0 Couvre : TA-16
Prerequis : Envelope stockee
Etapes : 1. GET /recovery/envelope/:user_id avec header X-H-Verify-Candidate incorrect 2. Verifier response
Resultat attendu : - Status 401 Unauthorized - Body contient error message
Automatisable : Oui
Tests logs¶
TC-LOG-01 — Absence de secrets dans les logs¶
Objectif : Verifier qu'aucun secret n'apparait dans les logs Type : Audit Priorite : P0 Couvre : TA-6
Prerequis : Acces aux logs applicatifs (console, Sentry, etc.)
Etapes : 1. Executer tous les flux recovery 2. Exporter les logs 3. Rechercher patterns sensibles : - K_recovery (hex ou base64) - Phrase (24 mots) - K_master (hex ou base64)
Resultat attendu : - Aucun match trouve - Logs contiennent uniquement events non sensibles
Automatisable : Oui (grep patterns)
Tests cas negatifs¶
TC-NEG-01 — Phrase incorrecte (1 mot different)¶
Objectif : Verifier le rejet d'une phrase presque correcte Type : Unitaire Priorite : P0 Couvre : TA-4
Prerequis : Envelope stockee avec phrase originale
Donnees de test : Phrase avec dernier mot modifie
Etapes : 1. Tenter restauration avec phrase modifiee 2. Verifier le resultat
Resultat attendu : - H_verify mismatch detecte - Erreur "Invalid recovery phrase" - Pas de tentative de dechiffrement
Automatisable : Oui
TC-NEG-02 — Phrase incorrecte (ordre different)¶
Objectif : Verifier le rejet d'une phrase avec mots dans le desordre Type : Unitaire Priorite : P0 Couvre : TA-4
Prerequis : Envelope stockee
Donnees de test : Memes mots, ordre different
Etapes : 1. Tenter restauration avec mots dans le desordre 2. Verifier le resultat
Resultat attendu : - Checksum BIP-39 invalide OU H_verify mismatch - Restauration refusee
Automatisable : Oui
Vecteurs de test¶
Vecteurs BIP-39 officiels (TREZOR)¶
# Test Vector 1 (24 words)
mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art"
entropy: "0000000000000000000000000000000000000000000000000000000000000000"
seed: "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8"
# Test Vector 2 (24 words)
mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong"
entropy: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
seed: "0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528"
Vecteurs HKDF-SHA3-256 (custom ProbatioVault)¶
# Test Vector 1
IKM: "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8"
salt: "ProbatioVault::Recovery::v1"
info: "550e8400-e29b-41d4-a716-446655440000"
L: 32
K_recovery: "<TO_BE_CALCULATED_BY_REFERENCE_IMPL>"
Resume¶
| Type | Nombre | Couverture |
|---|---|---|
| Tests BIP-39 | 3 | INV-242-05, TA-1 |
| Tests cryptographiques | 5 | INV-242-06, INV-242-07, TA-2, TA-3 |
| Tests verification | 2 | INV-242-08, TA-5 |
| Tests securite | 10 | INV-242-01 à 04, 11, 12, 13, TA-6, 11, 12, 13 |
| Tests UX | 2 | INV-242-09, TA-7 |
| Tests architecture | 1 | INV-242-10 |
| Tests E2E | 2 | TA-8, TA-9 |
| Tests performance | 2 | TA-10 |
| Tests compatibilite | 1 | TA-15 |
| Tests API | 3 | TA-16 |
| Tests logs | 1 | TA-6 |
| Tests cas negatifs | 2 | TA-4 |
| TOTAL | 34 | 100% INV, 100% TA |