Aller au contenu

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 :

  1. Sceller automatiquement la capture dans l'infrastructure probatoire
  2. Extraire du texte via OCR (optionnel, local uniquement)
  3. Envoyer automatiquement la preuve vers le backend pour inclusion dans la chaîne probatoire
  4. 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

  1. L'utilisateur ouvre l'outil "Capture probatoire" dans l'application
  2. L'utilisateur déclenche la capture
  3. L'application capture le contenu affiché
  4. 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

CAPTURED → UPLOADING → UPLOADED → PENDING_SEAL → SEALED → ANCHOR_CONFIRMED

(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

  1. 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.
  2. PD-248 (screenshot protection iOS) : Spécification complète avec INV, CA, écrans sensibles. expo-screen-capture comme dépendance validée.
  3. PD-251 (HSM signature guard) : Double vérification signature_status + hsm_signature_ref pour le guard de transition vers SEALED.
  4. PD-283/PD-262 (purge fichiers temporaires) : purgeStale() au démarrage du flux, pas seulement en finally.