networkServer.hpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #ifndef __PRSONA_NETWORK_SERVER_HPP
  2. #define __PRSONA_NETWORK_SERVER_HPP
  3. #include <random>
  4. #include <string>
  5. #include <vector>
  6. #include <atomic>
  7. #include "server.hpp"
  8. #include "networking.hpp"
  9. void obtain_update_locks(
  10. std::unique_lock<std::mutex> &lck,
  11. const std::vector<std::string>& serverIPs,
  12. const std::vector<int>& serverPorts,
  13. const std::string& selfIP,
  14. int selfPort,
  15. struct synchronization_tool *synch);
  16. void release_update_locks(
  17. std::unique_lock<std::mutex> &lck,
  18. const std::vector<std::string>& serverIPs,
  19. const std::vector<int>& serverPorts,
  20. const std::string& selfIP,
  21. int selfPort,
  22. struct synchronization_tool *synch);
  23. std::string make_epoch_initiator_string(
  24. const std::vector<Proof>& generatorProof,
  25. const Twistpoint& nextGenerator);
  26. std::string make_epoch_update_string(
  27. const std::vector<std::vector<Proof>>& pi,
  28. const std::vector<std::vector<Twistpoint>>& permutationCommits,
  29. const std::vector<std::vector<Twistpoint>>& freshPseudonymCommits,
  30. const std::vector<std::vector<Twistpoint>>& freshPseudonymSeedCommits,
  31. const std::vector<std::vector<CurveBipoint>>& serverTallyCommits,
  32. const std::vector<std::vector<std::vector<TwistBipoint>>>& partwayVoteMatrixCommits,
  33. const std::vector<std::vector<std::vector<TwistBipoint>>>& finalVoteMatrixCommits,
  34. const std::vector<std::vector<Twistpoint>>& userTallyMaskCommits,
  35. const std::vector<std::vector<Twistpoint>>& userTallyMessageCommits,
  36. const std::vector<std::vector<Twistpoint>>& userTallySeedCommits,
  37. const Twistpoint& nextGenerator,
  38. bool doUserTallies);
  39. void distribute_epoch_updates(
  40. const std::string& recipient,
  41. int recipientPort,
  42. const std::string& data,
  43. const struct synchronization_tool* sync);
  44. class PrsonaServerWebSocketHandler : public CivetWebSocketHandler {
  45. public:
  46. // CONSTRUCTORS
  47. PrsonaServerWebSocketHandler(
  48. PrsonaServer *prsonaServer,
  49. std::default_random_engine *rng,
  50. std::mutex *updateMtx,
  51. std::atomic<size_t> *epochNum,
  52. const std::vector<std::string>& serverIPs,
  53. const std::vector<int>& serverPorts,
  54. const std::string& selfIP,
  55. int selfPort);
  56. virtual bool handleConnection(
  57. CivetServer *server,
  58. const struct mg_connection *conn);
  59. virtual void handleReadyState(
  60. CivetServer *server,
  61. struct mg_connection *conn);
  62. virtual bool handleData(
  63. CivetServer *server,
  64. struct mg_connection *conn,
  65. int bits,
  66. char *data,
  67. size_t data_len);
  68. virtual void handleClose(
  69. CivetServer *server,
  70. const struct mg_connection *conn);
  71. private:
  72. PrsonaServer *prsonaServer;
  73. std::default_random_engine *rng;
  74. std::mutex *updateMtx;
  75. std::atomic<size_t> *epochNum;
  76. const std::vector<std::string> serverIPs;
  77. const std::vector<int> serverPorts;
  78. const std::string selfIP;
  79. const int selfPort;
  80. struct synchronization_tool updateSynch, distributeSynch;
  81. void generate_response(
  82. struct mg_connection *conn,
  83. const char *filename);
  84. // BASIC PUBLIC SYSTEM INFO GETTERS
  85. void get_bgn_public_key(struct mg_connection *c) const;
  86. void get_num_clients(struct mg_connection *c) const;
  87. void get_num_servers(struct mg_connection *c) const;
  88. // ENCRYPTED DATA GETTERS
  89. void get_current_votes_by(
  90. struct mg_connection *c,
  91. const char *filename
  92. ) const;
  93. void get_all_current_votes(
  94. struct mg_connection *c
  95. ) const;
  96. void get_current_user_encrypted_tally(
  97. struct mg_connection *c,
  98. const char *filename
  99. ) const;
  100. void get_current_server_encrypted_tally(
  101. struct mg_connection *c,
  102. const char *filename
  103. ) const;
  104. void get_current_pseudonyms(
  105. struct mg_connection *c
  106. ) const;
  107. // PROOF COMMITMENT GETTERS
  108. void get_vote_row_commitment(
  109. struct mg_connection *c,
  110. const char *filename
  111. ) const;
  112. void get_vote_matrix_commitment(
  113. struct mg_connection *c
  114. ) const;
  115. void get_user_tally_commitment(
  116. struct mg_connection *c,
  117. const char *filename
  118. ) const;
  119. void get_server_tally_commitment(
  120. struct mg_connection *c,
  121. const char *filename
  122. ) const;
  123. void get_pseudonyms_commitment(
  124. struct mg_connection *c
  125. ) const;
  126. // CLIENT INTERACTIONS
  127. void add_new_client(
  128. struct mg_connection *c,
  129. const char *filename
  130. );
  131. void receive_vote(
  132. struct mg_connection *c,
  133. const char *filename
  134. );
  135. // CONSTRUCTOR HELPERS
  136. void get_bgn_details(struct mg_connection *c) const;
  137. void add_seed_to_generator(
  138. struct mg_connection *conn,
  139. const char *filename,
  140. bool fresh
  141. ) const;
  142. void set_generator(
  143. const char *filename,
  144. bool fresh
  145. );
  146. // EPOCH ROUNDS
  147. void build_up_midway_pseudonyms(
  148. struct mg_connection *c,
  149. const char *filename
  150. );
  151. void break_down_midway_pseudonyms(
  152. struct mg_connection *c,
  153. const char *filename
  154. );
  155. void accept_epoch_updates(
  156. struct mg_connection *c,
  157. const char *filename
  158. );
  159. // DATA MAINTENANCE
  160. void import_new_user_update(
  161. const char *filename
  162. );
  163. void distribute_new_user_updates(
  164. std::vector<Proof> proofOfValidAddition,
  165. std::vector<CurveBipoint> previousVoteTallies,
  166. std::vector<Twistpoint> currentPseudonyms,
  167. std::vector<EGCiphertext> currentUserEncryptedTallies,
  168. std::vector<std::vector<TwistBipoint>> voteMatrix
  169. ) const;
  170. void distribute_new_vote(
  171. std::vector<Proof> pi,
  172. std::vector<TwistBipoint> newVotes,
  173. Twistpoint shortTermPublicKey
  174. ) const;
  175. void get_partial_decryption(
  176. struct mg_connection *conn
  177. ) const;
  178. void receive_tallied_scores(
  179. struct mg_connection *conn,
  180. const char *filename
  181. );
  182. void get_generator(
  183. struct mg_connection *conn,
  184. bool fresh
  185. );
  186. };
  187. #endif