PreEviction.java 6.7 KB

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