#ifndef __PRSONA_NETWORK_SERVER_HPP #define __PRSONA_NETWORK_SERVER_HPP #include #include #include #include #include "server.hpp" #include "networking.hpp" /* "PUBLIC" FUNCTIONS */ // CREATOR FOR A NEW SERVER PrsonaServer *create_server( std::default_random_engine& rng, std::string dealerIP, int dealerPort, bool bgnDealer, size_t numServers); // CHECK IN FUNCTION USED FOR SYNCHRONIZATION IN SETUP void check_in_with_dealer( std::string dealerIP, int dealerPort); // INITIATER FOR SHARED GLOBAL VALUES void initiate_generators( std::default_random_engine& rng, PrsonaServer* prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort); // FUNCTION TO PERFORM OPERATIONS FOR EXPERIMENT void make_epoch( std::default_random_engine& rng, PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, std::mutex& updateMtx, std::atomic& epochNum, const CivetServer& civetServer, std::mutex& buildUpOutputMtx, const std::string& buildUpOutputFilename, std::mutex& breakDownOutputMtx, const std::string& breakDownOutputFilename, std::mutex& fullOutputMtx, const std::string& fullOutputFilename, std::mutex& usageMtx, const std::string& usageFilename); /* "PRIVATE" FUNCTIONS */ // SHARED GLOBAL UPDATE LOCK GETTERS AND RELEASERS void obtain_update_locks( std::unique_lock &updateLock, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, std::vector& bandwidthData); void release_update_locks( std::unique_lock &updateLock, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, std::vector& bandwidthData); // GETTER FOR DEALER VALUE BGN get_bgn_private_key( std::default_random_engine& rng, std::string dealerIP, int dealerPort); // HELPERS TO INITIATE SHARED GLOBAL VALUES Twistpoint make_generator( std::default_random_engine& rng, PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, bool fresh, std::vector& pi); void distribute_generator( PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, bool fresh, const std::vector& pi, const Twistpoint& generator); // HELPERS FOR EPOCH CALCULATIONS std::vector epoch_build_up( std::default_random_engine& rng, PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, Twistpoint& nextGenerator, const CivetServer& civetServer, std::mutex& outputMtx, const std::string& outputFilename, std::mutex& usageMtx, const std::string& usageFilename, std::vector& bandwidthData); std::vector hbc_epoch_build_up( std::default_random_engine& rng, PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, Twistpoint& nextGenerator, const CivetServer& civetServer, std::mutex& outputMtx, const std::string& outputFilename, std::mutex& usageMtx, const std::string& usageFilename, std::vector& overallBandwidthData); void epoch_break_down( std::default_random_engine& rng, PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, const std::vector& generatorProof, const Twistpoint& nextGenerator, const CivetServer& civetServer, std::mutex& outputMtx, const std::string& outputFilename, std::mutex& usageMtx, const std::string& usageFilename, std::vector& bandwidthData); void hbc_epoch_break_down( std::default_random_engine& rng, PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, const std::vector& generatorProof, const Twistpoint& nextGenerator, const CivetServer& civetServer, std::mutex& outputMtx, const std::string& outputFilename, std::mutex& usageMtx, const std::string& usageFilename, std::vector& bandwidthData); // HELPERS FOR EPOCH HELPERS Twistpoint initiate_epoch_updates( std::default_random_engine& rng, const std::string& recipient, int recipientPort, const std::string& data, bool isBreakdown, std::vector>& generatorProofHolder, std::vector& bandwidthData); struct mg_connection *distribute_epoch_updates( const std::string& recipient, int recipientPort, const std::string& data, struct synchronization_tool* sync); // SCORE TALLYING AND DISTRIBUTION HELPERS void tally_scores( PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, const Twistpoint& nextGenerator, std::vector& userTallyScores, std::vector& serverTallyScores, std::vector& bandwidthData); void distribute_tallied_scores( PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, const Twistpoint& nextGenerator, const std::vector& userTallyScores, const std::vector& serverTallyScores, std::vector& bandwidthData); // FILE I/O HELPERS BGN get_bgn_private_key_from_file( const char *filename); Twistpoint get_generator_from_file( const char *filename, Proof& pi); Twistpoint get_generator_from_file( const char *filename, std::vector& pi); // EPOCH DATA SERIALIZERS/UN-SERIALIZERS std::string make_epoch_initiator_string( const std::vector& generatorProof, const Twistpoint& nextGenerator); ssize_t read_epoch_initiator_string( const char *filename, std::vector& generatorProof, Twistpoint& nextGenerator); std::string make_epoch_update_string( 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::string make_hbc_epoch_update_string( const std::vector& generatorProof, const std::vector& newFreshPseudonyms, const std::vector& newServerTallies, const std::vector>& newVoteMatrix, const std::vector& newUserTallies, const Twistpoint& nextGenerator, bool doUserTallies); ssize_t read_epoch_update_string( const char *filename, 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, Twistpoint& nextGenerator, bool& doUserTallies); ssize_t read_hbc_epoch_update_string( const char *filename, std::vector& generatorProof, std::vector& newFreshPseudonyms, std::vector& newServerTallies, std::vector>& newVoteMatrix, std::vector& newUserTallies, Twistpoint& nextGenerator, bool& doUserTallies); /* OTHER SERVER-RELEVANT HANDLERS */ // Used to tell orchestrator when the system is ready to do an epoch change class EpochReadyHandler : public CivetHandler { public: EpochReadyHandler( struct synchronization_tool *exitSync, struct synchronization_tool *readySync, std::mutex& updateMtx, size_t numServers); bool handleGet( CivetServer *server, struct mg_connection *conn); private: struct synchronization_tool *exitSync, *readySync; std::mutex& updateMtx; const size_t numServers; }; // Used to indicate which epoch the system is currently in class EpochNumHandler : public CivetHandler { public: EpochNumHandler( std::atomic& epochNum); bool handleGet( CivetServer *server, struct mg_connection *conn); private: std::atomic& epochNum; }; // Used to take and release update locks class UpdateLockWebSocketHandler : public CivetWebSocketHandler { public: UpdateLockWebSocketHandler( std::mutex& updateMtx, std::unique_lock **lockHolder, bool isLocking); ~UpdateLockWebSocketHandler(); bool handleConnection( CivetServer *server, const struct mg_connection *conn); void handleReadyState( CivetServer *server, struct mg_connection *conn); bool handleData( CivetServer *server, struct mg_connection *conn, int bits, char *data, size_t data_len); void handleClose( CivetServer *server, const struct mg_connection *conn); private: std::mutex& updateMtx; std::unique_lock **lockHolder; const bool isLocking; }; /* SERVER-SPECIFIC HANDLER */ class PrsonaServerWebSocketHandler : public CivetWebSocketHandler { public: // CONSTRUCTORS PrsonaServerWebSocketHandler( std::default_random_engine& rng, PrsonaServer *prsonaServer, const std::vector& serverIPs, const std::vector& serverPorts, const std::string& selfIP, int selfPort, std::mutex& updateMtx, std::atomic& epochNum, std::mutex& buildUpOutputMtx, const std::string& buildUpOutputFilename, std::mutex& breakDownOutputMtx, const std::string& breakDownOutputFilename, std::mutex& updateOutputMtx, const std::string& updateOutputFilename, std::mutex& voteOutputMtx, const std::string& voteOutputFilename, std::mutex& usageMtx, const std::string& usageFilename); // REQUIRED BY INHERITED CLASS bool handleConnection( CivetServer *server, const struct mg_connection *conn); void handleReadyState( CivetServer *server, struct mg_connection *conn); bool handleData( CivetServer *server, struct mg_connection *conn, int bits, char *data, size_t data_len); void handleClose( CivetServer *server, const struct mg_connection *conn); private: std::default_random_engine& rng; PrsonaServer *prsonaServer; const std::vector serverIPs; const std::vector serverPorts; const std::string selfIP; const int selfPort; std::mutex& updateMtx; std::atomic& epochNum; std::mutex& buildUpOutputMtx; const std::string buildUpOutputFilename; std::mutex& breakDownOutputMtx; const std::string breakDownOutputFilename; std::mutex& updateOutputMtx; const std::string updateOutputFilename; std::mutex& voteOutputMtx; const std::string voteOutputFilename; std::mutex& usageMtx; const std::string usageFilename; struct synchronization_tool updateSynch, distributeSynch; // RESPONSE ROUTER FUNCTION void generate_response( CivetServer *server, struct mg_connection *conn, const char *filename); // BASIC PUBLIC SYSTEM INFO GETTERS void get_bgn_public_key( struct mg_connection *conn ) const; void get_num_clients( struct mg_connection *conn ) const; void get_num_servers( struct mg_connection *conn ) const; void get_generator( struct mg_connection *conn, bool fresh ); // ENCRYPTED DATA GETTERS void get_current_votes_by( struct mg_connection *conn, const char *filename ) const; void get_all_current_votes( struct mg_connection *conn ) const; void get_current_user_encrypted_tally( struct mg_connection *conn, const char *filename ) const; void get_current_server_encrypted_tally( struct mg_connection *conn, const char *filename ) const; void get_current_pseudonyms( struct mg_connection *conn ) const; // PROOF COMMITMENT GETTERS void get_vote_row_commitment( struct mg_connection *conn, const char *filename ) const; void get_vote_matrix_commitment( struct mg_connection *conn ) const; void get_user_tally_commitment( struct mg_connection *conn, const char *filename ) const; void get_server_tally_commitment( struct mg_connection *conn, const char *filename ) const; void get_pseudonyms_commitment( struct mg_connection *conn ) const; // CLIENT INTERACTIONS void add_new_client( struct mg_connection *conn, const char *filename ); void receive_vote( CivetServer *civetServer, struct mg_connection *conn, const char *filename ); // DISTRIBUTION HELPERS FOR CLIENT INTERACTIONS void distribute_new_user_updates( const std::vector& proofOfValidAddition, const std::vector& previousVoteTallies, const std::vector& currentPseudonyms, const std::vector& currentUserEncryptedTallies, const std::vector>& voteMatrix ) const; void distribute_new_vote( std::vector pi, std::vector newVotes, Twistpoint shortTermPublicKey, std::vector& bandwidthData ) const; void import_new_user_update( struct mg_connection *conn, const char *filename ); // CONSTRUCTOR HELPERS void get_bgn_details( struct mg_connection *conn ) const; void add_seed_to_generator( struct mg_connection *conn, const char *filename, bool fresh ) const; void set_generator( const char *filename, bool fresh ); // EPOCH ROUNDS void build_up_midway_pseudonyms( CivetServer *civetServer, struct mg_connection *conn, const char *filename ); void hbc_build_up_midway_pseudonyms( CivetServer *civetServer, struct mg_connection *conn, const char *filename ); void break_down_midway_pseudonyms( CivetServer *civetServer, struct mg_connection *conn, const char *filename ); void hbc_break_down_midway_pseudonyms( CivetServer *civetServer, struct mg_connection *conn, const char *filename ); void accept_epoch_updates( CivetServer *civetServer, struct mg_connection *conn, const char *filename ); void hbc_accept_epoch_updates( CivetServer *civetServer, struct mg_connection *conn, const char *filename ); // DISTRIBUTED BGN void get_partial_decryption( struct mg_connection *conn ) const; void receive_tallied_scores( struct mg_connection *conn, const char *filename ); }; #endif