# Horodatage

## But : garantir l'intégrité des données

### Fonctionnement vulgarisé

Afin de prouver l'intégrité des dossiers, chaque jour, **demarche.numerique.gouv.fr** fait une photo de tous les dossiers modifiés. On envoie ensuite l'empreinte de cette photo a un tiers de confiance qualifié qui nous renvoie un jeton d'horodatage déclarant : \
« Moi, Tiers de Confiance, je certifie que **demarche.numerique.gouv.fr** m'a envoyé cette empreinte à cette date ».

### En quoi cela prouve-t-il quoi que soit ?

Le jeton d'horodatage est inaltérable et son auteur peut être identifié. On est donc sûr que l'empreinte de la photo a bien été signée à telle date.\
\
Si on veut vérifier qu'un dossier n'a pas été altéré depuis son traitement :\
\- on prend la prend la photo qui correspond à la dernière modification du dossier\
\- on s'assure que le dossier n'a pas changé depuis cette photo\
\- finalement on vérifie l'intégrité de la photo en calculant son empreinte et en la comparant à l'empreinte enregistré dans le jeton d'horodatage

### C'est quoi cette histoire d'empreinte ?

Voir <https://fr.wikipedia.org/wiki/Fonction_de_hachage>. En simplifié c'est une opération mathématique qui à partir d'un fichier fournit toujours le même grand nombre (empreinte) de sorte que :\
\- pour 2 fichiers différents il y a toujours 2 empreintes différentes\
\- il n'est pas possible de reconstruire le fichier à partir de son empreinte

## Fonctionnement dans le détail

### Les opérations

À chaque changement d'état du dossier, **demarche.numerique.gouv.fr** crée un fichier contenant \
\- le numéro de dossier\
\- la date\
\- l'action\
\- la valeur des champs du dossier

{% code title="procedure-xxx/dossier-yyy/horodatage/operation-zzz-date.json" overflow="wrap" %}

```
{
  "operation": "accepter",
  "dossier_id": 1017534,
  "author": {
    "id": "Instructeur#741",
    "email": "instructeur@beta.gouv.fr"
  },
  "subject": {
    "id": "RG9zc2llci0xMDE3NTM0",
    "number": 1017534,
    "archived": false,
    "state": "accepte",
    "dateDerniereModification": "2021-06-11T15:50:52+02:00",
    "datePassageEnConstruction": "2019-10-28T10:07:04+01:00",
    "datePassageEnInstruction": "2019-10-28T10:08:10+01:00",
    "dateTraitement": "2021-06-11T15:50:52+02:00",
    "instructeurs": [
      {
        "email": "instructeur@beta.gouv.fr"
      }
    ],
    "groupeInstructeur": {
      "label": "défaut"
    },
    "champs": [
      {
        "id": "Q2hhbXAtNDA5MDA=",
        "label": "un premier champ",
        "stringValue": ""
      }
    ],
    "annotations": [],
    "avis": [],
    "demandeur": {
    "civilite": "M",
      "nom": "Nom",
      "prenom": "Prénom",
      "dateDeNaissance": "2019-10-22"
    },
    "motivation": "",
    "motivationAttachment": null,
    "revision": {
      "id": "UHJvY2VkdXJlUmV2aXNpb24tMTMzOA=="
    }
  },
  "automatic_operation": false,
  "executed_at": "2021-06-11T15:50:52+02:00"
}
```

{% endcode %}

L'empreinte de ce fichier est `b193534bd4e8f2f32841e6010286ed98be6dc8e24f89dbd7fae0d5e4496cbcc2`

### L'empreinte des opérations du jour

Toute les nuits, **demarche.numerique.gouv.fr** crée un fichier avec toutes les empreintes des opérations de la journée. Il se présente sous le nom demarches-simplifiees-operations-date.json

{% code title="procedure-xxx/bills/horodatage/demarches-simplifiees-operations-date.json" overflow="wrap" %}

```
{
  "1296796": "b193534bd4e8f2f32841e6010286ed98be6dc8e24f89dbd7fae0d5e4496cbcc2",
  "1283268": "8718c89dcf5eff30099b40b8b144c2b3efb51156e9e4263645250723d78cb6ae"
  ...
}
```

{% endcode %}

On retrouve ici l'empreinte de notre opération.

### L'horodatage de l'empreinte des opérations du jour

**demarche.numerique.gouv.fr** fait horodater ce fichier par un service d'horodatage qualifié par l'ANSSI. Le jeton d'horodatage retourné est présent ici :\
`procedure-xxx/bills/horodatage/demarches-simplifiees-signature-date.der`

### Preuve de l'intégrité de vos dossiers

Pour un dossier donné :\
\- vérifier visuellement la cohérence entre la version pdf et le dernier fichier opération de dossier\
\- puis lancer le script suivant pour vérifier l'horodatage du fichier `command.sh dossier/horodatage/operation`

```
#! /bin/bash

set -o errexit
set -o pipefail
set -o nounset

if [ $# -eq 0 ]
  then
    echo "usage: ./command.sh operation_file"
  exit 1
fi

OPERATION_FILE="${1:-}"
echo -e "\nChecking $OPERATION_FILE\n"

HASH=$(sha256sum $OPERATION_FILE | cut -d ' ' -f1)
echo "HASH: $HASH"

# find matching files
BILL=$(grep -l $HASH bills/horodatage/*)
echo "Bill: $BILL"

DATE=$(echo $BILL| sed 's/.*demarches-simplifiees-operations-//' | sed 's/-.....json//')

TOKEN=$(find . -iname "*signature*$DATE*")
echo -e "Token: $TOKEN\n"

# retrieve provider certificates
mkdir -p store
cd store

## Certigna
curl -sLO http://autorite.certigna.fr/ACcertigna.crt
curl -sLO http://autorite.certigna.fr/entityca.crt

## Universign
curl -sLO https://www.universign.com/documents/certificates/root-ca.pem
curl -sLO https://www.universign.com/documents/certificates/tsa-root-2019.pem
curl -sLO https://www.universign.com/documents/certificates/tsa-root-2015.pem

cd ../

# final verification
openssl ts -verify -CAfile <(cat store/*) -data $BILL -in $TOKEN -token_in
```

Certains horodatages émis par Universign ne sont pas compatibles avec openssl,\
`rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding`\
\
Ils doivent les vérifier eux-même en attendant de mettre à disposition une API. Contactez nous si besoin.

Astuce pour inspecter le contenu d'un jeton :\
`openssl asn1parse -in token -inform der`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.demarches-simplifiees.fr/pour-aller-plus-loin/horodatage.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
