networking.hpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. #ifndef __PRSONA_NETWORKING_HPP
  2. #define __PRSONA_NETWORKING_HPP
  3. #define USE_SERVER_STATS 1
  4. #define USE_SSL 0
  5. #include <mutex>
  6. #include <condition_variable>
  7. #include <random>
  8. #include <string>
  9. #include "CivetServer.h"
  10. #include "Scalar.hpp"
  11. #include "base.hpp"
  12. #define MG_WEBSOCKET_OPCODE_DATACOMPLETE 0xb
  13. #define DEFAULT_PRSONA_PORT_STR "8080"
  14. #define TMP_FILE_SIZE 12
  15. #define TMP_DIR "./tmp/"
  16. #define TMP_DIR_SIZE 6
  17. enum RequestType {
  18. /* SERVER PUBLIC FUNCTIONS */
  19. // BASIC PUBLIC SYSTEM INFO GETTERS
  20. PRSONA_GIVE_BGN_PUBKEY = 'a',
  21. PRSONA_GIVE_NUM_CLIENTS,
  22. PRSONA_GIVE_NUM_SERVERS,
  23. PRSONA_GIVE_EG_BLIND_GENERATOR,
  24. PRSONA_GIVE_FRESH_GENERATOR,
  25. // ENCRYPTED DATA GETTERS
  26. PRSONA_GIVE_VOTE_ROW,
  27. PRSONA_GIVE_VOTE_MATRIX,
  28. PRSONA_GIVE_CLIENT_TALLY,
  29. PRSONA_GIVE_SERVER_TALLY,
  30. PRSONA_GIVE_PSEUDONYMS,
  31. // PROOF COMMITMENT GETTERS
  32. PRSONA_GIVE_VOTE_ROW_COMMITMENT,
  33. PRSONA_GIVE_VOTE_MATRIX_COMMITMENT,
  34. PRSONA_GIVE_CLIENT_TALLY_COMMITMENT,
  35. PRSONA_GIVE_SERVER_TALLY_COMMITMENT,
  36. PRSONA_GIVE_PSEUDONYMS_COMMITMENT,
  37. // CLIENT INTERACTIONS
  38. PRSONA_RECEIVE_NEW_CLIENT,
  39. PRSONA_RECEIVE_VOTE,
  40. /* SERVER PRIVATE FUNCTIONS */
  41. // CLIENT INTERACTION HELPER
  42. PRSONA_RECEIVE_UPDATE_WITH_NEW_USER,
  43. // CONSTRUCTOR HELPERS
  44. PRSONA_GIVE_BGN_PRIVKEY,
  45. PRSONA_ADD_CURR_SEED_TO_GENERATOR,
  46. PRSONA_RECEIVE_FRESH_GENERATOR,
  47. PRSONA_ADD_RAND_SEED_TO_GENERATOR,
  48. PRSONA_RECEIVE_EG_BLIND_GENERATOR,
  49. // EPOCH ROUNDS
  50. PRSONA_PERFORM_EPOCH_BUILD_UP,
  51. PRSONA_PERFORM_EPOCH_BREAK_DOWN,
  52. PRSONA_RECEIVE_EPOCH_UPDATE,
  53. // DISTRIBUTED BGN
  54. PRSONA_GIVE_PARTIAL_DECRYPTION = '-',
  55. PRSONA_RECEIVE_PARTIAL_DECRYPTION = '_',
  56. /* CLIENT PUBLIC FUNCTIONS */
  57. // REPUTATION PROOF VERIFIER
  58. PRSONA_VERIFY_REPUTATION_PROOF = 'a'
  59. };
  60. /* SERVER PUBLIC FUNCTIONS */
  61. // BASIC PUBLIC SYSTEM INFO GETTERS
  62. #define REQUEST_BGN_PUBKEY_URI "/ws?a"
  63. #define REQUEST_NUM_CLIENTS_URI "/ws?b"
  64. #define REQUEST_NUM_SERVERS_URI "/ws?c"
  65. #define REQUEST_EG_BLIND_GENERATOR_URI "/ws?d"
  66. #define REQUEST_FRESH_GENERATOR_URI "/ws?e"
  67. // ENCRYPTED DATA GETTERS
  68. #define REQUEST_VOTE_ROW_URI "/ws?f"
  69. #define REQUEST_VOTE_MATRIX_URI "/ws?g"
  70. #define REQUEST_CLIENT_TALLY_URI "/ws?h"
  71. #define REQUEST_SERVER_TALLY_URI "/ws?i"
  72. #define REQUEST_PSEUDONYMS_URI "/ws?j"
  73. // PROOF COMMITMENT GETTERS
  74. #define REQUEST_VOTE_ROW_COMMITMENT_URI "/ws?k"
  75. #define REQUEST_VOTE_MATRIX_COMMITMENT_URI "/ws?l"
  76. #define REQUEST_CLIENT_TALLY_COMMITMENT_URI "/ws?m"
  77. #define REQUEST_SERVER_TALLY_COMMITMENT_URI "/ws?n"
  78. #define REQUEST_PSEUDONYMS_COMMITMENT_URI "/ws?o"
  79. // CLIENT INTERACTIONS
  80. #define SUBMIT_NEW_CLIENT_URI "/ws?p"
  81. #define SUBMIT_VOTE_URI "/ws?q"
  82. /* SERVER PRIVATE FUNCTIONS */
  83. // CLIENT INTERACTION HELPER
  84. #define SUBMIT_UPDATE_WITH_NEW_USER_URI "/ws?r"
  85. // CONSTRUCTOR HELPERS
  86. #define REQUEST_BGN_PRIVKEY_URI "/ws?s"
  87. #define REQUEST_ADD_CURR_SEED_FOR_FRESH_GENERATOR_URI "/ws?t"
  88. #define SUBMIT_FRESH_GENERATOR_URI "/ws?u"
  89. #define REQUEST_ADD_RAND_SEED_FOR_EG_BLIND_GENERATOR_URI "/ws?v"
  90. #define SUBMIT_EG_BLIND_GENERATOR_URI "/ws?w"
  91. // EPOCH ROUNDS
  92. #define REQUEST_EPOCH_BUILD_UP_URI "/ws?x"
  93. #define REQUEST_EPOCH_BREAK_DOWN_URI "/ws?y"
  94. #define SUBMIT_EPOCH_UPDATES_URI "/ws?z"
  95. // DISTRIBUTED BGN
  96. #define REQUEST_PARTIAL_DECRYPTION_URI "/ws?-"
  97. #define SUBMIT_PARTIAL_DECRYPTION_URI "/ws?_"
  98. /* CLIENT PUBLIC FUNCTIONS */
  99. // REPUTATION PROOF VERIFIER
  100. #define VERIFY_REPUTATION_PROOF_URI "/ws?a"
  101. /* SYNCHRONIZATION HANDLERS */
  102. // ORCHESTRATOR-SERVER/CLIENT SYNCHRONIZATION
  103. #define EXIT_URI "/exit"
  104. // INTER-SERVER SYNCHRONIZATION
  105. #define SERVER_CHECK_IN_URI "/init"
  106. #define UPDATE_LOCK_URI "/lock"
  107. #define UPDATE_UNLOCK_URI "/unlock"
  108. // SERVER-ORCHESTRATOR SYNCHRONIZATION
  109. #define EPOCH_READY_URI "/ready"
  110. // SERVER EXPERIMENT TRIGGER
  111. #define TRIGGER_EPOCH_URI "/epoch"
  112. // CLIENT EXPERIMENT TRIGGERS
  113. #define TRIGGER_VOTE_URI "/vote"
  114. #define TRIGGER_REP_URI "/rep"
  115. // SERVER-CLIENT SYNCHRONIZATION
  116. #define WHICH_EPOCH_URI "/which"
  117. /* Helper types */
  118. // Struct to help synchronization efforts across multi-threaded websocket usage
  119. struct synchronization_tool {
  120. std::mutex mtx;
  121. std::condition_variable cv;
  122. size_t val, val2;
  123. };
  124. /* "PUBLIC" GENERIC HELPER FUNCTIONS */
  125. // This function must be run once before any PRSONA objects are created or used
  126. void initialize_prsona_classes();
  127. // Makes a random temp filename to be used in receiving serialized data
  128. char *set_temp_filename(
  129. std::default_random_engine& rng,
  130. struct mg_connection *conn);
  131. // Loads config information
  132. void load_multiple_instances_config(
  133. std::vector<std::string>& relevantIPs,
  134. std::vector<int>& relevantPorts,
  135. const char *filename);
  136. void load_single_instance_config(
  137. std::string& relevantIP,
  138. std::string& relevantPortStr,
  139. int& relevantPort,
  140. const char *filename);
  141. // Extracts relevant log data from server
  142. std::vector<size_t> get_log_data(
  143. const struct mg_context *ctx);
  144. // Write log data to file
  145. void write_log_data(
  146. std::mutex& outputMtx,
  147. const std::string& outputFilename,
  148. const std::vector<double>& timingData,
  149. const std::vector<size_t>& bandwidthData);
  150. /* "PRIVATE" FUNCTIONS TO HELP THE GENERIC HELPERS */
  151. // Helper for set_temp_filename()
  152. std::string random_string(
  153. std::default_random_engine& rng,
  154. size_t length);
  155. // Helper for get_log_data()
  156. size_t parse_log_for_data(
  157. const char *input,
  158. const char *key);
  159. /* WEBSOCKET HANDLER FUNCTIONS */
  160. // NULL
  161. int empty_websocket_data_handler(
  162. struct mg_connection *conn,
  163. int bits,
  164. char *data,
  165. size_t data_len,
  166. void *user_data);
  167. void empty_websocket_close_handler(
  168. const struct mg_connection *conn,
  169. void *user_data);
  170. // SYNCHRONIZATION ONLY
  171. int synchro_websocket_data_handler(
  172. struct mg_connection *conn,
  173. int bits,
  174. char *data,
  175. size_t data_len,
  176. void *user_data);
  177. void synchro_websocket_close_handler(
  178. const struct mg_connection *conn,
  179. void *user_data);
  180. // RECEIVE SERIALIZED DATA ONLY
  181. int file_websocket_data_handler(
  182. struct mg_connection *conn,
  183. int bits,
  184. char *data,
  185. size_t data_len,
  186. void *user_data);
  187. void file_websocket_close_handler(
  188. const struct mg_connection *conn,
  189. void *user_data);
  190. // SYNCHRONIZATION AND RECEIVE SERIALIZED DATA
  191. int epoch_websocket_data_handler(
  192. struct mg_connection *conn,
  193. int bits,
  194. char *data,
  195. size_t data_len,
  196. void *user_data);
  197. void epoch_websocket_close_handler(
  198. const struct mg_connection *conn,
  199. void *user_data);
  200. // SPECIAL FOR HANDLING UNUSUAL DATA
  201. int clients_websocket_data_handler(
  202. struct mg_connection *conn,
  203. int bits,
  204. char *data,
  205. size_t data_len,
  206. void *user_data);
  207. /* GENERIC HANDLERS */
  208. // Used for signaling exits
  209. class RemoteControlHandler : public CivetHandler
  210. {
  211. public:
  212. RemoteControlHandler(
  213. struct synchronization_tool *sync);
  214. RemoteControlHandler(
  215. struct synchronization_tool *sync,
  216. const std::string& message);
  217. bool handleGet(
  218. CivetServer *server,
  219. struct mg_connection *conn);
  220. private:
  221. struct synchronization_tool *sync;
  222. const std::string message;
  223. };
  224. // Used for signaling events (making votes, epoch changes, etc.)
  225. class AltRemoteControlHandler : public CivetHandler
  226. {
  227. public:
  228. AltRemoteControlHandler(
  229. size_t value,
  230. struct synchronization_tool *sync);
  231. AltRemoteControlHandler(size_t value,
  232. struct synchronization_tool *sync,
  233. const std::string& message);
  234. bool handleGet(CivetServer *server, struct mg_connection *conn);
  235. std::string getQuery() const;
  236. private:
  237. const size_t value;
  238. struct synchronization_tool *sync;
  239. const std::string message;
  240. std::string query;
  241. };
  242. #endif