Vérifiez un résultat vous-même
Chaque résultat publié est accompagné des bulletins qui l’ont produit et d’un programme distinct qui les recompte. Vous n’êtes pas obligé de nous croire sur parole, et vous n’avez besoin ni de compte, ni de dépôt de code, ni d’installation pour le vérifier.
Ce qu’il vous faut
Trois choses, que vous avez presque certainement déjà.
- L’adresse du résultat publié. Votre association vous l’a communiquée : c’est la page qui affiche les totaux.
- Python 3, livré avec macOS et toutes les distributions Linux, et téléchargeable gratuitement sous Windows. L’outil n’utilise que la bibliothèque standard : il n’y a rien à installer.
- Environ cinq minutes.
Comment procéder
- Créez un dossier vide et téléchargez-y les six fichiers du paquet scellé, depuis la page du résultat publié.
- Téléchargez l’outil de recomptage dans le même dossier.
- Lancez-le en lui indiquant ce dossier. Il affiche ce qu’il a trouvé et se termine par une ligne indiquant si tout concorde.
Les commandes
Remplacez l’adresse de la troisième ligne par celle de votre page de résultats — la partie située avant /ballots.json. Le reste se copie tel quel.
mkdir check && cd check
# the six files that make up the sealed package
BASE=https://myelection.app/o/your-club/results/00000000-0000-0000-0000-000000000000
for f in ballots.json result.json summary.json receipts.txt ballots.csv MANIFEST.sha256; do
curl -fsSLO "$BASE/$f"
done
# the recount tool
curl -fsSL https://myelection.app/verify/recount.py -o recount.py
python3 recount.py .
Sous Windows sans curl : ouvrez la page de résultats, enregistrez chacun des six fichiers dans un même dossier avec « Enregistrer la cible sous », placez recount.py à côté, puis exécutez « python recount.py . » dans ce dossier.
L’outil
Un seul fichier, 428 lignes de Python, 16468 octets. C’est une seconde implémentation de la règle de décompte, écrite dans un autre langage que le logiciel ayant produit le résultat et ne partageant aucun code avec lui : une erreur de l’un ne serait donc pas répétée par l’autre. Il ne lit que les fichiers que vous avez téléchargés et n’effectue aucune requête réseau.
Son empreinte SHA-256, pour confirmer que vous disposez bien du fichier décrit sur cette page, et pour que deux personnes vérifiant la même élection s’assurent d’avoir utilisé le même outil :
f7f7a9592c2f56ce4ea97298e483ceae2de34df27c929611573fe15ec317a1b3
Ce que contient le paquet scellé
Six fichiers, publiés avec chaque résultat. Aucun ne contient de nom, d’adresse ni quoi que ce soit identifiant un votant — c’est une propriété de leur construction, et non une suppression opérée au moment de la publication.
| Fichier | Ce que c’est |
|---|---|
| ballots.json | Chaque bulletin anonyme avec ses choix, ainsi que les règles en vigueur : les candidats ou les options, les sièges, le nombre de choix autorisés, la règle en cas d’égalité et, pour une résolution, le seuil. C’est l’intégralité de l’entrée du décompte. |
| result.json | Ce que l’application a conclu. L’outil compare ses propres totaux à ce fichier, ligne par ligne. |
| summary.json | Le corps électoral, les bulletins acceptés, les codes utilisés, la participation, ainsi que les empreintes de la configuration et du registre prises au moment du gel. |
| receipts.txt | La référence affichée à chaque votant lors de l’envoi. Si vous avez voté, la vôtre y figure. |
| ballots.csv | Les mêmes bulletins sous forme de tableur, si vous préférez les additionner dans Excel plutôt que d’exécuter quoi que ce soit. |
| MANIFEST.sha256 | Une empreinte SHA-256 pour chacun des fichiers ci-dessus, et une empreinte couvrant l’ensemble. C’est ce qui rend toute altération détectable. |
Le journal d’audit est la seule chose qui n’est pas publiée ici : il nomme les responsables de votre association et ce que chacun a fait ; il leur est donc accessible, ainsi qu’à un auditeur désigné, plutôt qu’à tout internet. Son empreinte de tête est publiée avec le résultat, ce qui rend détectable toute réécriture ultérieure.
Ce qu’il vérifie, et comment lire le résultat
Cinq points, dans cet ordre. Chaque anomalie est signalée par un point d’exclamation et comptée dans la dernière ligne.
- Les fichiers sont bien ceux que décrit le manifeste. L’outil recalcule l’empreinte SHA-256 de chaque fichier nommé dans MANIFEST.sha256. Si un seul octet a changé, la vérification échoue.
- Il compte lui-même les bulletins, à partir du seul fichier ballots.json — en signalant tout bulletin compté deux fois, tout bulletin nommant un candidat inconnu et tout bulletin comportant plus de choix que les règles ne l’autorisaient.
- Il établit le résultat. Pour une élection, il indique quels totaux pourvoient les sièges et signale une égalité à la limite des sièges sans la trancher. Pour une résolution, il applique le seuil convenu et indique si elle est adoptée ou rejetée.
- Il compare ses totaux à result.json, candidat par candidat. C’est la ligne qui compte : « AGREE: every candidate total matches. »
- Il rapproche les chiffres. Les bulletins acceptés doivent égaler les codes utilisés ; son propre décompte doit correspondre au récapitulatif ; les références publiées doivent être uniques et aussi nombreuses que les bulletins ; et la configuration ne doit pas avoir changé depuis le gel.
À quoi ressemble une exécution
Une exécution réelle sur une élection de comité à trois sièges où il y avait égalité pour le dernier siège.
Sealed package: .
==================================================================
Manifest : 5 files, all hashes match
Package hash : a7f18f378be1afedad94d585bb0a29cf9e1fc9d32bafce2a364ac2e950139dbc
Independent recount
------------------------------------------------------------------
Ballots counted: 12 (blank: 1)
Anna Fields 10 <- fills a seat
Bob Marsh 8 <- fills a seat
Charles Okoro 6 <- tied for the last seat
Dana Reid 6 <- tied for the last seat
Eve Salter 2
Frank Tan 1
* the seat boundary fell inside a tie at 6 votes. The rule agreed beforehand
was: Lot drawn by the chair and secretary at the next committee meeting.
What the officers did about it is recorded on the published result page
and in the audit log.
Comparison with the application's result.json
------------------------------------------------------------------
AGREE: every candidate total matches.
Reconciliation
------------------------------------------------------------------
Accepted ballots : 12
Redeemed credentials : 12
==================================================================
RESULT: the count reconciles.
1 matter(s), marked * above, needed the officers' decision rather
than the count's.
Deux choses à lire. « AGREE: every candidate total matches » est la ligne indiquant que ce programme et celui qui a produit la page sont parvenus aux mêmes totaux, indépendamment. Et la dernière ligne distingue deux choses différentes : un problème, signalé par un point d’exclamation, signifie que les chiffres ne concordent pas ; un point signalé par une étoile signifie que le décompte était complet mais qu’une décision revenait aux responsables — c’est le cas d’une égalité. Un scrutin sans égalité se termine simplement par « RESULT: everything reconciles ».
En cas de désaccord
Ne présumez pas que vous vous êtes trompé. Transmettez le résultat aux responsables de votre association et demandez-leur de l’exécuter eux-mêmes : tout l’intérêt d’une seconde implémentation est qu’elle a le droit d’être en désaccord. S’ils ne peuvent pas l’expliquer, le résultat ne devrait pas être maintenu.
Ce qu’une vérification réussie prouve, et ce qu’elle ne prouve pas
Elle prouve que les bulletins publiés produisent bien les totaux publiés, et qu’aucun des fichiers publiés n’a été modifié depuis le scellement. C’est déjà considérable, et c’est la partie la plus susceptible d’échouer par erreur de programmation plutôt que par mauvaise foi.
Elle ne prouve pas à elle seule que ces bulletins sont ceux que les votants ont déposés. Deux autres éléments s’en chargent : le rapprochement ci-dessus, qui exige que le nombre de bulletins acceptés égale le nombre de codes réellement utilisés, et chaque votant qui vérifie que sa propre référence figure dans receipts.txt. Une association dont les membres le font a comblé l’écart ; un recomptage seul ne l’a pas fait.
Et elle ne dit rien de la façon dont chacun a voté, car rien dans ces fichiers ne le pourrait. Aucune colonne, nulle part dans ce service, ne relie un bulletin à une personne.
Pourquoi c’est construit ainsi
Comment les noms et les votes sont séparés, ce qui est chiffré, où résident les données, et ce contre quoi ce service ne vous protège pas.