p2.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. #include <type_traits> // std::is_same<>
  2. #include <limits> // std::numeric_limits<>
  3. #include <climits> // CHAR_BIT
  4. #include <cmath> // std::log2, std::ceil, std::floor
  5. #include <stdexcept> // std::runtime_error
  6. #include <array> // std::array<>
  7. #include <iostream> // std::istream and std::ostream
  8. #include <vector> // std::vector<>
  9. #include <memory> // std::shared_ptr<>
  10. #include <utility> // std::move
  11. #include <algorithm> // std::copy
  12. #include <cstring> // std::memcpy
  13. #include <bsd/stdlib.h> // arc4random_buf
  14. #include <x86intrin.h> // SSE and AVX intrinsics
  15. #include "prg.h"
  16. #include "prg_aes_impl.h"
  17. #include <iostream>
  18. #include "block.h"
  19. #include <chrono>
  20. #include <sys/mman.h>
  21. #include <sys/stat.h>
  22. #include <fcntl.h>
  23. #include <fstream>
  24. #include <../boost/asio.hpp>
  25. #include <mutex>
  26. #include <../boost/lexical_cast.hpp>
  27. #include <memory>
  28. #include <../boost/asio.hpp>
  29. using boost::asio::ip::tcp;
  30. //#include "network.h"
  31. #include "duoram-utils.h"
  32. using boost::asio::ip::tcp;
  33. DB_t * X0;
  34. DB_t * X1;
  35. DB_t alpha;
  36. typedef __m128i leaf_t;
  37. typedef __m128i node_t;
  38. __m128i seed0_, seed1_, seed2_;
  39. const size_t target = 22;
  40. const leaf_t val = _mm_set1_epi8(0x01);
  41. using socket_t = boost::asio::ip::tcp::socket;
  42. using namespace std;
  43. void quick_fix_send_ones_share(tcp::socket& out0, tcp::socket& out1)
  44. {
  45. DB_t one = 47920;//0xffffffffffffffff;
  46. DB_t S0, S1;
  47. arc4random_buf(&S0, sizeof(DB_t));
  48. S1 = - S0 + one;
  49. // out0 << S0;
  50. // out1 << S1;
  51. write(out0, boost::asio::buffer(&S0, sizeof(S0)));
  52. write(out1, boost::asio::buffer(&S1, sizeof(S1)));
  53. //arc4random_buf(&S0, sizeof(DB_t));
  54. S1 = - S0 + one;
  55. // out0 << S0;
  56. // out1 << S1;
  57. write(out0, boost::asio::buffer(&S0, sizeof(S0)));
  58. write(out1, boost::asio::buffer(&S1, sizeof(S1)));
  59. //arc4random_buf(&S0, sizeof(DB_t));
  60. S1 = - S0 + one;
  61. // out0 << S0;
  62. // out1 << S1;
  63. write(out0, boost::asio::buffer(&S0, sizeof(S0)));
  64. write(out1, boost::asio::buffer(&S1, sizeof(S1)));
  65. }
  66. auto generate_cancelation_terms(int8_t c0[], int8_t d1[], size_t db_nitems, size_t rotate_by = 0)
  67. {
  68. DB_t Z0 = dot_product_with_bool(X0, d1, db_nitems, rotate_by);
  69. DB_t Z1 = dot_product_with_bool(X1, c0, db_nitems, rotate_by);
  70. DB_t cancelation_term0 = -Z0 ;
  71. DB_t cancelation_term1 = -Z1 ;
  72. return std::make_pair(cancelation_term0, cancelation_term1);
  73. }
  74. void refresh_blinds(int8_t writing_c[], int8_t writing_d[],
  75. DB_t c[], DB_t d[],
  76. DB_t finalcw0, DB_t finalcw1, size_t db_nitems, size_t rotate_by = 0)
  77. {
  78. // DB_t tmp0 = 0;
  79. // DB_t tmp1 = 0;
  80. for(size_t j = 0; j < db_nitems; ++j)
  81. {
  82. // if(writing_c[j] != 0)
  83. // {
  84. // tmp0 = finalcw0;
  85. // }
  86. // else
  87. // tmp0 = 0;
  88. // }
  89. // if(writing_d[j] != 0)
  90. // {
  91. // tmp1 = finalcw1;
  92. // }
  93. // else
  94. // {
  95. // tmp1 = 0;
  96. // }
  97. // X0[j] = X0[j] - c[(j + rotate_by) % db_nitems] + ((writing_c[(j + rotate_by) % db_nitems] != 0) ? finalcw0: 0);// tmp0; //c0
  98. // X1[j] = X1[j] - d[(j + rotate_by) % db_nitems] - ((writing_d[(j + rotate_by) % db_nitems] != 0) ? finalcw1: 0);; //c2
  99. X0[j] = X0[j] - c[(j + rotate_by) % db_nitems] - ((writing_c[(j + rotate_by) % db_nitems]) * finalcw0);// tmp0; //c0
  100. X1[j] = X1[j] - d[(j + rotate_by) % db_nitems] - ((writing_d[(j + rotate_by) % db_nitems]) * finalcw1); //c2
  101. // std::cout << "X0 <-> X1 " << X0[j] << " " << X1[j] << std::endl;
  102. }
  103. }
  104. void accept_conncections_from_Pb(boost::asio::io_context&io_context, std::vector<socket_t>& sockets_0, int port, size_t j)
  105. {
  106. tcp::acceptor acceptor2_(io_context, tcp::endpoint(tcp::v4(), port));
  107. tcp::socket s2(acceptor2_.accept());
  108. sockets_0[j] = std::move(s2);
  109. // sockets_0.emplace_back(std::move(s2));
  110. }
  111. int main(int argc, char* argv[])
  112. {
  113. size_t expo = atoi(argv[3]);
  114. size_t db_nitems = 1ULL << expo;
  115. size_t number_of_ind_writes = atoi(argv[4]);;
  116. size_t number_of_ind_reads = atoi(argv[5]);;
  117. size_t number_of_dep_reads = atoi(argv[6]);;
  118. b = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
  119. c = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
  120. d = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
  121. reading_b = (int8_t *) malloc(db_nitems * sizeof(int8_t));
  122. reading_c = (int8_t *) malloc(db_nitems * sizeof(int8_t));
  123. reading_d = (int8_t *) malloc(db_nitems * sizeof(int8_t));
  124. writing_b = (int8_t *) malloc(db_nitems * sizeof(int8_t));
  125. writing_c = (int8_t *) malloc(db_nitems * sizeof(int8_t));
  126. writing_d = (int8_t *) malloc(db_nitems * sizeof(int8_t));
  127. boost::asio::io_context io_context;
  128. AES_KEY aeskey;
  129. arc4random_buf(&seed0_, sizeof(__m128i));
  130. arc4random_buf(&seed1_, sizeof(__m128i));
  131. arc4random_buf(&seed2_, sizeof(__m128i));
  132. const size_t number_of_sockets = 40;
  133. std::vector<int> ports2_0;
  134. for(size_t j = 0; j < number_of_sockets; ++j)
  135. {
  136. int port = 8000;
  137. ports2_0.push_back(port + j);
  138. }
  139. std::vector<int> ports2_1;
  140. for(size_t j = 0; j < number_of_sockets; ++j)
  141. {
  142. int port = 9000;
  143. ports2_1.push_back(port + j);
  144. }
  145. std::vector<socket_t> sockets_0;
  146. std::vector<socket_t> sockets_1;
  147. sockets_0.reserve(number_of_sockets + 1);
  148. sockets_1.reserve(number_of_sockets + 1);
  149. boost::asio::thread_pool pool2(number_of_sockets * 2);
  150. for(size_t j = 0; j < number_of_sockets; ++j)
  151. {
  152. boost::asio::post(pool2, std::bind(accept_conncections_from_Pb, std::ref(io_context), std::ref(sockets_1), ports2_1[j], j));
  153. }
  154. for(size_t j = 0; j < number_of_sockets; ++j)
  155. {
  156. boost::asio::post(pool2, std::bind(accept_conncections_from_Pb, std::ref(io_context), std::ref(sockets_0), ports2_0[j], j));
  157. }
  158. pool2.join();
  159. // int const in1_w_ { open( "party0_write_c", O_RDONLY ) };
  160. // size_t r = read(in1_w_, c, db_nitems * sizeof(c[0]));
  161. // if(r < 0) {
  162. // perror("Read error");
  163. // close(in1_w_);
  164. // return 1;
  165. // }
  166. // int const in2_w_ { open( "party1_write_d", O_RDONLY ) };
  167. // r = read(in2_w_, d, db_nitems * sizeof(d[0]));
  168. // if(r < 0) {
  169. // perror("Read error");
  170. // close(in2_w_);
  171. // return 1;
  172. // }
  173. // int const in1_w { open( "party0_write_flags_c", O_RDONLY ) };
  174. // r = read(in1_w, writing_c, db_nitems * sizeof(writing_c[0]));
  175. // if(r < 0) {
  176. // perror("Read error");
  177. // close(in1_w);
  178. // return 1;
  179. // }
  180. // int const in2_w { open( "party1_write_flags_d", O_RDONLY ) };
  181. // r = read(in2_w, writing_d, db_nitems * sizeof(writing_d[0]));
  182. // if(r < 0) {
  183. // perror("Read error");
  184. // close(in2_w);
  185. // return 1;
  186. // }
  187. int const in2 { open( "party1_read_flags_d", O_RDONLY ) };
  188. size_t r = read(in2, reading_d, db_nitems * sizeof(reading_d[0]));
  189. if(r < 0) {
  190. perror("Read error");
  191. close(in2);
  192. return 1;
  193. }
  194. int const in2_ { open( "party0_read_flags_c", O_RDONLY ) };
  195. r = read(in2_, reading_c, db_nitems * sizeof(reading_c[0]));
  196. if(r < 0) {
  197. perror("Read error");
  198. close(in2_);
  199. return 1;
  200. }
  201. //quick_fix_send_ones_share(sockets_0[0], sockets_1[0]);
  202. block<__m128i> seed0, seed1;
  203. arc4random_buf(&seed0, sizeof(block<__m128i>));
  204. arc4random_buf(&seed1, sizeof(block<__m128i>));
  205. X0 = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
  206. X1 = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
  207. boost::asio::write(sockets_0[0], boost::asio::buffer(&seed0, sizeof(seed0)));
  208. boost::asio::write(sockets_1[0], boost::asio::buffer(&seed1, sizeof(seed1)));
  209. for(size_t j = 0; j < db_nitems; ++j)
  210. {
  211. X0[j] = 0;
  212. X1[j] = 0;
  213. }
  214. DuORAM_Write * WriteP0_recv = new DuORAM_Write[number_of_ind_writes];
  215. DuORAM_Write * WriteP1_recv = new DuORAM_Write[number_of_ind_writes];
  216. DB_t * Gamma0_ = new DB_t[number_of_ind_writes];
  217. DB_t * Gamma1_ = new DB_t[number_of_ind_writes];
  218. DB_t * update_message0 = new DB_t[number_of_ind_writes];
  219. DB_t * update_message1 = new DB_t[number_of_ind_writes];
  220. DB_t * FCW = new DB_t[number_of_ind_writes];
  221. for(size_t w = 0; w < number_of_ind_writes; ++w)
  222. {
  223. int const in1_w { open( "party0_write_flags_c", O_RDONLY ) };
  224. size_t r = read(in1_w, writing_c, db_nitems * sizeof(writing_c[0]));
  225. if(r < 0) {
  226. perror("Read error");
  227. close(in1_w);
  228. return 1;
  229. }
  230. int const in2_w { open( "party1_write_flags_d", O_RDONLY ) };
  231. r = read(in2_w, writing_d, db_nitems * sizeof(writing_d[0]));
  232. if(r < 0) {
  233. perror("Read error");
  234. close(in2_w);
  235. return 1;
  236. }
  237. int const in1_w_ { open( "party0_write_c", O_RDONLY ) };
  238. r = read(in1_w_, c, db_nitems * sizeof(c[0]));
  239. if(r < 0) {
  240. perror("Read error");
  241. close(in1_w_);
  242. return 1;
  243. }
  244. int const in2_w_ { open( "party1_write_d", O_RDONLY ) };
  245. r = read(in2_w_, d, db_nitems * sizeof(d[0]));
  246. if(r < 0) {
  247. perror("Read error");
  248. close(in2_w_);
  249. return 1;
  250. }
  251. size_t rotate_by_ = WriteP0_recv[w].shift + WriteP1_recv[w].shift;
  252. auto [Gamma0, Gamma1] = generate_cancelation_terms(writing_c, writing_d, db_nitems, rotate_by_);
  253. Gamma0_[w] = Gamma0;
  254. Gamma1_[w] = Gamma1;
  255. boost::asio::read(sockets_0[0], boost::asio::buffer(&WriteP0_recv[w], sizeof(DuORAM_Write)));
  256. boost::asio::read(sockets_1[0], boost::asio::buffer(&WriteP1_recv[w], sizeof(DuORAM_Write)));
  257. boost::asio::write(sockets_0[1], boost::asio::buffer(&Gamma0_[w], sizeof(DB_t)));
  258. boost::asio::write(sockets_1[1], boost::asio::buffer(&Gamma1_[w], sizeof(DB_t)));
  259. boost::asio::read(sockets_0[2], boost::asio::buffer(&update_message0[w], sizeof(DB_t)));
  260. boost::asio::read(sockets_1[2], boost::asio::buffer(&update_message1[w], sizeof(DB_t)));
  261. FCW[w] = update_message0[w] + update_message1[w];
  262. }
  263. for(size_t w = 0; w < number_of_ind_writes; ++w)
  264. {
  265. size_t rotate_by_ = WriteP0_recv[w].shift + WriteP1_recv[w].shift;
  266. refresh_blinds(writing_c, writing_d, c, d, FCW[w], FCW[w], db_nitems, -rotate_by_);
  267. //#ifdef DEBUG
  268. for(size_t j = 0; j < db_nitems; ++j)
  269. {
  270. boost::asio::write(sockets_0[0], boost::asio::buffer(&X0[j], sizeof(X0[j]))); //DEBUG
  271. boost::asio::write(sockets_1[0], boost::asio::buffer(&X1[j], sizeof(X1[j]))); //DUBUG
  272. }
  273. //#endif
  274. }
  275. DB_t * Gamma0_reads = new DB_t[number_of_ind_reads];
  276. DB_t * Gamma1_reads = new DB_t[number_of_ind_reads];
  277. size_t * reads_shift_from_P0 = new size_t[number_of_ind_reads];
  278. size_t * reads_shift_from_P1 = new size_t[number_of_ind_reads];
  279. size_t * rotate = new size_t[number_of_ind_reads];
  280. boost::asio::read(sockets_0[3], boost::asio::buffer(reads_shift_from_P0, number_of_ind_reads * sizeof(size_t)));
  281. boost::asio::read(sockets_1[3], boost::asio::buffer(reads_shift_from_P1, number_of_ind_reads * sizeof(size_t)));
  282. for(size_t r = 0; r < number_of_ind_reads; ++r) rotate[r] = reads_shift_from_P0[r] + reads_shift_from_P1[r];
  283. for(size_t r = 0; r < number_of_ind_reads; ++r)
  284. {
  285. // // rotate_all(reading_b, reading_b_rotated, reading_c, reading_c_rotated, reading_d, reading_d_rotated, rotate[r], db_nitems);
  286. #ifdef DEBUG
  287. std::cout << "rotate[r] " << rotate[r] << std::endl;
  288. #endif
  289. auto [Gamma0, Gamma1] = generate_cancelation_terms(reading_c, reading_d, db_nitems, rotate[r]);
  290. Gamma0_reads[r] = Gamma0;
  291. Gamma1_reads[r] = Gamma1;
  292. }
  293. boost::asio::write(sockets_0[4], boost::asio::buffer(Gamma0_reads, number_of_ind_reads * sizeof(DB_t)));
  294. boost::asio::write(sockets_1[4], boost::asio::buffer(Gamma1_reads, number_of_ind_reads * sizeof(DB_t)));
  295. for(size_t d = 0; d < number_of_dep_reads; ++d)
  296. {
  297. size_t shifts0, shifts1, rotate;
  298. boost::asio::read(sockets_0[5], boost::asio::buffer(&shifts0, sizeof(shifts0)));
  299. boost::asio::read(sockets_1[5], boost::asio::buffer(&shifts1, sizeof(shifts1)));
  300. rotate = shifts0 + shifts1;
  301. //rotate_all(reading_b, reading_b_rotated, reading_c, reading_c_rotated, reading_d, reading_d_rotated, rotate, db_nitems);
  302. auto [Gamma0, Gamma1] = generate_cancelation_terms(reading_c, reading_d, db_nitems, rotate);
  303. boost::asio::write(sockets_0[6], boost::asio::buffer(&Gamma0, sizeof(Gamma0)));
  304. boost::asio::write(sockets_1[6], boost::asio::buffer(&Gamma1, sizeof(Gamma1)));
  305. }
  306. return 0;
  307. }