Historical archive

How to observe the digital ballot box for the general elections

Historical archive

Published under: Stoltenberg's 2nd Government

Publisher: Ministry of Local Government and Regional Development

At fixed intervals the I-voting system generates an absolute list of the SHA-256-hashes of all the stored, encrypted votes. The list is published every hour on Github. The list will be available and continously updated until the final result of the election has been certified.

At fixed intervals the I-voting system generates an absolute list of the SHA-256-hashes of all the stored, encrypted votes. The list is published every hour on Github. The list will be available and continously updated until the final result of the election has been certified. By copying the hash from the user interface and then searching for it in the list published here, you can verify that your electronic ballot is in fact stored in the digital ballot box.

On election night an independent third party will compare the list published here with the content of the digital ballot box to be counted. As long as there is no discrepancy between the two we can know that all valid votes will be counted.

Click here to download a zip-file containing the needed certificates (including Ps_appVCS_130001.crt and  Ps_appRCG_130001.crt).

The archive on GitHub

The following files are present in the archive for the general election (130001 is an identifier for this year’s general election):

  • bulletin_130001.txt: the list of hashes of all received, encrypted ballots so far.
  • bulletin_130001.sig: the digital signature over the list above. Can be used to verify the integrity and veracity of the list.
  • README.md: referring to this web page.

bulletin_130001.txt is a comma separated file (CSV) where the first line is the timestamp for the current version of the file. The rest of the file is made up of one line of text for each received, encrypted ballot:

  • the SHA-256 hash of the encrypted ballot
  • one of the signatures over the hash of the encrypted ballot (more on this later)

The list will be updated every hour. If you’ve copied your hash and signatures after voting, you may search (ctrl+f) for your hash by pasting (ctrl+v) your hash into the search field. If you are able to locate your hash in the list, you have verified that your ballot has been received and stored. If you are not able to locate your hash, it may be that you’ve made your search before the list has been updated with your ballot. If you believe that the list has been updated after your ballot was cast, but you still cannot locate your hash, call the support line at 800 38 254. If you vote multiple times, all your hashes will remain in the list. You may check the list as often as you like.

Digital signatures

In the internet voting client you will be presented with two signatures over each submitted ballot. Only one of the signatures is published in ”bulletin_130001.txt”. This signature proves that the vote was checked and stored in one of the election’s two independent ballot boxes – the Return Code Generator (RCG). The signature over the complete list, ”bulletin_130001.sig” originates from the other of the two independent ballot boxes, the Vote Collector Server (VCS), and verifies the integrity and veracity of the complete list.

Verifying the veracity of the complete list

The component of the internet voting system which stores the ballots, the so called Vote Collector Server, generates and signs the list named ”bulletin_130001.txt”. The list can thus be used to verify the integrity and completeness of the digital ballot box. The signature is performed using a 2048-bit RSA key and is made over a SHA-256-hash of the absolute list of ballot-hashes (hexadecimal, utf-8 no linefeed).

To verify the origin and integrity of the list, you need the following:

  • Ps_appVCS_130001.crt, the digital certificate of the VCS
  • bulletin_130001.txt
  • bulletin_130001.sig
  • the OpenSSL software package (free download  from openssl.org)

Execute the following commands (where $ represents your command-prompt):

  1. Extract the public key for the VCS: $ openssl x509 -pubkey -noout -in Ps_appVCS_130001.crt > pubkeyVCS.pem
  2. Generate a SHA-256 hash of the list using sha256sum, output the result to a new text-file with no spaces or linefeeds: $ sha256sum bulletin_election_id.txt | grep -o '^[^ ]*' | tr -d '\n' > sha.txt
  3. Verify the signature using the extracted public key: $ openssl dgst -sha256 -verify pubkeyVCS.pem -signature bulletin_election_id.sig sha.txt

Verifying your hash

To verify that a hash has really been seen by the Return Code Generator, you need the Ps_appRCG_130001.crt, which is the certificate of the RCG.

Execute the following commands (where $ represents your command-prompt):

  1. Extract the RCG public key: $ openssl x509 -pubkey -noout -in Ps_appRCG_130001.crt > pubkeyRCG.pem
  2. Copy (ctrl+c) the relevant line from “bulletin_130001.txt” and paste it into 
  3. Extract the hash of the encrypted ballot from the line extracted in the previous step: $ cat foo.txt | awk -F',' '{print $1}' | grep -o '^[^ ]*' | tr -d '\n'  > receipt.txt
  4. Exctract the signature from the text extracted in step 2, convert it from Base64 to binary: $ echo $entry | awk -F',' '{print $2}' | base64 -d > receipt.sig
  5. Verify: $ openssl dgst -sha256 -verify pubkeyRCG.pem -signature receipt.sig receipt.txt

Call the support line at 800 38 254 if you have any additional questions regarding the observation of the digital ballot box.