This API is designed to allow clients to correctly implement an E2E Verifiable election. In designing this API, we tried to balance the following constraints and goals:
There are 3 phases of an election:
Within the API, these phases are represented by interactions between various entities:
KeyCeremony_Trustee
objects representing the election trustees, and a single
KeyCeremony_Coordinator
object that provides a central
“location” to which KeyCeremony_Trustee
s submit pieces of
information, and which then broadcasts that information to all the
KeyCeremony_Trustee
s.Voting_Encrypter
s
(probably located within ballot marking devices) connected to a
single Voting_Coordinator
. Each group represents a single
polling location. The Voting_Encrypter
is responsible for
encrypting ballots to produce ballot_tracker
s and
ballot_identifier
s. The Voting_Coordinator
is responsible for keeping track of which ballots have been
registered, cast, and spoiled.Decryption_Trustee
objects representing the election
trustees, and a single Decryption_Coordinator
object in a
structure very similar to that of the Key Ceremony.We chose to separate the trustees and coordinators into
KeyCeremony_Trustee
s/Decryption_Trustee
s and
KeyCeremony_Coordinator
s/Decryption_Coordinator
s respectively. This is because conceptually a trustee has two
distinct tasks, key generation and decryption, that are linked by a
small kernel of persisted information such as the trustee’s private
key and key shares. Decryption will probably happen at least a day
after the key ceremony, so it is important that the information
necessary for decryption can be stored for a long period of time.
Making the distinction between KeyCeremony_Trustee
s and
Decryption_Trustee
s and making the persisted
trustee_state
explicit and serializable makes the APIs of each
component simpler and makes it easier to persist the
trustee_state
over the course of the election.