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_Trustees submit pieces of
information, and which then broadcasts that information to all the
KeyCeremony_Trustees.Voting_Encrypters
(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_trackers and
ballot_identifiers. 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_Trustees/Decryption_Trustees and
KeyCeremony_Coordinators/Decryption_Coordinators 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_Trustees and
Decryption_Trustees 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.