networking.hpp 7.3 KB

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