Shift.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package pir;
  2. import communication.Communication;
  3. import crypto.Crypto;
  4. import exceptions.NoSuchPartyException;
  5. import oram.Forest;
  6. import oram.Metadata;
  7. import protocols.Protocol;
  8. import protocols.struct.Party;
  9. import protocols.struct.PreData;
  10. import util.M;
  11. import util.P;
  12. import util.Timer;
  13. import util.Util;
  14. public class Shift extends Protocol {
  15. private int pid = P.Shift;
  16. public Shift(Communication con1, Communication con2) {
  17. super(con1, con2);
  18. }
  19. public byte[][] runE(PreData predata, byte[][] x, int s, Timer timer) {
  20. timer.start(pid, M.offline_comp);
  21. int n = x.length;
  22. int l = x[0].length;
  23. byte[][] q = new byte[n][];
  24. for (int i = 0; i < n; i++)
  25. q[i] = Util.nextBytes(l, Crypto.sr);
  26. timer.start(pid, M.offline_write);
  27. con2.write(q);
  28. timer.stop(pid, M.offline_write);
  29. timer.start(pid, M.offline_read);
  30. byte[][] r = con1.readDoubleByteArray();
  31. timer.stop(pid, M.offline_read);
  32. timer.stop(pid, M.offline_comp);
  33. // ----------------------------------------- //
  34. timer.start(pid, M.online_comp);
  35. timer.start(pid, M.online_read);
  36. byte[][] z = con2.readDoubleByteArray(pid);
  37. timer.stop(pid, M.online_read);
  38. byte[][] b = new byte[n][];
  39. for (int i = 0; i < n; i++) {
  40. Util.setXor(z[i], r[i]);
  41. Util.setXor(z[i], x[i]);
  42. }
  43. for (int i = 0; i < n; i++) {
  44. b[i] = z[(i + s) % n];
  45. Util.setXor(b[i], q[i]);
  46. }
  47. timer.stop(pid, M.online_comp);
  48. return b;
  49. }
  50. public void runD(PreData predata, int s, int n, int l, Timer timer) {
  51. timer.start(pid, M.offline_comp);
  52. byte[][] r = new byte[n][];
  53. for (int i = 0; i < n; i++)
  54. r[i] = Util.nextBytes(l, Crypto.sr);
  55. timer.start(pid, M.offline_write);
  56. con1.write(r);
  57. timer.stop(pid, M.offline_write);
  58. timer.start(pid, M.offline_read);
  59. byte[][] p = con2.readDoubleByteArray();
  60. timer.stop(pid, M.offline_read);
  61. for (int i = 0; i < n; i++)
  62. Util.setXor(p[i], r[i]);
  63. timer.stop(pid, M.offline_comp);
  64. // ----------------------------------------- //
  65. timer.start(pid, M.online_comp);
  66. byte[][] a = new byte[n][];
  67. for (int i = 0; i < n; i++)
  68. a[i] = p[(i + s) % n];
  69. timer.start(pid, M.online_write);
  70. con2.write(pid, a);
  71. timer.stop(pid, M.online_write);
  72. timer.stop(pid, M.online_comp);
  73. return;
  74. }
  75. public byte[][] runC(PreData predata, byte[][] x, Timer timer) {
  76. timer.start(pid, M.offline_comp);
  77. int n = x.length;
  78. int l = x[0].length;
  79. byte[][] p = new byte[n][];
  80. for (int i = 0; i < n; i++)
  81. p[i] = Util.nextBytes(l, Crypto.sr);
  82. timer.start(pid, M.offline_write);
  83. con2.write(p);
  84. timer.stop(pid, M.offline_write);
  85. timer.start(pid, M.offline_read);
  86. byte[][] q = con1.readDoubleByteArray();
  87. timer.stop(pid, M.offline_read);
  88. timer.stop(pid, M.offline_comp);
  89. // ----------------------------------------- //
  90. timer.start(pid, M.online_comp);
  91. for (int i = 0; i < n; i++)
  92. Util.setXor(p[i], x[i]);
  93. timer.start(pid, M.online_write);
  94. con1.write(pid, p);
  95. timer.stop(pid, M.online_write);
  96. timer.start(pid, M.online_read);
  97. byte[][] a = con2.readDoubleByteArray(pid);
  98. timer.stop(pid, M.online_read);
  99. for (int i = 0; i < n; i++)
  100. Util.setXor(a[i], q[i]);
  101. timer.stop(pid, M.online_comp);
  102. return a;
  103. }
  104. @Override
  105. public void run(Party party, Metadata md, Forest[] forest) {
  106. Timer timer = new Timer();
  107. PreData predata = new PreData();
  108. for (int j = 0; j < 100; j++) {
  109. int n = 500;
  110. int l = 50;
  111. byte[][] x = new byte[n][l];
  112. for (int i = 0; i < n; i++) {
  113. Crypto.sr.nextBytes(x[i]);
  114. }
  115. int s = Crypto.sr.nextInt(n);
  116. if (party == Party.Eddie) {
  117. con1.write(s);
  118. byte[][] y1 = this.runE(predata, x, s, timer);
  119. byte[][] x2 = con2.readDoubleByteArray();
  120. byte[][] y2 = con2.readDoubleByteArray();
  121. for (int i = 0; i < n; i++) {
  122. Util.setXor(x2[i], x[i]);
  123. Util.setXor(y2[i], y1[i]);
  124. }
  125. boolean fail = false;
  126. for (int i = 0; i < n; i++) {
  127. if (!Util.equal(y2[i], x2[(i + s) % n])) {
  128. System.err.println(j + ": Shift test failed");
  129. fail = true;
  130. break;
  131. }
  132. }
  133. if (!fail)
  134. System.out.println(j + ": Shift test passed");
  135. } else if (party == Party.Debbie) {
  136. s = con1.readInt();
  137. this.runD(predata, s, n, l, timer);
  138. } else if (party == Party.Charlie) {
  139. byte[][] y2 = this.runC(predata, x, timer);
  140. con1.write(x);
  141. con1.write(y2);
  142. } else {
  143. throw new NoSuchPartyException(party + "");
  144. }
  145. }
  146. }
  147. @Override
  148. public void run(Party party, Metadata md, Forest forest) {
  149. }
  150. }