Aller au contenu

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 :

K_recovery : (32 bytes aleatoires)
K_master : (32 bytes aleatoires)

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 :

K_recovery : (32 bytes aleatoires)
K_master : "0123456789abcdef0123456789abcdef" (hex)

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 :

K_recovery : (derivee de phrase connue)
user_id : "550e8400-e29b-41d4-a716-446655440000"

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 :

Phrase originale : (24 mots)
Phrase incorrecte : (1 mot different)

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 :

user_id : "test-user-rate-limit"
phrase : (5 phrases incorrectes + 1 correcte)

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 :

mnemonic : (phrase test)
user_id : (UUID test)
K_master : (valeur 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 :

{
  "user_id": "test-user-api",
  "envelope": "base64...",
  "h_verify": "base64..."
}

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