Mis juhtus e-häälte auditeerimisel 2025. aasta KOV valimistel? Audiitori 20.10.2025 toimingu käigus leidis aset segadus, mille asjaolud vaikib audiitor maha ka oma 22.12.2025 lõpparuandes. Esialgse kokkuvõtte toimunust leiab 3.11.2025 blogipostitusest, mille kohta on ka kokkuvõttev video.
Siinne andmehulk1 on 2025. aasta KOV valimiste elektroonilise hääletuse osaline korduslugemine tegelike KOV valimistel antud häältega, mille valijad salvestasid hääletusprotsessi käigus. Vaidlusi põhjustasid korduvad krüptogrammid, mida audiitori raporti väitel oli viis ja mida audiitor oma raportis ekslikult samastab töötlemisrakenduse tuvastataud viie mitte-unikaalse häälekonteineriga:
E-valimiskasti laadimine failist 'conf/../votes.zip'
E-valimiskast on laaditud
E-valimiskasti liigi kontrollimine
E-valimiskasti liik on "Korrastamata e-valimiskast"
Kogumisteenus andis e-valimiskasti koosseisus üle 14 häält
E-valimiskasti andmetervikluse kontrollimine
100% [..................................................] 14 / 14
E-valimiskastis sisalduvad andmed on terviklikud
E-valimiskastis on 14 kvalifitseerimiseks sobivat häält
E-valimiskastis sisalduvate häälte digiallkirja vormingule vastavuse kontrollimine
100% [..................................................] 14 / 14
Viga valija *******2724 hääle **************119+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
100% [..................................................] 14 / 14
Viga valija *******2724 hääle **************906+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
100% [..................................................] 14 / 14
Viga valija *******2724 hääle **************845+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
100% [..................................................] 14 / 14
Viga valija *******2724 hääle **************944+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
Viga valija *******2724 hääle **************762+0300 töötlemisel: Registreerimispäringu vastus pole unikaalne
100% [..................................................] 14 / 14
E-valimiskastis sisalduvate häälte koguarv: 14
E-valimiskastis sisalduvate korrektse allkirjaga häälte arv: 9
E-valimiskastis sisalduvate vigase allkirjaga häälte arv: 5
Kuna hiljem kuvas auditirakendus audiitorile teadet viiest korduvast krüptogrammist, siis audiitor paistab olevat viis identset häälekonteinerit ja viis korduvat krüptogrammi ekslikult samastanud:
E-valimiskasti laadimine failist 'conf/../votes.zip'
E-valimiskast laaditud
Anonüümitud e-valimiskasti laadimine failist 'conf/../out-4/KOV_2025-bb-4.json'
Anonüümitud e-hääled laaditud
E-valimiskasti verifitseerimise logifail: conf/../out-2/KOV_2025.question-KOV_2025.check.log1
Korduvhäälte tühistamise logifail: conf/../out-2/KOV_2025.question-KOV_2025.squash.log2
Topelthäälte tühistamise logifail: conf/../out-4/KOV_2025.question-KOV_2025.revoke.log2
E-häälte anonüümimise logifail: conf/../out-4/KOV_2025.question-KOV_2025.anonymize.log3
E-valimiskasti töötlemisvigade raport: conf/../out-2/ballotbox_errors.txt
Vastuvõetud häälte seas on korduvaid krüptogramme
There are 5 ciphertext recurrences among the accepted ballots
Recurring ballot: G6kFbO2dR2GFRfQ1PgVBDXp652p8M0+NRC4o1Dnk3gk=
Recurring ballot: 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ=
Ballot '*******2724/**************845+0300' present in both the acceptance and rejection logs
Ballot '*******2724/**************000+0300' not found in the acceptance/rejection logs
E-valimiskasti verifitseerimise logid on terviklikud: ei
Auditirakendus lõpetas töö ilma vigadeta
Korduslugemine annab tulemuseks, et korduvaid krüptogramme oli valimiskastis vähemalt 11, aga audiitori ja valimiste korraldaja avalike toimingute käigus antud ütluste kohaselt kokku 13, mille hulgas olid:
- Kuus identset häälekonteinerit, mis sisaldavad ka identseid krüptogramme, millest häiret anti viie viimase puhul;
- Seitse unikaalset häälekonteinerit, millest viis2 sisaldasid kõik ühte korduvat krüptogrammi ja kaks sisaldasid teist korduvat krüptogrammi, millest kummagi puhul anti häiret viimaste puhul, st 5−1 = 4 ja 2−1 = 1 ehk kokku samuti viie korduva krüptogrammi puhul.
Audiitor küll märgib korrektselt, et "töötlemisrakendus tuvastas viis häält, millel oli määrang Registreerimisteenuse päring pole unikaalne", kuid samastab ekslikult identsete häälekonteinerite kohta antud teated hiljem korduvate krüptogrammide kohta antud teavitusega 5 ciphertext recurrences. Siiski puudub viiel identsel häälekonteineril ja viiel korduval krüptogrammil omavaheline seos töötlemis- või auditirakenduse kontekstis ja tegu on täiesti isoleeritud juhtumitega.
Seejuures käivad määrangud "on olemas nii vastuvõetud kui tagasilükatud häälte logis" ja "pole ei vastuvõetud ega tagasilükatud häälte logides" viie töötlusfaasis tuvastatud identse häälekonteineri kohta ja "vastuvõetud häälte hulgas on viis korduvat šifriteksti" auditirakenduse jooksutamise käigus ilmnenud viie korduva krüptogrammi kohta.
Valimiskastis olnud häälekonteineritest ja nende sisust annab ülevaate järgnev tabel, kus krüptogrammid räsi algusega CM on identsetes häälekonteinerites ja ülejäänud korduvad krüptogrammid räside algustega 9W ja G6 on unikaalsetes häälekonteinerites:
| Isikukood | Kuupäev | Kellaaeg | Krüptogrammi räsi |
|---|---|---|---|
| *******2724 | 15.10 | 08:54:35.000 | CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU= |
| *******2724 | 17.10 | 21:05:45.119 | CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU= |
| *******2724 | 17.10 | 22:26:35.906 | CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU= |
| *******2724 | 17.10 | 22:45:16.845 | CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU= |
| *******2724 | 18.10 | 11:35:36.000 | igXUmpzFOYrGwfWy3Npc14zHC11lbiHDH6tNxm+AbV0= |
| *******2724 | 18.10 | 11:59:52.944 | CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU= |
| *******2724 | 18.10 | 12:17:30.762 | CMH7O/SDfPoVvixpW3UJJawHjPKqZMgAF//Gfy5RyUU= |
| *******2724 | 18.102 | −−:−−:−−.−−− | 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ= |
| *******2724 | 18.102 | −−:−−:−−.−−− | 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ= |
| *******2724 | 18.10 | 14:17:36.000 | 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ= |
| *******2724 | 18.10 | 15:11:44.000 | 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ= |
| *******2724 | 18.10 | 15:35:40.000 | 9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ= |
| *******2724 | 18.10 | 15:46:18.000 | BurTcesZloqTOYhekG63m5AwlngAetl8XP6k4FHo0uM= |
| *******2724 | 18.10 | 16:29:15.000 | cDALrTckJNolLEQTm15mmZHPfoFuHNalfgIO4wvBJMs= |
| *******2724 | 18.10 | 17:03:46.000 | G6kFbO2dR2GFRfQ1PgVBDXp652p8M0+NRC4o1Dnk3gk= |
| *******4710 | 18.10 | 17:12:05.000 | G6kFbO2dR2GFRfQ1PgVBDXp652p8M0+NRC4o1Dnk3gk= |
Seetõttu on vale audiitori väide, et "töötlemisrakendus tuvastas viis häält, millel oli määrang Registreerimisteenuse päring pole unikaalne" ja "vea andis audiitorrakendus, kuna selle algoritm ei sisalda kasutusjuhtu, kui isetehtud valijarakendusega saadetakse kogujasse üks ja sama krüptogramm korduvalt".
Auditirakendus eksplitsiitselt arvestas korduvate krüptogrammidega, mille kohta leiab märkuse lähtekoodi kommentaaridest:
// We must use a bag instead of a set since it might happen (statistically unlikely unless intentional)
// that there are ballots with the same ciphertext. Therefore, a set would not correctly represent the
// state of the accepted ballots.
Ka auditirakenduse tegelikul jooksutamisel arvestas algoritm korrektselt just nimelt korduvate krüptogrammidega (räsi algusega 9W ja G6) ja viie korduva krüptogrammi olemasolu valimiskastis ega selle kohta antud teade auditirakenduse käitamisel probleeme ei tekitanud.
Küll aga tekitas probleeme identsete häälekonteinerite (räsi algusega CM) töötlemisel auditirakenduses esinev programmeerimisviga, mille raames ühildati valesti funktsiooni getValidInvalidSums parameetritena edasi antud set ja list andmetüüpe.
Selle tõttu eemaldati IngegrityTooli ridadel 268-278 esimese identse häälekonteinerini jõudes ühekorraga kõik identsed häälekonteinerid, mille tõttu esimesel läbimisel kuvati teadet present in both the acceptance and rejection logs ja teisel läbimisel not found in the acceptance/rejection logs, sest otsitavat räsi enam massiivist ei leitud.
Selle tarkvaravea tagajärjel kuvas auditirakendus poleemikat tekitanud teadet E-valimiskasti verifitseerimise logid on terviklikud: ei, mille kohta audiitori esindaja avalike toimingute käigus ütles, et see on "tegelikult päris paha lause".
Audiitori poolt väidetud korduvate krüptogrammidega mitte arvestamine algoritmi tasemel oli hoopis identsete häälekonteinerite töötlemise programmeerimisviga, mis oli jäänud koodi sisse vaatamata sellele, et programmeerija oli endale kirjutanud lähtekoodi spetsiaalse märkuse sellest veast hoidumise vajaduse kohta.
Ka polnud viga tulnud välja testimise käigus ega 2024. aasta Euroopa Parlamendi valimistel, milleks auditirakendus Kristjan Düüna magistritöö soovitustest lähtuvalt koostati ja kus see ka esimest korda kasutusel oli.
Kuna audiitor avalike toimingute raames luges kokku kümmekond korduvat krüptogrammi, aga aruandes piirdub viie korduva krüptogrammi nimetamisega ega anna adekvaatset hinnangut intsidendi põhjustele, siis võib oletada, et korduvate krüptogrammide juhtumi asjaolude varjamise põhjuseks pole üksnes audiitori tehniliste teadmiste piiratus.
Kui tahad ise sammud läbi teha, siis:
rm -r log out-*
./processor checkAndSquash -c conf/certs.asice -p conf/processor.asice
digidoc-tool create --file=out-2/KOV_2025-bb-2.json.sha256sum out-2/KOV_2025-bb-2.json.sha256sum.asice
./processor revokeAndAnonymize -c conf/certs.asice -p conf/processor.asice
./auditor integrity -c conf/certs.asice -p conf/auditor.asice
./auditor integrity -c conf/certs.asice -p conf/auditor_force.asice
Töötlemisrakenduse ja auditirakenduse töölesaamiseks eelnevalt:
git clone --recurse-submodules https://github.com/infoaed/korduva-kryptogrammi-juhtum.git
cd korduva-kryptogrammi-juhtum
git submodule update --init --recursive
sudo apt update
sudo apt install openjdk-21-jdk
wget https://services.gradle.org/distributions/gradle-8.11-bin.zip
unzip gradle-8.11-bin.zip -d ivxv/common/external
rm gradle-8.11-bin.zip
make -C ivxv processor auditor ONLINE=1
Footnotes
-
Peale siin failis oleva andmeloo inimkeelse kirjelduse on kogu varamu sisu avalikuks kasutuseks CC0 alusel. Andmeloo autor on Märt Põder ja seda võib levitada CC BY tingimustel autorit viidates. ↩
-
Kuna valijad isikukoodi lõpuga
2724ja4710ei salvestanud katsetamise käigus kõiki oma häälekonteinereid, siis on toimunu kirjelduse klapitamisel audiitori 20.10.2025 avalike toimingute raames väljendatuga eeldatud, et krüptogrammi9WhZ6IFiaA8Hhw8/vrHBhvY9+VwGz89olrW02YrRvUQ=sisaldavaid häälekonteinereid oli kahe võrra rohkem, st säilinud kolme konteineri asemel viis. ↩ ↩2 ↩3