#ifndef __PRSONA_BASE_HPP #define __PRSONA_BASE_HPP #include #include "Curvepoint.hpp" #include "Bipoint.hpp" #include "Scalar.hpp" #include "EGCiphertext.hpp" #include "proof.hpp" class PrsonaBase { public: static size_t MAX_ALLOWED_VOTE; // SETUP FUNCTIONS static void init(); static void set_server_malicious(); static void set_client_malicious(); // CONST GETTERS static size_t get_max_allowed_vote(); Twistpoint get_blinding_generator() const; Twistpoint get_blinding_generator(std::vector& pi) const; // BINARY SEARCH size_t binary_search( const std::vector list, const Twistpoint& index) const; protected: // Essentially constants, true for both servers and clients static Twistpoint EL_GAMAL_GENERATOR; static Scalar SCALAR_N; static Scalar DEFAULT_TALLY; static Scalar DEFAULT_VOTE; static bool SERVER_IS_MALICIOUS; static bool CLIENT_IS_MALICIOUS; std::vector elGamalBlindGeneratorProof; Twistpoint elGamalBlindGenerator; // PRIVATE ELEMENT SETTER bool set_EG_blind_generator( const std::vector& pi, const Twistpoint& currGenerator, size_t numServers); // SCHNORR PROOFS Proof schnorr_generation( const Twistpoint& generator, const Twistpoint& commitment, const Scalar& log ) const; bool schnorr_verification( const Twistpoint& generator, const Twistpoint& commitment, const Scalar& c, const Scalar& z ) const; // OWNERSHIP PROOFS Proof generate_ownership_proof( const Twistpoint& generator, const Twistpoint& commitment, const Scalar& log ) const; bool verify_ownership_proof( const Proof& pi, const Twistpoint& generator, const Twistpoint& commitment ) const; // ITERATED SCHNORR PROOFS Proof add_to_generator_proof( const Twistpoint& currGenerator, const Scalar& seed ) const; bool verify_generator_proof( const std::vector& pi, const Twistpoint& currGenerator, size_t numServers ) const; // REPUTATION PROOFS std::vector generate_reputation_proof( const Proof& ownershipProof, const EGCiphertext& commitment, const Scalar& currentScore, const Scalar& threshold, const Scalar& inverseKey, size_t numClients ) const; bool verify_reputation_proof( const std::vector& pi, const Twistpoint& generator, const Twistpoint& owner, const EGCiphertext& commitment, const Scalar& threshold ) const; // VALID VOTE PROOFS std::vector generate_vote_proof( const Proof& ownershipProof, const TwistBipoint& g, const TwistBipoint& h, const std::vector& replaces, const std::vector& oldEncryptedVotes, const std::vector& newEncryptedVotes, const std::vector& seeds, const std::vector& votes ) const; bool verify_vote_proof( const TwistBipoint& g, const TwistBipoint& h, const std::vector& pi, const std::vector& oldEncryptedVotes, const std::vector& newEncryptedVotes, const Twistpoint& freshGenerator, const Twistpoint& owner ) const; // NEW USER PROOFS std::vector generate_proof_of_added_user( const Scalar& twistBipointSeed, const Scalar& EGCiphertextSeed, const std::vector& curveBipointSelfSeeds, const std::vector& curveBipointOtherSeeds ) const; bool verify_proof_of_added_user( const std::vector& pi, const Twistpoint& currentFreshGenerator, const Twistpoint& shortTermPublicKey, const TwistBipoint& curveG, const TwistBipoint& curveH, const CurveBipoint& twistG, const CurveBipoint& twistH, size_t selfIndex, const EGCiphertext& userEncryptedScore, const CurveBipoint& serverEncryptedScore, const std::vector> encryptedVoteMatrix ) const; // EPOCH PROOFS std::vector generate_valid_permutation_proof( const std::vector>& permutations, const std::vector>& seeds, const std::vector>& commits ) const; bool verify_valid_permutation_proof( const std::vector& pi, const std::vector>& commits ) const; std::vector generate_proof_of_reordering_plus_power( const std::vector>& permutations, const Scalar& power, const std::vector>& permutationSeeds, const std::vector>& productSeeds, const std::vector& oldValues, const std::vector>& permutationCommits, const std::vector>& productCommits, const std::vector>& seedCommits ) const; bool verify_proof_of_reordering_plus_power( const std::vector& pi, const std::vector& oldValues, const std::vector>& permutationCommits, const std::vector>& productCommits, const std::vector>& seedCommits ) const; std::vector generate_user_tally_proofs( const std::vector>& permutations, const Scalar& power, const Twistpoint& nextGenerator, const std::vector>& permutationSeeds, const std::vector>& userTallySeeds, const std::vector& currPseudonyms, const std::vector& userTallyMasks, const std::vector& userTallyMessages, const std::vector>& permutationCommits, const std::vector>& userTallyMaskCommits, const std::vector>& userTallyMessageCommits, const std::vector>& userTallySeedCommits ) const; bool verify_user_tally_proofs( const std::vector& pi, const Twistpoint& nextGenerator, const std::vector& currPseudonyms, const std::vector& userTallyMasks, const std::vector& userTallyMessages, const std::vector>& permutationCommits, const std::vector>& userTallyMaskCommits, const std::vector>& userTallyMessageCommits, const std::vector>& userTallySeedCommits ) const; template std::vector generate_proof_of_reordering( const std::vector>& permutations, const std::vector>& permutationSeeds, const std::vector>& productSeeds, const std::vector& oldValues, const std::vector>& permutationCommits, const std::vector>& productCommits, const T& otherG, const T& otherH ) const; template bool verify_proof_of_reordering( const std::vector& pi, const std::vector& oldValues, const std::vector>& permutationCommits, const std::vector>& productCommits, const T& otherG, const T& otherH ) const; // SERVER AGREEMENT PROOFS Proof generate_valid_vote_row_proof( const std::vector& commitment) const; Proof generate_valid_vote_matrix_proof( const std::vector>& commitment) const; Proof generate_valid_user_tally_proof( const EGCiphertext& commitment) const; Proof generate_valid_server_tally_proof( const CurveBipoint& commitment) const; Proof generate_valid_pseudonyms_proof( const std::vector& commitment) const; bool verify_valid_vote_row_proof( const std::vector& pi, const std::vector& commitment ) const; bool verify_valid_vote_matrix_proof( const std::vector& pi, const std::vector>& commitment ) const; bool verify_valid_user_tally_proof( const std::vector& pi, const EGCiphertext& commitment ) const; bool verify_valid_server_tally_proof( const std::vector& pi, const CurveBipoint& commitment ) const; bool verify_valid_pseudonyms_proof( const std::vector& pi, const std::vector& commitment ) const; }; #endif