meerkat-java/meerkat-common/src/main/proto/meerkat/voting.proto

160 lines
3.9 KiB
Protocol Buffer

syntax = "proto3";
package meerkat;
import 'meerkat/crypto.proto';
option java_package = "meerkat.protobuf";
// Type of the element data to be presented by UI
enum UIElementDataType {
TEXT = 0;
IMAGE = 1;
VOICE = 2;
}
// Type of question
enum QuestionType {
MULTIPLE_CHOICE = 0;
MULTIPLE_SELECTION = 1;
ORDER = 2;
}
// An element to be presented by UI
message UIElement {
UIElementDataType type = 1;
bytes data = 2;
}
// A question in the ballot
// is_mandatory determines whether the question may be skipped with no answer
// description might hold information/guidlines for the voter
message BallotQuestion {
bool is_mandatory = 1;
UIElement question = 2;
UIElement description = 3;
repeated UIElement answer = 4;
}
message QuestionCluster {
UIElement cluster_description = 1;
repeated int32 question_index = 2;
}
message Channel {
UIElement channel_description = 1;
repeated int32 cluster_index = 2;
}
// An answer to a specific ballot question.
// The answer is a vector of signed integers,
// to encompass voting schemes such as ranked voting
// and STV.
message BallotAnswer {
repeated sint64 answer = 1 [packed=true];
}
message PlaintextBallot {
uint64 serial_number = 1; // Ballot serial number
bytes channel_identifier = 2;
repeated BallotAnswer answers = 3;
}
message EncryptedBallot {
uint64 serial_number = 1; // Ballot serial number
RerandomizableEncryptedMessage data = 2;
}
message SignedEncryptedBallot {
EncryptedBallot encrypted_ballot = 1;
Signature signature = 2;
}
message BallotSecrets {
PlaintextBallot plaintext_ballot = 1;
EncryptionRandomness encryption_randomness = 2;
RandomnessGenerationProof proof = 3;
}
message SignedBallotSecrets {
BallotSecrets ballot_secrets = 1;
Signature signature = 2;
}
message BoothParams {
repeated SignatureVerificationKey pscVerificationKeys = 1;
}
message BoothSystemMessages {
map<string, UIElement> system_message = 1;
}
// A table to translate to and from compactly encoded answers
// and their human-understandable counterparts.
// This should be parsable by the UI
message BallotAnswerTranslationTable {
bytes data = 1;
}
// Data required in order to access the Bulletin Board Servers
message BulletinBoardClientParams {
// Addresses of all Bulletin Board Servers
repeated string bulletinBoardAddress = 1;
// Threshold fraction of successful servers posts before a post task is considered complete
float minRedundancy = 2;
}
message ElectionParams {
// TODO: different sets of keys for different roles?
repeated SignatureVerificationKey trusteeVerificationKeys = 1;
// How many trustees must participate in a signature for it to be considered valid.
uint32 trusteeSignatureThreshold = 2;
// The key used to encrypt ballots. The corresponding private key
// is shared between the trustees.
EncryptionPublicKey ballotEncryptionKey = 3;
// Verification keys for valid mixers.
repeated SignatureVerificationKey mixerVerificationKeys = 4;
// How many mixers must participate for the network to be considered valid
uint32 mixerThreshold = 5;
// questions to first indicate the voter's channel
repeated BallotQuestion channel_choice_questions = 6;
// translating the channel-choice answers to the voter's channel
SimpleCategoriesSelectionData selection_data = 7;
// Candidate list (or other question format)
repeated BallotQuestion race_questions = 8;
// Data required in order to access the Bulletin Board Servers
BulletinBoardClientParams bulletinBoardClientParams = 9;
}
message Category {
repeated uint32 questionIndex = 1;
}
message CategoryChooser {
repeated Category category = 1;
}
message SimpleCategoriesSelectionData {
Category shared_defaults = 1;
repeated CategoryChooser categoryChooser = 2;
}