SSXOT.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package subprotocols;
  2. import java.math.BigInteger;
  3. import communication.Communication;
  4. import crypto.Crypto;
  5. import exceptions.NoSuchPartyException;
  6. import oram.Forest;
  7. import oram.Metadata;
  8. import oram.Tuple;
  9. import protocols.Protocol;
  10. import struct.Party;
  11. import util.M;
  12. import util.Util;
  13. // TODO: change XOT to do 2 rounds and 2|path| bndw
  14. public class SSXOT extends Protocol {
  15. public SSXOT(Communication con1, Communication con2) {
  16. super(con1, con2);
  17. online_band = all.SSXOT_on;
  18. offline_band = all.SSXOT_off;
  19. timer = all.SSXOT;
  20. }
  21. public Tuple[] runE(Tuple[] m, int[] tupleParam) {
  22. timer.start(M.offline_comp);
  23. int n = m.length;
  24. int[] E_pi = Util.randomPermutation(n, Crypto.sr_DE);
  25. Tuple[] E_r = new Tuple[n];
  26. for (int i = 0; i < n; i++) {
  27. E_r[i] = new Tuple(tupleParam[0], tupleParam[1], tupleParam[2], tupleParam[3], Crypto.sr_DE);
  28. }
  29. timer.stop(M.offline_comp);
  30. /////////////////////////////////////////////////////////////////////
  31. timer.start(M.online_comp);
  32. // step 1
  33. Tuple[] a = new Tuple[m.length];
  34. for (int i = 0; i < m.length; i++)
  35. a[i] = m[E_pi[i]].xor(E_r[i]);
  36. timer.start(M.online_write);
  37. con2.write(online_band, a);
  38. timer.stop(M.online_write);
  39. timer.start(M.online_read);
  40. a = con2.readTupleArrayAndDec();
  41. // step 2
  42. int[] j = con1.readIntArrayAndDec();
  43. Tuple[] p = con1.readTupleArrayAndDec();
  44. timer.stop(M.online_read);
  45. // step 3
  46. Tuple[] z = new Tuple[j.length];
  47. for (int i = 0; i < j.length; i++)
  48. z[i] = a[j[i]].xor(p[i]);
  49. timer.stop(M.online_comp);
  50. return z;
  51. }
  52. public void runD(int n, int k, int[] tupleParam, int[] index) {
  53. timer.start(M.offline_comp);
  54. Tuple[] delta = new Tuple[k];
  55. for (int i = 0; i < k; i++)
  56. delta[i] = new Tuple(tupleParam[0], tupleParam[1], tupleParam[2], tupleParam[3], Crypto.sr);
  57. int[] E_pi = Util.randomPermutation(n, Crypto.sr_DE);
  58. int[] C_pi = Util.randomPermutation(n, Crypto.sr_CD);
  59. int[] E_pi_ivs = Util.inversePermutation(E_pi);
  60. int[] C_pi_ivs = Util.inversePermutation(C_pi);
  61. Tuple[] E_r = new Tuple[n];
  62. Tuple[] C_r = new Tuple[n];
  63. for (int i = 0; i < n; i++) {
  64. E_r[i] = new Tuple(tupleParam[0], tupleParam[1], tupleParam[2], tupleParam[3], Crypto.sr_DE);
  65. C_r[i] = new Tuple(tupleParam[0], tupleParam[1], tupleParam[2], tupleParam[3], Crypto.sr_CD);
  66. }
  67. timer.stop(M.offline_comp);
  68. ////////////////////////////////////////////////////////////////////
  69. timer.start(M.online_comp);
  70. // step 2
  71. k = index.length;
  72. int[] E_j = new int[k];
  73. int[] C_j = new int[k];
  74. Tuple[] E_p = new Tuple[k];
  75. Tuple[] C_p = new Tuple[k];
  76. for (int i = 0; i < k; i++) {
  77. E_j[i] = E_pi_ivs[index[i]];
  78. C_j[i] = C_pi_ivs[index[i]];
  79. E_p[i] = E_r[E_j[i]].xor(delta[i]);
  80. C_p[i] = C_r[C_j[i]].xor(delta[i]);
  81. }
  82. timer.start(M.online_write);
  83. con2.write(online_band, E_j);
  84. con2.write(online_band, E_p);
  85. con1.write(online_band, C_j);
  86. con1.write(online_band, C_p);
  87. timer.stop(M.online_write);
  88. timer.stop(M.online_comp);
  89. }
  90. public Tuple[] runC(Tuple[] m, int[] tupleParam) {
  91. timer.start(M.offline_comp);
  92. int n = m.length;
  93. int[] C_pi = Util.randomPermutation(n, Crypto.sr_CD);
  94. Tuple[] C_r = new Tuple[n];
  95. for (int i = 0; i < n; i++) {
  96. C_r[i] = new Tuple(tupleParam[0], tupleParam[1], tupleParam[2], tupleParam[3], Crypto.sr_CD);
  97. }
  98. timer.stop(M.offline_comp);
  99. ////////////////////////////////////////////////////////////
  100. timer.start(M.online_comp);
  101. // step 1
  102. Tuple[] a = new Tuple[m.length];
  103. for (int i = 0; i < m.length; i++)
  104. a[i] = m[C_pi[i]].xor(C_r[i]);
  105. timer.start(M.online_write);
  106. con1.write(online_band, a);
  107. timer.stop(M.online_write);
  108. timer.start(M.online_read);
  109. a = con1.readTupleArrayAndDec();
  110. // step 2
  111. int[] j = con2.readIntArrayAndDec();
  112. Tuple[] p = con2.readTupleArrayAndDec();
  113. timer.stop(M.online_read);
  114. // step 3
  115. Tuple[] z = new Tuple[j.length];
  116. for (int i = 0; i < j.length; i++)
  117. z[i] = a[j[i]].xor(p[i]);
  118. timer.stop(M.online_comp);
  119. return z;
  120. }
  121. @Override
  122. public void run(Party party, Metadata md, Forest[] forest) {
  123. for (int j = 0; j < 100; j++) {
  124. int n = 100;
  125. int k = Crypto.sr.nextInt(50) + 50;
  126. int[] index = Util.randomPermutation(k, Crypto.sr);
  127. int[] tupleParam = new int[] { 1, 2, 3, 4 };
  128. Tuple[] E_m = new Tuple[n];
  129. Tuple[] C_m = new Tuple[n];
  130. for (int i = 0; i < n; i++) {
  131. E_m[i] = new Tuple(tupleParam[0], tupleParam[1], tupleParam[2], tupleParam[3], Crypto.sr);
  132. C_m[i] = new Tuple(tupleParam[0], tupleParam[1], tupleParam[2], tupleParam[3], null);
  133. }
  134. if (party == Party.Eddie) {
  135. Tuple[] E_out_m = runE(E_m, tupleParam);
  136. con2.write(E_m);
  137. con2.write(E_out_m);
  138. } else if (party == Party.Debbie) {
  139. runD(n, k, tupleParam, index);
  140. con2.write(index);
  141. } else if (party == Party.Charlie) {
  142. Tuple[] C_out_m = runC(C_m, tupleParam);
  143. index = con2.readIntArray();
  144. E_m = con1.readTupleArray();
  145. Tuple[] E_out_m = con1.readTupleArray();
  146. boolean pass = true;
  147. for (int i = 0; i < index.length; i++) {
  148. int input = new BigInteger(1, E_m[index[i]].getA()).intValue();
  149. int output = new BigInteger(1, Util.xor(E_out_m[i].getA(), C_out_m[i].getA())).intValue();
  150. if (input != output) {
  151. System.err.println("SSXOT test failed");
  152. pass = false;
  153. break;
  154. }
  155. }
  156. if (pass)
  157. System.out.println("SSXOT test passed");
  158. } else {
  159. throw new NoSuchPartyException(party + "");
  160. }
  161. }
  162. }
  163. @Override
  164. public void run(Party party, Metadata md, Forest forest) {
  165. }
  166. }