Architecture Application Mobile ProbatioVault
Ce document décrit l'architecture spécifique à l'application mobile. Voir la vue d'ensemble globale pour l'architecture complète.
Stack technique
| Composant | Technologie | Version |
| Framework | Expo | SDK 52 |
| UI | React Native | 0.76.x |
| Language | TypeScript | 5.x (strict) |
| State | Zustand | 4.x |
| Navigation | React Navigation | 6.x |
| Crypto | argon2-browser, js-sha3 | - |
| Storage | Secure Store | Expo |
Architecture de l'application
src/
├── components/
│ ├── common/ # Composants réutilisables
│ ├── vault/ # Composants coffre-fort
│ └── security/ # Composants sécurité
├── screens/
│ ├── auth/ # Login, Register
│ ├── vault/ # Liste documents, détail
│ └── settings/ # Paramètres
├── services/
│ ├── crypto/ # Fonctions cryptographiques
│ ├── storage/ # Stockage local
│ ├── api/ # Client API
│ └── sync/ # Synchronisation
├── hooks/ # Custom hooks
├── store/ # Zustand stores
├── navigation/ # Configuration navigation
├── constants/ # Constantes
├── types/ # Types TypeScript
└── utils/ # Utilitaires
Modules principaux
Crypto Services
Responsable de toutes les opérations cryptographiques :
services/crypto/
├── keyDerivation.ts # Argon2id, HKDF
├── encryption.ts # AES-256-GCM
├── hashing.ts # SHA3-256
└── keystore.ts # Gestion Master Envelope
Store (Zustand)
store/
├── authStore.ts # État authentification
├── vaultStore.ts # Documents et dossiers
├── settingsStore.ts # Préférences utilisateur
└── syncStore.ts # État synchronisation
Navigation
┌─────────────┐
│ AuthStack │ ← Non authentifié
├─────────────┤
│ Login │
│ Register │
└──────┬──────┘
│ Authentifié
▼
┌─────────────┐
│ MainStack │ ← Authentifié
├─────────────┤
│ VaultTab │ ← Documents
│ SettingsTab │ ← Paramètres
└─────────────┘
Flux de données
State Management
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Screen │────>│ Store │────>│ Service │
└─────────────┘ └─────────────┘ └─────────────┘
▲ │ │
│ │ │
└───────────────────┘ │
React re-render │
▼
┌─────────────┐
│ API/Local │
└─────────────┘
Exemple : Chargement documents
// Screen
const { documents, fetchDocuments } = useVaultStore();
useEffect(() => {
fetchDocuments();
}, []);
// Store
const useVaultStore = create((set) => ({
documents: [],
loading: false,
fetchDocuments: async () => {
set({ loading: true });
const docs = await vaultService.getDocuments();
set({ documents: docs, loading: false });
},
}));
// Service
const getDocuments = async () => {
const response = await api.get('/documents');
return response.data.map(decryptMetadata);
};
Sécurité
Stockage sensible
| Donnée | Stockage | Méthode |
| Master Envelope | Secure Store | Keychain iOS / Keystore Android |
| JWT Token | Secure Store | Keychain iOS / Keystore Android |
| Documents cache | Chiffré local | AES-256-GCM avec K_doc |
| Préférences | AsyncStorage | Non sensible |
Protection mémoire
// Zeroize après usage
function zeroize(buffer: Uint8Array): void {
buffer.fill(0);
}
// Usage
const kDoc = await deriveDocumentKey(kMaster, docId);
try {
const plaintext = decrypt(ciphertext, kDoc);
// utiliser plaintext...
} finally {
zeroize(kDoc);
}
Optimisations
- Lazy loading des écrans
- Memoization des composants lourds
- Cache documents déchiffrés (mémoire uniquement)
- Pagination des listes
Métriques cibles
| Opération | Cible |
| Dérivation Argon2id | < 1s |
| Déchiffrement document | < 100ms |
| Chargement liste | < 500ms |
| Navigation écran | < 300ms |
Liens