online.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <bsd/stdlib.h> // arc4random_buf
  2. #include "online.hpp"
  3. #include "mpcops.hpp"
  4. void online_comp(MPCIO &mpcio, int num_threads, char **args)
  5. {
  6. nbits_t nbits = VALUE_BITS;
  7. if (*args) {
  8. nbits = atoi(*args);
  9. }
  10. size_t memsize = 13;
  11. MPCTIO tio(mpcio, 0);
  12. value_t *A = new value_t[memsize];
  13. arc4random_buf(A, memsize*sizeof(value_t));
  14. A[5] &= 1;
  15. A[8] &= 1;
  16. printf("A:\n"); for (size_t i=0; i<memsize; ++i) printf("%3lu: %016lX\n", i, A[i]);
  17. std::vector<coro_t> coroutines;
  18. coroutines.emplace_back(
  19. [&](yield_t &yield) {
  20. mpc_mul(tio, yield, A[2], A[0], A[1], nbits);
  21. });
  22. coroutines.emplace_back(
  23. [&](yield_t &yield) {
  24. mpc_valuemul(tio, yield, A[4], A[3], nbits);
  25. });
  26. coroutines.emplace_back(
  27. [&](yield_t &yield) {
  28. mpc_flagmult(tio, yield, A[7], A[5], A[6], nbits);
  29. });
  30. coroutines.emplace_back(
  31. [&](yield_t &yield) {
  32. mpc_oswap(tio, yield, A[9], A[10], A[8], nbits);
  33. });
  34. coroutines.emplace_back(
  35. [&](yield_t &yield) {
  36. mpc_xs_to_as(tio, yield, A[12], A[11], nbits);
  37. });
  38. run_coroutines(tio, coroutines);
  39. printf("\n");
  40. printf("A:\n"); for (size_t i=0; i<memsize; ++i) printf("%3lu: %016lX\n", i, A[i]);
  41. // Check the answers
  42. if (mpcio.player) {
  43. tio.queue_peer(A, memsize*sizeof(value_t));
  44. tio.send();
  45. } else {
  46. value_t *B = new value_t[memsize];
  47. value_t *S = new value_t[memsize];
  48. tio.recv_peer(B, memsize*sizeof(value_t));
  49. for(size_t i=0; i<memsize; ++i) S[i] = A[i]+B[i];
  50. printf("S:\n"); for (size_t i=0; i<memsize; ++i) printf("%3lu: %016lX\n", i, S[i]);
  51. printf("\n%016lx\n", S[0]*S[1]-S[2]);
  52. printf("%016lx\n", (A[3]*B[3])-S[4]);
  53. delete[] B;
  54. delete[] S;
  55. }
  56. delete[] A;
  57. }
  58. void online_server(MPCServerIO &mpcio, int num_threads, char **args)
  59. {
  60. }