PD-103 — Expression de besoin¶
1. Contexte¶
L'application iOS ProbatioVault permet de constituer des preuves numériques scellées cryptographiquement. Dans de nombreux cas d'usage (harcèlement, fraude, litige contractuel, preuve d'antériorité, capture de contenu éphémère), l'utilisateur doit pouvoir capturer et sceller immédiatement une information visuelle affichée sur son device.
Les captures d'écran classiques : - peuvent être falsifiées, - ne possèdent aucune preuve temporelle fiable, - ne permettent pas d'attester de leur intégrité.
ProbatioVault doit permettre de transformer une capture d'écran en preuve cryptographiquement scellée, intégrée dans la chaîne probatoire de la plateforme (Merkle + TSA + HSM + blockchain).
2. Objectif¶
Permettre à l'utilisateur de capturer une preuve visuelle instantanée (screenshot applicatif) depuis l'application iOS ProbatioVault, puis de :
- Sceller automatiquement la capture dans l'infrastructure probatoire
- Extraire du texte via OCR (optionnel, local uniquement)
- Envoyer automatiquement la preuve vers le backend pour inclusion dans la chaîne probatoire
- Notifier l'utilisateur lorsque le scellement est confirmé
La fonctionnalité doit permettre de capturer rapidement une preuve contextuelle (conversation, site web, message, document affiché) et de l'ancrer juridiquement sans friction utilisateur.
3. Invariant fondamental — Intégrité probatoire¶
L'image capturée doit être conservée sans transformation destructrice. Interdictions : recompression, redimensionnement, modification couleur. Le hash doit être calculé localement avant tout upload.
3.1. Distinction fichier original / fichier soumis / fichier probatoire¶
(Learning PD-101) : Pour toute opération mobile pouvant impliquer un transcodage (iOS peut transcoder silencieusement), la distinction entre : - fichier original : l'image capturée brute - fichier soumis : le fichier effectivement uploadé (doit être bit-à-bit identique à l'original) - fichier probatoire : le fichier scellé dans la chaîne
doit être définie explicitement. Tout transcodage silencieux invaliderait la preuve.
4. Périmètre¶
4.1. Inclus¶
- Capture d'écran depuis l'application iOS (contenu applicatif)
- Prévisualisation de la capture avant validation
- Génération de hash local (SHA3-256)
- OCR optionnel (Apple Vision Framework, local uniquement)
- Chiffrement local (AES-256-GCM)
- Upload automatique vers backend via URL pré-signée
- Inclusion dans pipeline de scellement (Merkle batch + TSA + HSM + ancrage blockchain)
- Notification utilisateur lorsque la preuve est scellée
4.2. Exclus¶
- Capture d'écran globale du système iOS (limitée par sandbox Apple)
- Capture vidéo
- Annotation avancée d'image
- Analyse IA du contenu
- Import depuis galerie (story séparée)
5. Acteurs¶
| Acteur | Responsabilités |
|---|---|
| Utilisateur mobile | Déclenche la capture, valide ou annule, reçoit la confirmation |
| Application iOS | Capture l'image, calcule le hash, lance OCR optionnel, chiffre et upload |
| Backend ProbatioVault | Reçoit la capture, génère l'événement probatoire, inclut dans Merkle batch, déclenche TSA + ancrage |
6. Flux nominal¶
6.1. Capture¶
- L'utilisateur ouvre l'outil "Capture probatoire" dans l'application
- L'utilisateur déclenche la capture
- L'application capture le contenu affiché
- Résultat :
image.png,timestamp_device,metadata_device
6.2. Préparation probatoire locale¶
L'application : - Calcule le hash : hash = SHA3-256(image_bytes) - Génère les métadonnées : { device_id, timestamp_device, app_version, mime_type, size } - Optionnellement lance l'OCR
6.3. OCR (optionnel)¶
Si activé : - Utilisation d'Apple Vision Framework (reconnaissance texte locale) - Extraction : ocr_text, ocr_confidence, ocr_language - Objectifs : indexation future, recherche dans preuves, extraction de contexte - L'OCR ne remplace pas l'image originale — il enrichit les métadonnées - L'OCR reste local et ne déclenche pas de traitement IA externe
6.4. Upload¶
L'application : - Chiffre la capture (AES-256-GCM avec K_doc) - Upload vers S3 via URL signée - Envoie au backend : POST /documents/capture avec { hash, metadata, ocr_text?, mime_type, size }
(Learning PD-101) : Chiffrement file-level obligatoire (pas chunk-level) pour éviter nonce reuse GCM en multipart.
6.5. Scellement¶
Backend : - Enregistre événement probatoire - Ajoute dans batch Merkle - Signature HSM - Timestamp TSA - Ancrage blockchain
L'événement rejoint la preuve composite ProbatioVault.
6.6. Notification¶
Lorsque le scellement est confirmé : - Push notification iOS : "Votre capture a été scellée avec succès. Preuve vérifiable disponible." - Dans l'application : Status: SEALED, Merkle proof: available
7. États¶
(Learning PD-251) : Le guard de transition vers SEALED doit vérifier signature_status='SIGNED' ET hsm_signature_ref NOT NULL, pas seulement l'existence du snapshot.
8. Exigences fonctionnelles¶
| ID | Exigence | Critère |
|---|---|---|
| EF-1 | Capture rapide | Capture → upload < 5 secondes |
| EF-2 | Preuve intacte | Aucune transformation destructrice (recompression, redimensionnement, modification couleur) |
| EF-3 | Hash local | Hash calculé avant upload |
| EF-4 | OCR désactivable | L'utilisateur peut activer/désactiver l'OCR |
| EF-5 | Upload automatique | Après validation utilisateur, upload sans manipulation manuelle |
| EF-6 | Notification scellement | L'utilisateur est notifié lorsque le statut atteint SEALED |
9. Exigences non fonctionnelles¶
| Domaine | Exigence |
|---|---|
| Performance | Capture → upload : < 5 s ; Scellement complet : < 10 min (batch Merkle) |
| Sécurité | Chiffrement local ; aucune capture non chiffrée stockée sur serveur ; suppression cache image locale après upload |
| Vie privée | OCR reste local, aucun traitement IA externe |
10. Cas d'erreur¶
| ID | Situation | Comportement attendu |
|---|---|---|
| ER-1 | Upload échoue | Retry automatique + queue locale |
| ER-2 | Capture annulée | Aucune donnée stockée |
| ER-3 | OCR échoue | Continuer sans OCR (non bloquant) |
| ER-4 | Réseau indisponible | Stockage temporaire chiffré local, upload différé |
(Learning PD-283/PD-262) : Les fichiers temporaires sensibles (capture chiffrée en attente d'upload) doivent être purgés au démarrage du flux, pas seulement en finally block.
11. Critères d'acceptation¶
| ID | Critère |
|---|---|
| CA-1 | Une capture peut être réalisée en < 3 secondes |
| CA-2 | Le hash de l'image est calculé localement avant upload |
| CA-3 | La capture est visible dans le coffre ProbatioVault |
| CA-4 | La preuve est incluse dans un Merkle batch probatoire |
| CA-5 | L'utilisateur reçoit une notification lorsque le statut atteint SEALED |
12. Risques¶
| Risque | Mitigation |
|---|---|
| Limitation iOS sandbox | Capture du contenu de l'app uniquement ; import galerie pour captures externes (story séparée) |
| OCR imparfait | Le texte extrait n'a pas valeur probatoire. La preuve repose uniquement sur image + hash |
| Transcodage silencieux iOS | Vérifier bit-à-bit que le fichier uploadé correspond au fichier capturé (cf. §3.1) |
13. Dépendances¶
| Story | Description | Statut |
|---|---|---|
| PD-41 | PRE Engine | Requis |
| PD-56 | Merkle Proof | Requis |
| PD-48 | Purge rétention | Requis |
| — | Storage S3 WORM | Infrastructure |
14. Arbitrages et learnings injectés¶
- PD-101 (upload probatoire iOS) : Distinction fichier original/soumis/probatoire obligatoire quand iOS peut transcoder. Chiffrement file-level (pas chunk-level) pour éviter nonce reuse GCM.
- PD-248 (screenshot protection iOS) : Spécification complète avec INV, CA, écrans sensibles.
expo-screen-capturecomme dépendance validée. - PD-251 (HSM signature guard) : Double vérification
signature_status + hsm_signature_refpour le guard de transition vers SEALED. - PD-283/PD-262 (purge fichiers temporaires) :
purgeStale()au démarrage du flux, pas seulement en finally.