clients.hpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. typedef uint8_t token[SGX_AESGCM_MAC_SIZE];
  2. typedef uint8_t aes_key[SGX_AESGCM_KEY_SIZE];
  3. // #define VERBOSE_CLIENT
  4. /*
  5. Client -> Ingestion Server (C->I) communication protocols:
  6. 1) Authentication
  7. Format: Client sim_id, Epoch number, Authentication token
  8. 2) Messages
  9. Format: IV, AESGCM([CM_1], [CM_2], ..., [CM_k]), TAG
  10. - each CM = Client Message for private channel has the format :
  11. 4-byte Sender ID, 4-byte Recipient ID, 16-byte Token,
  12. <Upto msg_size - 24> - bytes of message data
  13. where the Sender ID and Recipient ID are the TEEMS client id
  14. (and not sim_id)
  15. */
  16. /*
  17. Structure for capture each individual simulated client's state
  18. */
  19. class Client
  20. {
  21. private:
  22. // Clients' have a simulator ID sim_id used for:
  23. // (i) the simulator to divvy up clients across threads
  24. // (ii) the simulator and ingestion servers to align simulated clients
  25. // and their pre-established shared-secrets
  26. clientid_t sim_id;
  27. // The actual client id used by TEEMS is id.
  28. // Format: the first DEST_STORAGE_NODE_BITS bits store the storage node
  29. // number and the userid at that storage node in the last DEST_UID_BITS
  30. clientid_t id;
  31. aes_key ing_key;
  32. aes_key stg_key;
  33. // Clients send encrypted messages to ingestion
  34. // so they set and increment the IV
  35. unsigned char ing_iv[SGX_AESGCM_IV_SIZE] = {0};
  36. token *token_list;
  37. boost::asio::ip::tcp::socket *ingestion_sock = NULL;
  38. boost::asio::ip::tcp::socket *storage_sock = NULL;
  39. void generateAuthenticationMessage();
  40. int sendIngAuthMessage(unsigned long epoch_no);
  41. int sendStgAuthMessage(unsigned long epoch_no);
  42. void generateMessageBundle(uint8_t priv_out, uint32_t msg_size,
  43. unsigned char *pt_msgbundle);
  44. bool encryptMessageBundle(uint32_t bundle_size, unsigned char *pt_msgbundle,
  45. unsigned char* enc_msgbundle);
  46. void sendMessageBundle();
  47. void initializeIngSocket(boost::asio::io_context &ioc, NodeConfig &ing_server);
  48. void initializeStgSocket(boost::asio::io_context &ioc, NodeConfig &ing_server);
  49. void initClient(clientid_t cid, uint16_t stg_id, aes_key ikey, aes_key skey);
  50. public:
  51. Client() {}
  52. ~Client() {
  53. free(token_list);
  54. delete(ingestion_sock);
  55. delete(storage_sock);
  56. }
  57. void setup_client(boost::asio::io_context &ioc, uint32_t sim_id,
  58. uint16_t ing_node_id, uint16_t stg_node_id);
  59. void epoch_process();
  60. };