PreEviction.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package protocols.precomputation;
  2. import com.oblivm.backend.flexsc.CompEnv;
  3. import com.oblivm.backend.gc.GCSignal;
  4. import com.oblivm.backend.gc.regular.GCEva;
  5. import com.oblivm.backend.gc.regular.GCGen;
  6. import com.oblivm.backend.network.Network;
  7. import communication.Communication;
  8. import crypto.Crypto;
  9. import gc.GCRoute;
  10. import gc.GCUtil;
  11. import oram.Forest;
  12. import oram.Metadata;
  13. import protocols.Protocol;
  14. import protocols.struct.Party;
  15. import protocols.struct.PreData;
  16. import util.M;
  17. import util.P;
  18. import util.Timer;
  19. import util.Util;
  20. public class PreEviction extends Protocol {
  21. private int pid = P.EVI;
  22. public PreEviction(Communication con1, Communication con2) {
  23. super(con1, con2);
  24. }
  25. public void runE(PreData predata, boolean firstTree, int d, int w, Timer timer) {
  26. if (firstTree)
  27. return;
  28. timer.start(pid, M.offline_comp);
  29. // GC
  30. int logW = (int) Math.ceil(Math.log(w + 1) / Math.log(2));
  31. predata.evict_LiKeyPairs = GCUtil.genKeyPairs(d - 1);
  32. GCSignal[] LiZeroKeys = GCUtil.getZeroKeys(predata.evict_LiKeyPairs);
  33. predata.evict_E_feKeyPairs = new GCSignal[d][][];
  34. predata.evict_C_feKeyPairs = new GCSignal[d][][];
  35. GCSignal[][] E_feZeroKeys = new GCSignal[d][];
  36. GCSignal[][] C_feZeroKeys = new GCSignal[d][];
  37. predata.evict_E_labelKeyPairs = new GCSignal[d][w][][];
  38. predata.evict_C_labelKeyPairs = new GCSignal[d][w][][];
  39. GCSignal[][][] E_labelZeroKeys = new GCSignal[d][w][];
  40. GCSignal[][][] C_labelZeroKeys = new GCSignal[d][w][];
  41. predata.evict_deltaKeyPairs = new GCSignal[d][][];
  42. GCSignal[][] deltaZeroKeys = new GCSignal[d][];
  43. for (int i = 0; i < d; i++) {
  44. predata.evict_E_feKeyPairs[i] = GCUtil.genKeyPairs(w);
  45. predata.evict_C_feKeyPairs[i] = GCUtil.genKeyPairs(w);
  46. E_feZeroKeys[i] = GCUtil.getZeroKeys(predata.evict_E_feKeyPairs[i]);
  47. C_feZeroKeys[i] = GCUtil.getZeroKeys(predata.evict_C_feKeyPairs[i]);
  48. predata.evict_deltaKeyPairs[i] = GCUtil.genKeyPairs(logW);
  49. deltaZeroKeys[i] = GCUtil.getZeroKeys(predata.evict_deltaKeyPairs[i]);
  50. for (int j = 0; j < w; j++) {
  51. predata.evict_E_labelKeyPairs[i][j] = GCUtil.genKeyPairs(d - 1);
  52. predata.evict_C_labelKeyPairs[i][j] = GCUtil.genKeyPairs(d - 1);
  53. E_labelZeroKeys[i][j] = GCUtil.getZeroKeys(predata.evict_E_labelKeyPairs[i][j]);
  54. C_labelZeroKeys[i][j] = GCUtil.getZeroKeys(predata.evict_C_labelKeyPairs[i][j]);
  55. }
  56. }
  57. Network channel = new Network(null, con1);
  58. CompEnv<GCSignal> gen = new GCGen(channel, timer, pid, M.offline_write);
  59. GCSignal[][][] outZeroKeys = new GCRoute<GCSignal>(gen, d, w).routing(LiZeroKeys, E_feZeroKeys, C_feZeroKeys,
  60. E_labelZeroKeys, C_labelZeroKeys, deltaZeroKeys);
  61. ((GCGen) gen).sendLastSetGTT();
  62. predata.evict_tiOutKeyHashes = new byte[d][][];
  63. predata.evict_targetOutKeyPairs = new GCSignal[d][][];
  64. for (int i = 0; i < d; i++) {
  65. predata.evict_tiOutKeyHashes[i] = GCUtil.genOutKeyHashes(outZeroKeys[1][i]);
  66. predata.evict_targetOutKeyPairs[i] = GCUtil.recoverOutKeyPairs(outZeroKeys[0][i]);
  67. }
  68. timer.start(pid, M.offline_write);
  69. con2.write(predata.evict_C_feKeyPairs);
  70. con2.write(predata.evict_C_labelKeyPairs);
  71. con1.write(predata.evict_tiOutKeyHashes);
  72. con1.write(predata.evict_targetOutKeyPairs);
  73. timer.stop(pid, M.offline_write);
  74. // Permutation
  75. predata.evict_pi = Util.randomPermutation(d, Crypto.sr);
  76. predata.evict_delta = new byte[d][];
  77. predata.evict_rho = new byte[d][];
  78. predata.evict_delta_p = new int[d][];
  79. predata.evict_rho_p = new int[d][];
  80. for (int i = 0; i < d; i++) {
  81. predata.evict_delta[i] = Util.nextBytes((logW + 7) / 8, Crypto.sr);
  82. predata.evict_rho[i] = Util.nextBytes((logW + 7) / 8, Crypto.sr);
  83. predata.evict_delta_p[i] = Util.getXorPermutation(predata.evict_delta[i], logW);
  84. predata.evict_rho_p[i] = Util.getXorPermutation(predata.evict_rho[i], logW);
  85. }
  86. timer.start(pid, M.offline_write);
  87. con2.write(predata.evict_pi);
  88. con2.write(predata.evict_delta);
  89. con2.write(predata.evict_rho);
  90. con2.write(predata.evict_delta_p);
  91. con2.write(predata.evict_rho_p);
  92. timer.stop(pid, M.offline_write);
  93. // PermuteTarget
  94. PrePermuteTarget prepermutetarget = new PrePermuteTarget(con1, con2);
  95. prepermutetarget.runE(predata, d, timer);
  96. // PermuteIndex
  97. PrePermuteIndex prepermuteindex = new PrePermuteIndex(con1, con2);
  98. prepermuteindex.runE(predata, d, w, timer);
  99. // SSXOT
  100. PreSSXOT pressxot = new PreSSXOT(con1, con2, 1);
  101. pressxot.runE(predata, timer);
  102. timer.stop(pid, M.offline_comp);
  103. }
  104. public long runD(PreData predata, boolean firstTree, int d, int w, int[] tupleParam, Timer timer) {
  105. if (firstTree)
  106. return 0;
  107. timer.start(pid, M.offline_comp);
  108. // GC
  109. int logW = (int) Math.ceil(Math.log(w + 1) / Math.log(2));
  110. GCSignal[] LiZeroKeys = GCUtil.genEmptyKeys(d - 1);
  111. GCSignal[][] E_feZeroKeys = new GCSignal[d][];
  112. GCSignal[][] C_feZeroKeys = new GCSignal[d][];
  113. GCSignal[][][] E_labelZeroKeys = new GCSignal[d][w][];
  114. GCSignal[][][] C_labelZeroKeys = new GCSignal[d][w][];
  115. GCSignal[][] deltaZeroKeys = new GCSignal[d][];
  116. for (int i = 0; i < d; i++) {
  117. E_feZeroKeys[i] = GCUtil.genEmptyKeys(w);
  118. C_feZeroKeys[i] = GCUtil.genEmptyKeys(w);
  119. deltaZeroKeys[i] = GCUtil.genEmptyKeys(logW);
  120. for (int j = 0; j < w; j++) {
  121. E_labelZeroKeys[i][j] = GCUtil.genEmptyKeys(d - 1);
  122. C_labelZeroKeys[i][j] = GCUtil.genEmptyKeys(d - 1);
  123. }
  124. }
  125. Network channel = new Network(con1, null);
  126. CompEnv<GCSignal> eva = new GCEva(channel, timer, pid, M.offline_read);
  127. predata.evict_gcroute = new GCRoute<GCSignal>(eva, d, w);
  128. predata.evict_gcroute.routing(LiZeroKeys, E_feZeroKeys, C_feZeroKeys, E_labelZeroKeys, C_labelZeroKeys,
  129. deltaZeroKeys);
  130. ((GCEva) eva).receiveLastSetGTT();
  131. eva.setEvaluate();
  132. timer.start(pid, M.offline_read);
  133. predata.evict_tiOutKeyHashes = con1.readTripleByteArray();
  134. predata.evict_targetOutKeyPairs = con1.readTripleGCSignalArray();
  135. timer.stop(pid, M.offline_read);
  136. // PermuteTarget
  137. PrePermuteTarget prepermutetarget = new PrePermuteTarget(con1, con2);
  138. prepermutetarget.runD(predata, d, timer);
  139. // PermuteIndex
  140. PrePermuteIndex prepermuteindex = new PrePermuteIndex(con1, con2);
  141. prepermuteindex.runD(predata, timer);
  142. // SSXOT
  143. int W = (int) Math.pow(2, logW);
  144. PreSSXOT pressxot = new PreSSXOT(con1, con2, 1);
  145. pressxot.runD(predata, d * W, d * W, tupleParam, timer);
  146. timer.stop(pid, M.offline_comp);
  147. return eva.numOfAnds;
  148. }
  149. public void runC(PreData predata, boolean firstTree, Timer timer) {
  150. if (firstTree)
  151. return;
  152. timer.start(pid, M.offline_comp);
  153. // GC
  154. timer.start(pid, M.offline_read);
  155. predata.evict_C_feKeyPairs = con1.readTripleGCSignalArray();
  156. predata.evict_C_labelKeyPairs = con1.readQuadGCSignalArray();
  157. // Permutation
  158. predata.evict_pi = con1.readIntArray();
  159. predata.evict_delta = con1.readDoubleByteArray();
  160. predata.evict_rho = con1.readDoubleByteArray();
  161. predata.evict_delta_p = con1.readDoubleIntArray();
  162. predata.evict_rho_p = con1.readDoubleIntArray();
  163. timer.stop(pid, M.offline_read);
  164. // PermuteTarget
  165. PrePermuteTarget prepermutetarget = new PrePermuteTarget(con1, con2);
  166. prepermutetarget.runC(predata, timer);
  167. // PermuteIndex
  168. PrePermuteIndex prepermuteindex = new PrePermuteIndex(con1, con2);
  169. prepermuteindex.runC(predata, timer);
  170. // SSXOT
  171. PreSSXOT pressxot = new PreSSXOT(con1, con2, 1);
  172. pressxot.runC(predata, timer);
  173. timer.stop(pid, M.offline_comp);
  174. }
  175. @Override
  176. public void run(Party party, Metadata md, Forest forest) {
  177. }
  178. }