networkServer.hpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  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. /* "PUBLIC" FUNCTIONS */
  10. // CREATOR FOR A NEW SERVER
  11. PrsonaServer *create_server(
  12. std::default_random_engine& rng,
  13. std::string dealerIP,
  14. int dealerPort,
  15. bool bgnDealer,
  16. size_t numServers);
  17. // CHECK IN FUNCTION USED FOR SYNCHRONIZATION IN SETUP
  18. void check_in_with_dealer(
  19. std::string dealerIP,
  20. int dealerPort);
  21. // INITIATER FOR SHARED GLOBAL VALUES
  22. void initiate_generators(
  23. std::default_random_engine& rng,
  24. PrsonaServer* prsonaServer,
  25. const std::vector<std::string>& serverIPs,
  26. const std::vector<int>& serverPorts,
  27. const std::string& selfIP,
  28. int selfPort);
  29. // FUNCTION TO PERFORM OPERATIONS FOR EXPERIMENT
  30. void make_epoch(
  31. std::default_random_engine& rng,
  32. PrsonaServer *prsonaServer,
  33. const std::vector<std::string>& serverIPs,
  34. const std::vector<int>& serverPorts,
  35. const std::string& selfIP,
  36. int selfPort,
  37. std::mutex& updateMtx,
  38. std::atomic<size_t>& epochNum);
  39. /* "PRIVATE" FUNCTIONS */
  40. // SHARED GLOBAL UPDATE LOCK GETTERS AND RELEASERS
  41. void obtain_update_locks(
  42. std::unique_lock<std::mutex> &updateLock,
  43. const std::vector<std::string>& serverIPs,
  44. const std::vector<int>& serverPorts,
  45. const std::string& selfIP,
  46. int selfPort);
  47. void release_update_locks(
  48. std::unique_lock<std::mutex> &updateLock,
  49. const std::vector<std::string>& serverIPs,
  50. const std::vector<int>& serverPorts,
  51. const std::string& selfIP,
  52. int selfPort);
  53. // GETTER FOR DEALER VALUE
  54. BGN get_bgn_private_key(
  55. std::default_random_engine& rng,
  56. std::string dealerIP,
  57. int dealerPort);
  58. // HELPERS TO INITIATE SHARED GLOBAL VALUES
  59. Twistpoint make_generator(
  60. std::default_random_engine& rng,
  61. PrsonaServer *prsonaServer,
  62. const std::vector<std::string>& serverIPs,
  63. const std::vector<int>& serverPorts,
  64. const std::string& selfIP,
  65. int selfPort,
  66. bool fresh,
  67. std::vector<Proof>& pi);
  68. void distribute_generator(
  69. PrsonaServer *prsonaServer,
  70. const std::vector<std::string>& serverIPs,
  71. const std::vector<int>& serverPorts,
  72. const std::string& selfIP,
  73. int selfPort,
  74. bool fresh,
  75. const std::vector<Proof>& pi,
  76. const Twistpoint& generator);
  77. // HELPERS FOR EPOCH CALCULATIONS
  78. std::vector<Proof> epoch_build_up(
  79. std::default_random_engine& rng,
  80. PrsonaServer *prsonaServer,
  81. const std::vector<std::string>& serverIPs,
  82. const std::vector<int>& serverPorts,
  83. const std::string& selfIP,
  84. int selfPort,
  85. Twistpoint& nextGenerator);
  86. void epoch_break_down(
  87. std::default_random_engine& rng,
  88. PrsonaServer *prsonaServer,
  89. const std::vector<std::string>& serverIPs,
  90. const std::vector<int>& serverPorts,
  91. const std::string& selfIP,
  92. int selfPort,
  93. const std::vector<Proof>& generatorProof,
  94. const Twistpoint& nextGenerator);
  95. // HELPERS FOR EPOCH HELPERS
  96. Twistpoint initiate_epoch_updates(
  97. std::default_random_engine& rng,
  98. const std::string& recipient,
  99. int recipientPort,
  100. const std::string& data,
  101. bool isBreakdown,
  102. std::vector<std::vector<Proof>>& generatorProofHolder);
  103. struct mg_connection *distribute_epoch_updates(
  104. const std::string& recipient,
  105. int recipientPort,
  106. const std::string& data,
  107. struct synchronization_tool* sync);
  108. // SCORE TALLYING AND DISTRIBUTION HELPERS
  109. void tally_scores(
  110. PrsonaServer *prsonaServer,
  111. const std::vector<std::string>& serverIPs,
  112. const std::vector<int>& serverPorts,
  113. const std::string& selfIP,
  114. int selfPort,
  115. const Twistpoint& nextGenerator,
  116. std::vector<EGCiphertext>& userTallyScores,
  117. std::vector<CurveBipoint>& serverTallyScores);
  118. void distribute_tallied_scores(
  119. PrsonaServer *prsonaServer,
  120. const std::vector<std::string>& serverIPs,
  121. const std::vector<int>& serverPorts,
  122. const std::string& selfIP,
  123. int selfPort,
  124. const Twistpoint& nextGenerator,
  125. const std::vector<EGCiphertext>& userTallyScores,
  126. const std::vector<CurveBipoint>& serverTallyScores);
  127. // FILE I/O HELPERS
  128. BGN get_bgn_private_key_from_file(
  129. const char *filename);
  130. Twistpoint get_generator_from_file(
  131. const char *filename,
  132. Proof& pi);
  133. Twistpoint get_generator_from_file(
  134. const char *filename,
  135. std::vector<Proof>& pi);
  136. // EPOCH DATA SERIALIZERS/UN-SERIALIZERS
  137. std::string make_epoch_initiator_string(
  138. const std::vector<Proof>& generatorProof,
  139. const Twistpoint& nextGenerator);
  140. void read_epoch_initiator_string(
  141. const char *filename,
  142. std::vector<Proof>& generatorProof,
  143. Twistpoint& nextGenerator);
  144. std::string make_epoch_update_string(
  145. const std::vector<std::vector<Proof>>& pi,
  146. const std::vector<std::vector<Twistpoint>>& permutationCommits,
  147. const std::vector<std::vector<Twistpoint>>& freshPseudonymCommits,
  148. const std::vector<std::vector<Twistpoint>>& freshPseudonymSeedCommits,
  149. const std::vector<std::vector<CurveBipoint>>& serverTallyCommits,
  150. const std::vector<std::vector<std::vector<TwistBipoint>>>& partwayVoteMatrixCommits,
  151. const std::vector<std::vector<std::vector<TwistBipoint>>>& finalVoteMatrixCommits,
  152. const std::vector<std::vector<Twistpoint>>& userTallyMaskCommits,
  153. const std::vector<std::vector<Twistpoint>>& userTallyMessageCommits,
  154. const std::vector<std::vector<Twistpoint>>& userTallySeedCommits,
  155. const Twistpoint& nextGenerator,
  156. bool doUserTallies);
  157. bool read_epoch_update_string(
  158. const char *filename,
  159. std::vector<std::vector<Proof>>& pi,
  160. std::vector<std::vector<Twistpoint>>& permutationCommits,
  161. std::vector<std::vector<Twistpoint>>& freshPseudonymCommits,
  162. std::vector<std::vector<Twistpoint>>& freshPseudonymSeedCommits,
  163. std::vector<std::vector<CurveBipoint>>& serverTallyCommits,
  164. std::vector<std::vector<std::vector<TwistBipoint>>>& partwayVoteMatrixCommits,
  165. std::vector<std::vector<std::vector<TwistBipoint>>>& finalVoteMatrixCommits,
  166. std::vector<std::vector<Twistpoint>>& userTallyMaskCommits,
  167. std::vector<std::vector<Twistpoint>>& userTallyMessageCommits,
  168. std::vector<std::vector<Twistpoint>>& userTallySeedCommits,
  169. Twistpoint& nextGenerator);
  170. /* OTHER SERVER-RELEVANT HANDLERS */
  171. // Used to tell orchestrator when the system is ready to do an epoch change
  172. class EpochReadyHandler : public CivetHandler
  173. {
  174. public:
  175. EpochReadyHandler(
  176. struct synchronization_tool *exitSync,
  177. struct synchronization_tool *readySync,
  178. std::mutex& updateMtx,
  179. size_t numServers);
  180. bool handleGet(
  181. CivetServer *server,
  182. struct mg_connection *conn);
  183. private:
  184. struct synchronization_tool *exitSync, *readySync;
  185. std::mutex& updateMtx;
  186. const size_t numServers;
  187. };
  188. // Used to indicate which epoch the system is currently in
  189. class EpochNumHandler : public CivetHandler
  190. {
  191. public:
  192. EpochNumHandler(
  193. std::atomic<size_t>& epochNum);
  194. bool handleGet(
  195. CivetServer *server,
  196. struct mg_connection *conn);
  197. private:
  198. std::atomic<size_t>& epochNum;
  199. };
  200. // Used to take and release update locks
  201. class UpdateLockWebSocketHandler : public CivetWebSocketHandler
  202. {
  203. public:
  204. UpdateLockWebSocketHandler(
  205. std::mutex& updateMtx,
  206. std::unique_lock<std::mutex> **lockHolder,
  207. bool isLocking);
  208. ~UpdateLockWebSocketHandler();
  209. bool handleConnection(
  210. CivetServer *server,
  211. const struct mg_connection *conn);
  212. void handleReadyState(
  213. CivetServer *server,
  214. struct mg_connection *conn);
  215. bool handleData(
  216. CivetServer *server,
  217. struct mg_connection *conn,
  218. int bits,
  219. char *data,
  220. size_t data_len);
  221. void handleClose(
  222. CivetServer *server,
  223. const struct mg_connection *conn);
  224. private:
  225. std::mutex& updateMtx;
  226. std::unique_lock<std::mutex> **lockHolder;
  227. const bool isLocking;
  228. };
  229. /* SERVER-SPECIFIC HANDLER */
  230. class PrsonaServerWebSocketHandler : public CivetWebSocketHandler {
  231. public:
  232. // CONSTRUCTORS
  233. PrsonaServerWebSocketHandler(
  234. std::default_random_engine& rng,
  235. PrsonaServer *prsonaServer,
  236. const std::vector<std::string>& serverIPs,
  237. const std::vector<int>& serverPorts,
  238. const std::string& selfIP,
  239. int selfPort,
  240. std::mutex& updateMtx,
  241. std::atomic<size_t>& epochNum);
  242. // REQUIRED BY INHERITED CLASS
  243. bool handleConnection(
  244. CivetServer *server,
  245. const struct mg_connection *conn);
  246. void handleReadyState(
  247. CivetServer *server,
  248. struct mg_connection *conn);
  249. bool handleData(
  250. CivetServer *server,
  251. struct mg_connection *conn,
  252. int bits,
  253. char *data,
  254. size_t data_len);
  255. void handleClose(
  256. CivetServer *server,
  257. const struct mg_connection *conn);
  258. private:
  259. std::default_random_engine& rng;
  260. PrsonaServer *prsonaServer;
  261. const std::vector<std::string> serverIPs;
  262. const std::vector<int> serverPorts;
  263. const std::string selfIP;
  264. const int selfPort;
  265. std::mutex& updateMtx;
  266. std::atomic<size_t>& epochNum;
  267. struct synchronization_tool updateSynch, distributeSynch;
  268. // RESPONSE ROUTER FUNCTION
  269. void generate_response(
  270. struct mg_connection *conn,
  271. const char *filename);
  272. // BASIC PUBLIC SYSTEM INFO GETTERS
  273. void get_bgn_public_key(
  274. struct mg_connection *conn
  275. ) const;
  276. void get_num_clients(
  277. struct mg_connection *conn
  278. ) const;
  279. void get_num_servers(
  280. struct mg_connection *conn
  281. ) const;
  282. void get_generator(
  283. struct mg_connection *conn,
  284. bool fresh
  285. );
  286. // ENCRYPTED DATA GETTERS
  287. void get_current_votes_by(
  288. struct mg_connection *conn,
  289. const char *filename
  290. ) const;
  291. void get_all_current_votes(
  292. struct mg_connection *conn
  293. ) const;
  294. void get_current_user_encrypted_tally(
  295. struct mg_connection *conn,
  296. const char *filename
  297. ) const;
  298. void get_current_server_encrypted_tally(
  299. struct mg_connection *conn,
  300. const char *filename
  301. ) const;
  302. void get_current_pseudonyms(
  303. struct mg_connection *conn
  304. ) const;
  305. // PROOF COMMITMENT GETTERS
  306. void get_vote_row_commitment(
  307. struct mg_connection *conn,
  308. const char *filename
  309. ) const;
  310. void get_vote_matrix_commitment(
  311. struct mg_connection *conn
  312. ) const;
  313. void get_user_tally_commitment(
  314. struct mg_connection *conn,
  315. const char *filename
  316. ) const;
  317. void get_server_tally_commitment(
  318. struct mg_connection *conn,
  319. const char *filename
  320. ) const;
  321. void get_pseudonyms_commitment(
  322. struct mg_connection *conn
  323. ) const;
  324. // CLIENT INTERACTIONS
  325. void add_new_client(
  326. struct mg_connection *conn,
  327. const char *filename
  328. );
  329. void receive_vote(
  330. struct mg_connection *conn,
  331. const char *filename
  332. );
  333. // DISTRIBUTION HELPERS FOR CLIENT INTERACTIONS
  334. void distribute_new_user_updates(
  335. const std::vector<Proof>& proofOfValidAddition,
  336. const std::vector<CurveBipoint>& previousVoteTallies,
  337. const std::vector<Twistpoint>& currentPseudonyms,
  338. const std::vector<EGCiphertext>& currentUserEncryptedTallies,
  339. const std::vector<std::vector<TwistBipoint>>& voteMatrix
  340. ) const;
  341. void distribute_new_vote(
  342. std::vector<Proof> pi,
  343. std::vector<TwistBipoint> newVotes,
  344. Twistpoint shortTermPublicKey
  345. ) const;
  346. void import_new_user_update(
  347. struct mg_connection *conn,
  348. const char *filename
  349. );
  350. // CONSTRUCTOR HELPERS
  351. void get_bgn_details(
  352. struct mg_connection *conn
  353. ) const;
  354. void add_seed_to_generator(
  355. struct mg_connection *conn,
  356. const char *filename,
  357. bool fresh
  358. ) const;
  359. void set_generator(
  360. const char *filename,
  361. bool fresh
  362. );
  363. // EPOCH ROUNDS
  364. void build_up_midway_pseudonyms(
  365. struct mg_connection *conn,
  366. const char *filename
  367. );
  368. void break_down_midway_pseudonyms(
  369. struct mg_connection *conn,
  370. const char *filename
  371. );
  372. void accept_epoch_updates(
  373. struct mg_connection *conn,
  374. const char *filename
  375. );
  376. // DISTRIBUTED BGN
  377. void get_partial_decryption(
  378. struct mg_connection *conn
  379. ) const;
  380. void receive_tallied_scores(
  381. struct mg_connection *conn,
  382. const char *filename
  383. );
  384. };
  385. #endif