networkServer.hpp 15 KB

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