MyNixOS website logo
Description

A cryptographic protocol for the Majority Judgment.

This work-in-progress library aims at implementing an online voting protocol named Helios-C (Helios with Credentials) by its authors from the CNRS, the INRIA and the Université de Lorraine: Véronique Cortier, David Galindo, Pierrick Gaudry, Stéphane Glondu and Malika Izabachène.

The main properties of this protocol are:

  • fully correct: the published result are proven to correspond to the (sum of) intended votes of the voters, while accounting for a malicious bulletin board (BB) (adding fake ballots) by requiring a registration authority (RA) (responsible for generating and sending voters' credentials). Assuming that the BB and the RA are not simultaneously dishonest.

  • verifiable: each voter is able to check that: his/her ballot did contribute to the outcome (individual verifiability), and that the tallying authorities did their job properly (universal verifiability).

  • private: the identities of the voters who cast a vote are not publicly revealed.

Voting protocol

Ballot

Ballots are encrypted using public-key cryptography secured by the Discrete Logarithm problem: finding x in (g^x mod p), where p is a large prime and g a generator of Gq, the multiplicative subgroup of order q, in Fp (the finite prime field whose characteristic is p).

Here, p is 2048-bit and q is 256-bit.

The signing (Schnorr-like), the encrypting (ElGamal-like) and the Decisional Diffe Hellman (DDH) assumption, all rely on the hardness of that problem.

Ballot signing

The Schnorr protocol is used to prove that a voter has knowledge of the secret key used to sign their votes.

Voter's credential

A voter's credential is a secret key (the signing key) from which a public part can be derived (the verification key).

The association between the public part and the corresponding voter's identity does not need to be known, and actually should not be disclosed to satisfy e.g. the French requirements regarding voting systems. Using credentials prevent the submission of duplicated ballots (because they are added as an additional input to the random oracle in the non-interactive zero-knowledge (NIZK) proofs for ciphertext well-formedness). This allows a testing of duplicates which depends only on the size of the number of voters, and thus enables Helios-C to scale for larger elections while attaining correctness.

Tallying

Ballots are added without being decrypted because adding (multiplying actually) ciphertexts then decrypting, is like decrypting then adding plaintexts (additive homomorphism). Which requires to solve the Discrete Logarithm Problem for numbers in the order of the number of voters, which is not hard for small numbers (with a lookup table as here, or with Pollard’s rho algorithm for logarithms).

Verifying

The Chaum-Pedersen protocol (proving an equality of discrete logarithms) is used to prove that ciphertexts are well-formed (encrypting a 0 or a 1… or any expected natural) without decrypting them. Which is known as a Disjunctive Chaum-Pedersen proof of partial knowledge.
See: Some ZK security proofs for Belenios.

A strong Fiat-Shamir transformation is used to transform the interactive zero-knowledge (IZK) Chaum-Pedersen protocol into a non-interactive zero-knowledge (NIZK) proof, using a SHA256 hash.
See: How not to Prove Yourself: Pitfalls of the Fiat-Shamir Heuristic and Applications to Helios.

Public Key Infrastructure

(TODO) A Pedersen's distributed key generation (DKG) protocol coupled with ElGamal keys (under the DDH assumption), is used to have a fully distributed semantically secure encryption.

Metadata

Version

0.0.10.20191104

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows