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¶
- Vue d'ensemble
- Prérequis
- Tests iOS (iPhone/iPad)
- Tests Android (Smartphone/Tablette)
- Tests Web (Navigateurs)
- Critères de validation
- Résultats attendus
- 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¶
- Lancer l'app sur iPhone :
- Ouvrir Xcode Console :
- Xcode → Window → Devices and Simulators → Open Console
Test T1 : Dérivation basique¶
Procédure :
- Dans l'app, aller à Login Screen
- Entrer password :
TestPassword123! - 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 :
- Login avec
TestPassword123!→ Copier hash affiché - Logout
- Login à nouveau avec
TestPassword123!→ Copier hash affiché - 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 :
- Créer compte utilisateur A → Copier salt affiché
- Créer compte utilisateur B → Copier salt affiché
- Comparer les salts
Vérifier :
Résultat attendu : Salts complètement différents
Test T4 : Memory footprint¶
Procédure :
- Ouvrir Instruments (Xcode → Product → Profile)
- Sélectionner template Allocations
- Lancer l'app et déclencher login
- Observer pic mémoire pendant dérivation Argon2id
Vérifier :
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 :
- Dans Debug menu, activer Crypto Stress Test
- Sélectionner 10 Argon2id derivations
- 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¶
- Lancer l'app sur Android :
- Ouvrir Logcat :
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¶
- Lancer l'app Web :
- Ouvrir dans navigateurs :
- Chrome :
http://localhost:8081 - Safari :
http://localhost:8081 -
Firefox :
http://localhost:8081 -
Ouvrir DevTools → Console
Test T1 : Dérivation basique (Chrome)¶
Procédure :
- Login avec
TestPassword123! - 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 :
- Ouvrir DevTools → Memory profiler
- Déclencher 5 dérivations Argon2id consécutives
- 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) :
Encoded string RFC 9106 :
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 :
- CPU throttling : Device en mode économie batterie
- Debug mode : React Native DevTools ralentit exécution
- Background tasks : Autre app consomme CPU/RAM
Solutions :
- Désactiver mode économie énergie
- Tester en mode Release (pas Debug)
- 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