CryptoBallot is a cryptographically secure online voting system, providing secure anonymous voting with end-to-end verifiability.
It is currenly under active development and is not production ready.
CryptoBallot is fundamentally a transaction processor and validator. When transactions are validated in order, it creates an end-to-end verifiable voting system.
- Transaction 1: Election Transaction - Defines an election, created by an election authority.
- Transaction 2: Vote Transaction - Posted by a voter to cast a vote in an election.
- Transaction 3: Secret Share Transaction - Posted by a trustee to allow votes to be decrypted and viewed.
- Transaction 4: Decryption Transaction - Decrypt a vote, allowing it to be tallied.
- Election Authority - Creates an Election Transaction and distributes the encryption secret to trustees via Shamir Secret Sharing.
- Trustee - Holds a vote-decryption secret share, posts Secret Share Transactions.
- Authenticator - Certifies that a voter can vote an election and ballot using blind-signing.
- Ballot - A set of contests for an election, usually restricted to a geographic area.
The Auth Package triplet of election-id, ballot-id, and voter public key
RSA Public Key for blind signing
An Authentication is returned by an authenticator, clearing the voter to vote.
An Authenticator is responsible for authenticating a voter as allowed to vote a specific ballot in an election.
Transaction 4: Decryption
Transaction 1: Election
Transaction 3: SecretShare
A generic signed transaction
A trustee is responsible for safeguarding a secret share (a portion of the secret vote decryption key), distributed by the election authority via Shamir Secret Sharing.
Transaction 2: Vote
A signed transaction
An unsigned transaction TODO: Implment From going for specific tx to this emum and vice versa
A transaction type
Transaction Validation errors
A transaction store
Deal the election secret into shares, ready to be distributed to trustees.
Decrypt the vote from the given recovered decryption key.
Encrypt a vote with the public key provided by the election transaction (ElectionTransaction.encryption_key)
Generate an ed25519 keypair
Given a set of secret shares recovered from all SecretShareTransaction, reconstruct the secret decryption key. The decryption key can then be used to decrypt votes and create a DecryptionTransaction.