#ifndef __PRSONA_SERVER_HPP #define __PRSONA_SERVER_HPP #include #include "BGN.hpp" #include "Curvepoint.hpp" #include "Bipoint.hpp" #include "base.hpp" #include "EGCiphertext.hpp" #include "proof.hpp" class PrsonaServer : public PrsonaBase { public: // CONSTRUCTORS PrsonaServer(size_t numServers); PrsonaServer(size_t numServers, const BGN& other_bgn); // BASIC PUBLIC SYSTEM INFO GETTERS BGNPublicKey get_bgn_public_key() const; size_t get_num_clients() const; size_t get_num_servers() const; // FRESH GENERATOR CALCULATION Twistpoint add_curr_seed_to_generator( std::vector& pi, const Twistpoint& currGenerator) const; Twistpoint add_next_seed_to_generator( std::vector& pi, const Twistpoint& currGenerator) const; // ENCRYPTED DATA GETTERS std::vector get_current_votes_by( Proof& pi, const Twistpoint& shortTermPublicKey) const; std::vector> get_all_current_votes( Proof& pi) const; EGCiphertext get_current_user_encrypted_tally( Proof& pi, const Twistpoint& shortTermPublicKey) const; CurveBipoint get_current_server_encrypted_tally( Proof& pi, const Twistpoint& shortTermPublicKey) const; std::vector get_current_pseudonyms(Proof& pi) const; // PROOF COMMITMENT GETTERS Proof get_vote_row_commitment(const Twistpoint& request) const; Proof get_vote_matrix_commitment() const; Proof get_user_tally_commitment(const Twistpoint& request) const; Proof get_server_tally_commitment(const Twistpoint& request) const; Proof get_pseudonyms_commitment() const; // CLIENT INTERACTIONS void add_new_client( std::vector& proofOfValidAddition, const Proof& proofOfValidKey, const Twistpoint& shortTermPublicKey); bool receive_vote( const std::vector& pi, const std::vector& newVotes, const Twistpoint& shortTermPublicKey); void print_scores(const std::vector& scores); private: // constants for servers const size_t numServers; // Identical between all servers (but collaboratively constructed) BGN bgnSystem; // Private; different for each server Scalar currentSeed; Scalar nextSeed; // The actual data, which is collaboratively updated by all servers Twistpoint currentFreshGenerator; std::vector previousVoteTallies; std::vector currentPseudonyms; std::vector currentUserEncryptedTallies; std::vector> voteMatrix; /** * NOTE: voteMatrix structure: * Each element represents a vote by applied to . * The outer vector is a vector of rows and the inner vector is * a vector of encrypted votes. */ // An imaginary class; it's just used right now to coordinate servers // in memory instead of via network action. friend class PrsonaServerEntity; // CONSTRUCTOR HELPERS const BGN& get_bgn_details() const; bool initialize_fresh_generator( const std::vector& pi, const Twistpoint& firstGenerator); Twistpoint add_rand_seed_to_generator( std::vector& pi, const Twistpoint& currGenerator) const; bool set_EG_blind_generator( const std::vector& pi, const Twistpoint& currGenerator); // SCORE TALLYING std::vector tally_scores(); Scalar get_max_possible_score(); // EPOCH ROUNDS void build_up_midway_pseudonyms( std::vector>>& pi, std::vector>>& permutationCommits, std::vector>>& freshPseudonymCommits, std::vector>>& freshPseudonymSeedCommits, std::vector>>& serverTallyCommits, std::vector>>>& partwayVoteMatrixCommits, std::vector>>>& finalVoteMatrixCommits, Twistpoint& nextGenerator); void break_down_midway_pseudonyms( std::vector& generatorProof, std::vector>>& pi, std::vector>>& permutationCommits, std::vector>>& freshPseudonymCommits, std::vector>>& freshPseudonymSeedCommits, std::vector>>& serverTallyCommits, std::vector>>>& partwayVoteMatrixCommits, std::vector>>>& finalVoteMatrixCommits, std::vector>>& userTallyMaskCommits, std::vector>>& userTallyMessageCommits, std::vector>>& userTallySeedCommits, const Twistpoint& nextGenerator); // EPOCH HELPERS std::vector> epoch_calculations( std::vector>& permutationCommits, std::vector>& freshPseudonymCommits, std::vector>& freshPseudonymSeedCommits, std::vector>& serverTallyCommits, std::vector>>& partwayVoteMatrixCommits, std::vector>>& finalVoteMatrixCommits, std::vector>& userTallyMaskCommits, std::vector>& userTallyMessageCommits, std::vector>& userTallySeedCommits, const Scalar& power, const Twistpoint& nextGenerator, bool doUserTallies); bool accept_epoch_updates( const std::vector>& pi, const std::vector>& permutationCommits, const std::vector>& freshPseudonymCommits, const std::vector>& freshPseudonymSeedCommits, const std::vector>& serverTallyCommits, const std::vector>>& partwayVoteMatrixCommits, const std::vector>>& finalVoteMatrixCommits, const std::vector>& userTallyMaskCommits, const std::vector>& userTallyMessageCommits, const std::vector>& userTallySeedCommits, const Twistpoint& nextGenerator, bool doUserTallies); std::vector> generate_permutation_matrix( const Scalar& reorderSeed ) const; std::vector> generate_commitment_matrix( const std::vector>& permutations, std::vector>& seeds ) const; std::vector> generate_pseudonym_matrix( const std::vector>& permutations, const Scalar& power, std::vector>& seeds, std::vector>& seedCommits ) const; std::vector> generate_server_tally_matrix( const std::vector>& permutations, std::vector>& seeds ) const; std::vector>> generate_vote_tensor( const std::vector>& permutations, const std::vector>& currVoteMatrix, std::vector>>& seeds, bool inverted ) const; std::vector> calculate_next_vote_matrix( const std::vector>>& voteTensor ) const; void generate_vote_tensor_proofs( std::vector>& pi, const std::vector>& permutations, const std::vector>& permutationSeeds, const std::vector>>& matrixSeeds, const std::vector>& currMatrix, const std::vector>& permutationCommits, const std::vector>>& matrixCommits, bool inverted ) const; bool verify_vote_tensor_proofs( const std::vector>& pi, size_t start_offset, const std::vector>& currMatrix, const std::vector>& permutationCommits, const std::vector>>& matrixCommits, bool inverted ) const; void generate_user_tally_matrix( const std::vector>& permutations, const Scalar& power, const Twistpoint& nextGenerator, const std::vector& currPseudonyms, std::vector& masks, std::vector>& maskCommits, std::vector& messages, std::vector>& messageCommits, std::vector>& userTallySeeds, std::vector>& userTallySeedCommits ) const; template std::vector> generate_reordered_plus_power_matrix( const std::vector>& permutations, const Scalar& power, const std::vector& oldValues, std::vector>& seeds, std::vector>& seedCommits, const T& h ) const; template std::vector> generate_reordered_matrix( const std::vector>& permutations, const std::vector& oldValues, std::vector>& seeds, const T& h, bool cancelOut ) const; template std::vector> transpose_matrix( const std::vector>& input ) const; std::vector sort_data( const std::vector& inputs ) const; // A helper class for "ordering" data and for binary search struct SortingType { Twistpoint pseudonym; size_t index; bool operator<( const SortingType& rhs ) const { return pseudonym < rhs.pseudonym; } }; template T encrypt( const T& g, const T& h, const Scalar& plaintext, const Scalar& lambda ) const; bool update_data( const std::vector>& freshPseudonymCommits, const std::vector>& serverTallyCommits, const std::vector>>& voteMatrixCommits, const std::vector>& userTallyMaskCommits, const std::vector>& userTallyMessageCommits); bool pseudonyms_sorted( const std::vector newPseudonyms ) const; // DATA MAINTENANCE bool import_new_user_update( const std::vector& pi, const std::vector& otherPreviousVoteTallies, const std::vector& otherCurrentPseudonyms, const std::vector& otherCurrentUserEncryptedTallies, const std::vector>& otherVoteMatrix); // DATA SAFEKEEPING std::vector order_data(); // BINARY SEARCH size_t binary_search(const Twistpoint& index) const; // VALID VOTE PROOFS bool verify_vote_proof( const std::vector& pi, const std::vector& oldVotes, const std::vector& newVotes, const Twistpoint& shortTermPublicKey ) const; }; #endif