# Signature de fichiers windows

### Quelques définitions

Un certificat selon le standard x509 contient :&#x20;

* :man: des informations personnelles sur le sujet (ici le dev, nom, organisation)
* :scales: nom du CA qui a signé ce certificat
* :clock1: des informations sur la validité du certificat (expiration...)
* :pen\_ballpoint: la signature du CA (hash du certificat - sans la signature, signé par la clef privée du CA)
* :key: la clef publique du sujet

Une signature est simplement un hash d'une structure, signé par une clef privée.

> Pour un certificat https, on parlera de **SSL Certificate**, pour un certificat d'un programme, on parlera de **Code Signing Certificate**

### Description du processus

1. Le développeur obtient son certificat en le signant lui même ou en l'obtenant depuis une autorité de certification :&#x20;
   1. Il génère sa paire clef publique/clef privée
   2. Il l'envoie au CA avec ses infos&#x20;
   3. Le CA lui renvoie alors son certificat (voir définition au-dessus) contenant sa signature authentifiant les informations contenues.
2. Le développeur signe son programme : il crée un **signature block** avec principalement :
   * :pen\_ballpoint: le hash de son code signé avec sa clef privée
   * &#x20;:scroll: son certificat
   * :information\_source: la méthode de hash utilisée
3. Windows reçoit le programme :&#x20;
   1. Il hash le code (en excluant à la lecture du PE la section recevant le certificat)
   2. Il déchiffre le hash du code signé (voir 2.) et le compare avec le hash précédent. \
      Il peut déchiffrer ce hash grâce à la clef publique du certificat du **signature block** (voir 2.).
   3. Si les deux matchent , le certificat correspond bien à la clef publique liée et le hash est le même qu'au moment de la signature du code, ce dernier est intègre. \
      -> On peut maintenant vérifier la signature du certificat (par le CA) : on obtient le nom du CA (issuer) situé dans le certificat. Avec ce nom on peut aller chercher dans une base locale de certificats de CA "racines" (root certificates) le certificat correspondant et dedans la clef publique correspondant à ce CA. Cela nous permet de déchiffrer la signature et d'obtenir le hash supposé du certificat (sans la signature). On calcule à côté le hash du certificat (sans la signature) et on compare : si les deux correspondent le certificat est bien signé par la CA en question.

### Ressources

* [Wikipedia, CA Authority](https://en.wikipedia.org/wiki/Certificate_authority)
* [Article sur la signature de code](https://www.encryptionconsulting.com/education-center/what-is-code-signing/)
* [Wikipedia, x509](https://en.wikipedia.org/wiki/Public_key_certificate)


---

# 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://wiki.arblade.fr/signature-de-fichiers-windows.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.
