SSXOT.java 5.5 KB

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