Chapitre 5 — Chaine de preuve¶
Introduction¶
La chaine de preuve constitue le socle probatoire du SAE ProbatioVault. Elle assure que chaque document archive possede une preuve d'integrite, d'anteriorite et de non-alteration verifiable de maniere autonome, sans acces privilegie au systeme.
Le mecanisme repose sur cinq maillons complementaires, chacun renforçant le precedent :
- Empreinte documentaire SHA3-256 -- ancre cryptographique de chaque document.
- Arbre de Merkle -- agregation par lots avec preuve d'inclusion individuelle.
- Horodatage TSA RFC 3161 -- certification temporelle par un tiers de confiance qualifie.
- Ancrage blockchain -- inscription publique et immuable de la racine Merkle.
- Enveloppe probatoire PV-Envelope -- assemblage des quatre maillons en une preuve composite autonome.
Ce chapitre decrit chaque maillon, ses proprietes cryptographiques, son role dans la chaine et les modalites de verification.
| Composant | Stories | Statut |
|---|---|---|
| Empreinte SHA3-256 | PD-38 | DONE |
| Arbre de Merkle / Batch cryptographique | PD-33, PD-34, PD-237 | DONE |
| Horodatage TSA RFC 3161 | PD-39 | DONE |
| Ancrage blockchain periodique | PD-55, PD-177 | DONE |
| Enveloppe probatoire PV-Envelope | PD-81 | DONE |
5.1 Empreinte documentaire SHA3-256¶
Principe¶
Chaque document depose dans ProbatioVault est associe a une empreinte cryptographique calculee avec l'algorithme SHA3-256 (NIST FIPS 202, famille Keccak). Cette empreinte constitue l'ancre initiale de toute la chaine probatoire.
Calcul sur le document chiffre¶
Le hash est systematiquement calcule sur le document chiffre (doc.enc), jamais sur le document en clair. Ce choix fondamental repond a deux exigences simultanees :
- Zero-knowledge : le serveur ne manipule jamais le contenu en clair. L'empreinte probatoire est produite sans dechiffrement, preservant la confidentialite totale du document.
- Determinisme : pour un meme fichier chiffre, l'empreinte produite est toujours identique. La verification ulterieure consiste a recalculer le hash sur le fichier stocke et a comparer le resultat avec l'empreinte enregistree. Toute divergence signale une alteration.
Proprietes cryptographiques¶
| Propriete | Valeur |
|---|---|
| Algorithme | SHA3-256 (Keccak, construction eponge) |
| Standard | NIST FIPS 202 |
| Taille de sortie | 256 bits (32 octets, 64 caracteres hexadecimaux) |
| Resistance aux collisions | 2^128 operations |
| Resistance aux pre-images | 2^256 operations |
| Resistance quantique | Oui (construction eponge) |
L'algorithme SHA3-256 a ete retenu pour ses proprietes de resistance face aux attaques quantiques et son independance architecturale vis-a-vis de la famille SHA-2 (construction Merkle-Damgard). Il est conforme aux recommandations de l'ANSSI et aux exigences des normes NF Z42-013 et ISO 14641.
Flux de calcul¶
Lors du depot d'un document :
- Le client chiffre le document cote client (AES-256-GCM avec cle derivee K_doc).
- Le fichier chiffre est transmis au backend.
- Le
HashServicecalcule l'empreinte SHA3-256 du fichier chiffre. - L'empreinte est stockee en base de donnees (
hash_doc) et associee au document. - L'empreinte est restituee au deposant comme accuse de reception.
Pour les fichiers volumineux (superieurs a 10 Mo), le calcul s'effectue en mode streaming par blocs successifs, sans charger l'integralite du fichier en memoire.
Verification d'integrite¶
Un verificateur — interne ou externe — peut a tout moment :
- Recuperer le fichier chiffre depuis le stockage WORM.
- Recalculer l'empreinte SHA3-256 sur ce fichier.
- Comparer le resultat avec l'empreinte enregistree en base.
Si les deux valeurs coincident, l'integrite du document est confirmee. Toute difference constitue une preuve de falsification ou de corruption.
5.2 Arbre de Merkle¶
Principe du batch cryptographique¶
Les documents ne sont pas horodates individuellement. ProbatioVault regroupe les empreintes documentaires en lots (batches) et construit un arbre de Merkle dont la racine unique represente l'ensemble du lot. Cette racine est ensuite soumise a l'horodatage TSA et a l'ancrage blockchain.
Ce modele de batch cryptographique presente deux avantages majeurs :
- Efficience : une seule requete TSA et une seule transaction blockchain couvrent l'ensemble des documents du lot, reduisant les couts et la latence.
- Preuve individuelle : chaque document conserve une preuve d'inclusion dans l'arbre, permettant de demontrer son appartenance au lot sans reveler les autres documents.
Construction de l'arbre¶
L'arbre de Merkle est construit conformement aux RFC 6962 et RFC 9162 (Certificate Transparency) :
- Tri lexicographique : les empreintes SHA3-256 des documents du lot sont triees par ordre lexicographique. Ce tri garantit le determinisme -- un meme ensemble de documents produit toujours le meme arbre.
- Calcul des feuilles : chaque empreinte est transformee en feuille par
SHA-256(0x00 || hash_document). Le prefixe0x00distingue les feuilles des noeuds internes. - Construction ascendante : les noeuds internes sont calcules par paires :
SHA-256(0x01 || fils_gauche || fils_droit). Le prefixe0x01distingue les noeuds internes des feuilles. Si le nombre de noeuds a un niveau est impair, le dernier noeud est promu au niveau superieur. - Racine : le noeud final de l'arbre est la racine Merkle (Merkle root), empreinte unique et deterministe representant l'integralite du lot.
Diagramme : Structure arbre de Merkle¶
graph TB
R["Racine Merkle<br/>SHA-256(0x01 || H_AB || H_CD)"]
H_AB["Noeud H_AB<br/>SHA-256(0x01 || F_A || F_B)"]
H_CD["Noeud H_CD<br/>SHA-256(0x01 || F_C || F_D)"]
F_A["Feuille F_A<br/>SHA-256(0x00 || hash_doc1)"]
F_B["Feuille F_B<br/>SHA-256(0x00 || hash_doc2)"]
F_C["Feuille F_C<br/>SHA-256(0x00 || hash_doc3)"]
F_D["Feuille F_D<br/>SHA-256(0x00 || hash_doc4)"]
D1["Doc 1<br/>SHA3-256"]
D2["Doc 2<br/>SHA3-256"]
D3["Doc 3<br/>SHA3-256"]
D4["Doc 4<br/>SHA3-256"]
R --> H_AB
R --> H_CD
H_AB --> F_A
H_AB --> F_B
H_CD --> F_C
H_CD --> F_D
F_A --> D1
F_B --> D2
F_C --> D3
F_D --> D4 Legende : Les documents (en bas) sont haches en SHA3-256. Chaque empreinte devient une feuille de l'arbre (prefixe 0x00). Les noeuds intermediaires sont calcules par paire (prefixe 0x01). La racine Merkle au sommet represente l'ensemble du lot de maniere deterministe.
Preuve d'inclusion¶
Pour demontrer qu'un document appartient a un lot scelle, ProbatioVault genere une preuve d'inclusion conforme a la RFC 9162. Cette preuve contient :
- L'empreinte du document (leaf hash).
- L'indice de la feuille dans l'arbre (leaf index).
- Le chemin d'authentification (Merkle path) : la sequence des noeuds freres necessaires pour recalculer la racine depuis la feuille.
La verification s'effectue en complexite logarithmique O(log n), ou n est le nombre de documents dans le lot. Le verificateur :
- Part de l'empreinte du document.
- Combine successivement avec chaque noeud du chemin d'authentification.
- Compare le resultat final avec la racine Merkle publiee.
Si les deux valeurs coincident, l'appartenance du document au lot est mathematiquement prouvee.
Cycle de vie du batch¶
Un batch suit une machine a etats stricte :
- OPEN : le lot accepte de nouveaux documents.
- SEALED : le lot est clos, l'arbre de Merkle est construit, aucun ajout n'est plus possible.
- TIMESTAMPED : la racine a ete horodatee par la TSA.
- ANCHORED : la racine a ete ancree sur la blockchain.
L'arbre de Merkle, une fois construit, est serialise en format CBOR et persiste en base de donnees. Cette persistence permet de regenerer les preuves d'inclusion a tout moment.
5.3 Horodatage TSA RFC 3161¶
Principe de l'horodatage certifie¶
L'horodatage par une Autorite d'Horodatage (TSA — Time Stamping Authority) conforme a la RFC 3161 etablit une preuve d'anteriorite certifiee par un tiers de confiance independant. Ce tiers atteste que les donnees existaient a un instant donne.
ProbatioVault exige une QTSA qualifiee eIDAS (Qualified Time Stamping Authority), c'est-a-dire un prestataire de services de confiance inscrit sur une Trusted List officielle europeenne. Ce niveau de qualification confere a l'horodatage une presomption de fiabilite au sens du reglement eIDAS.
Flux d'horodatage¶
- Cloture du batch : le lot est scelle et la racine Merkle est calculee.
- Requete TSA : ProbatioVault soumet l'empreinte de la racine Merkle a la QTSA via le protocole RFC 3161.
- Emission du jeton : la QTSA retourne un jeton d'horodatage signe (TST — Time Stamp Token) contenant :
- L'empreinte soumise.
- L'horodatage precis (horloge de reference du tiers de confiance).
- La signature du tiers de confiance.
- La chaine de certification.
- L'identifiant de politique (policy OID).
- Persistance : le jeton est stocke de maniere immuable avec le batch, creant un lien indissociable entre le lot de documents et la preuve temporelle.
Validation du jeton¶
La validation d'un jeton TSA couvre cinq verifications :
| Verification | Description |
|---|---|
| Conformite RFC 3161 | Structure du jeton conforme au protocole |
| Signature | Signature du jeton valide (chaine de certification complete) |
| Revocation | Certificat du tiers non revoque (verification CRL/OCSP) |
| Politique | Policy OID autorisee, QTSA qualifiee eIDAS |
| Coherence temporelle | Horodatage du jeton coherent avec l'horloge de reference |
L'horloge de reference est une source de temps independante de l'horloge systeme locale, evitant toute manipulation de l'horodatage par l'operateur du systeme.
Rattachement individuel¶
Grace a l'architecture par batch, un seul jeton TSA couvre l'ensemble du lot. Le rattachement d'un document individuel a l'horodatage s'effectue via la combinaison :
- Preuve d'inclusion (section 5.2) : demontre l'appartenance du document au lot.
- Jeton TSA : certifie l'anteriorite de la racine du lot.
La preuve complete pour un document est donc : {empreinte_document, preuve_inclusion, jeton_TSA}.
5.4 Ancrage blockchain¶
Principe de l'ancrage public¶
L'ancrage blockchain consiste a inscrire la racine Merkle d'un lot dans une transaction sur une blockchain publique. Cette inscription constitue une preuve publique, immuable et verifiable par quiconque, sans cooperation de ProbatioVault.
L'ancrage renforce la chaine de preuve en ajoutant :
- Immutabilite : une fois inscrite dans un bloc confirme, la racine ne peut etre modifiee ni supprimee.
- Independance : la preuve est verifiable via n'importe quel noeud de la blockchain, sans confiance envers ProbatioVault.
- Horodatage supplementaire : le bloc porte un horodatage propre, constituant une seconde preuve temporelle independante de la TSA.
Cycle de vie de l'ancrage (protocole PV-ANCHOR)¶
L'ancrage suit un protocole formalise avec machine a etats stricte :
| Etat | Description |
|---|---|
| PENDING | Evenements eligibles collectes, lot en constitution |
| BUILDING | Arbre de Merkle construit, racine calculee |
| SUBMITTED | Transaction soumise a la blockchain |
| PENDING_FINALITY | Transaction confirmee, en attente de finalite |
| FINALIZED | Finalite atteinte, lot immutable (etat terminal) |
| FAILED | Echec (erreur, timeout, reorganisation de chaine) |
Les batches finalises sont proteges par un trigger PostgreSQL BEFORE UPDATE OR DELETE qui interdit toute modification. Un batch FAILED libere atomiquement ses evenements, qui redeviennent eligibles pour un nouveau cycle d'ancrage.
Periodicite et continuite¶
Le worker d'ancrage s'execute de maniere periodique (cadence cible : 10 minutes). Il collecte les evenements probatoires non encore ancres, construit le lot et publie la racine. Les fenetres temporelles successives ne laissent aucun intervalle non couvert : tout evenement probatoire est garanti d'etre ancre.
En cas d'absence d'evenements eligibles, le cycle produit une trace no-op auditee, attestant de l'execution periodique.
Verification externe¶
Un verificateur externe peut, a partir des artefacts de preuve exportes :
- Recuperer le hash de la transaction blockchain (
tx_id). - Consulter la blockchain publique pour obtenir la racine Merkle inscrite.
- Verifier la preuve d'inclusion du document dans l'arbre.
- Confirmer que la racine ancree correspond a celle du lot.
Cette verification ne necessite aucun acces privilegie a ProbatioVault. L'artefact de preuve contient toutes les informations requises : leaf hash, Merkle path, Merkle root, tx hash, block number et chain ID (conforme EIP-155).
Gestion des reorganisations¶
En cas de reorganisation de la blockchain (bloc orphelin), le batch transite de PENDING_FINALITY a FAILED. Les evenements sont liberes et re-collectes dans un nouveau cycle, garantissant qu'aucun evenement n'est perdu.
5.5 Enveloppe probatoire PV-Envelope¶
Principe de l'enveloppe probatoire¶
L'enveloppe probatoire PV-Envelope (protocole PV-PROOF) assemble les quatre maillons precedents en une preuve composite unique, autonome et verifiable offline. Elle constitue le livrable final de la chaine de preuve : un dossier complet permettant a un auditeur ou a un juge de verifier l'integrite, l'anteriorite et la non-alteration d'un document sans dependre du systeme ProbatioVault.
Structure de l'enveloppe¶
L'enveloppe PV-Envelope est composee de cinq sections d'evidence obligatoires et d'un bloc de materiel de verification :
| Section | Contenu |
|---|---|
| 1. Mandat | Evidence du mandat legal (eIDAS), verification TSP, certificat |
| 2. Double validation | Approbation DPO et autorite legale avec horodatages |
| 3. Cycle de vie ReKey | Generation, re-chiffrements, etat terminal, destruction |
| 4. Journal d'audit | Evenements signes : hash SHA3-256 + signature HSM ECDSA + references TSA |
| 5. Ancrage | References Merkle (leaf hash, leaf index), references batch, tx hash, block number |
Le materiel de verification inclus dans l'enveloppe comprend :
| Element | Description |
|---|---|
| Label cle HSM | Identifiant de la cle de signature (pv-master-signing-*) |
| Algorithme de hash | SHA3-256 |
| Algorithme de signature | ECDSA P-384 (SHA-384) |
| Cle publique | Format SPKI/DER, permettant la verification offline |
Chaine de preuve a quatre maillons¶
La verification de l'enveloppe s'effectue en parcourant sequentiellement les quatre maillons :
| Maillon | Verification | Resultat |
|---|---|---|
| 1. Hash documentaire | Recalcul SHA3-256 du document vs hash stocke | OK / KO / INDETERMINATE |
| 2. Preuve Merkle | Verification inclusion RFC 9162 vs racine Merkle | OK / KO / INDETERMINATE |
| 3. Horodatage TSA | Validation token RFC 3161 (signature, chaine, revocation, politique) | OK / KO / INDETERMINATE |
| 4. Ancrage blockchain | Transaction confirmee, batch FINALIZED | OK / KO / INDETERMINATE |
Le statut INDETERMINATE signifie que le maillon ne peut pas etre verifie a l'instant de la consultation (par exemple, blockchain temporairement inaccessible). Ce statut n'est ni un succes ni un echec.
Proprietes de surete¶
L'enveloppe probatoire garantit les proprietes suivantes, verifiees formellement (TLA+, Alloy, Z) :
- Completude : les cinq sections sont obligatoires pour la finalisation. Une section manquante interdit la generation.
- Immutabilite : une enveloppe persistee ne peut plus etre modifiee (trigger PostgreSQL).
- Absence de secrets : aucun secret cryptographique (cle privee, cle de chiffrement) ne figure dans l'enveloppe. Seuls les elements publics sont inclus.
- Autonomie de verification : le materiel de verification (cle publique, algorithmes) est integre dans l'enveloppe, permettant une verification complete sans acces a ProbatioVault.
- Tracabilite : la generation de chaque enveloppe est enregistree dans le journal d'audit append-only.
Diagramme : Flux de scellement¶
sequenceDiagram
participant C as Client
participant B as Backend
participant H as HashService
participant M as MerkleService
participant T as QTSA RFC 3161
participant BC as Blockchain
participant E as PV-Envelope
C->>B: Upload document chiffre
B->>H: hashDocument(doc.enc)
H-->>B: SHA3-256 (empreinte)
B->>B: Stockage WORM + enregistrement hash
B->>M: Ajout empreinte au batch
Note over M: Cloture du batch
M->>M: buildTree(empreintes triees)
M-->>B: Racine Merkle
B->>T: Requete RFC 3161 (racine)
T-->>B: Jeton TSA signe
B->>BC: anchorRoot(racine)
BC-->>B: tx_id + block_number
B->>E: Assemblage preuve composite
E-->>B: PV-Envelope finalisee Legende : Le flux complet de scellement, du depot du document chiffre jusqu'a l'assemblage de l'enveloppe probatoire. Le client transmet le document chiffre. Le backend calcule l'empreinte SHA3-256, l'integre dans un batch Merkle, soumet la racine a la TSA qualifiee, ancre la racine sur la blockchain, puis assemble l'ensemble dans une enveloppe PV-Envelope autonome et verifiable.
Synthese des garanties¶
La chaine de preuve ProbatioVault apporte les garanties suivantes pour chaque document archive :
| Garantie | Mecanisme | Verificateur |
|---|---|---|
| Integrite | Empreinte SHA3-256 sur document chiffre | Tout detenteur du fichier |
| Appartenance a un lot | Preuve d'inclusion Merkle O(log n) | Tout detenteur de la preuve |
| Anteriorite certifiee | Jeton TSA RFC 3161 signe par QTSA eIDAS | Tout detenteur du jeton |
| Immutabilite publique | Ancrage blockchain public | Tout noeud de la blockchain |
| Preuve composite autonome | PV-Envelope avec materiel de verification | Tout verificateur offline |
Chaque maillon renforce les precedents : l'empreinte prouve l'integrite, l'arbre de Merkle permet la preuve par lot, la TSA certifie la date, la blockchain rend la preuve publique et immuable, et l'enveloppe probatoire assemble le tout en un dossier autosuffisant.
References¶
- NIST FIPS 202 : Standard SHA3-256 (Keccak).
- RFC 6962 / RFC 9162 : Certificate Transparency, construction d'arbres de Merkle et preuves d'inclusion.
- RFC 3161 : Time-Stamp Protocol.
- RFC 8785 : JSON Canonicalization Scheme (serialisation canonique).
- EIP-155 : Simple Replay Attack Protection (identifiant de chaine).
- RFC PV-ANCHOR-001 : Protocole d'ancrage blockchain ProbatioVault.
- RFC PV-PROOF-001 : Protocole ProofEnvelope ProbatioVault.
- NF Z42-013:2020 : Archivage electronique.
- ISO 14641:2018 : Conception et exploitation de systemes d'archivage electronique.
- Stories : PD-33, PD-34, PD-38, PD-39, PD-55, PD-81, PD-177, PD-237.