PreUpdateRoot.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 gc.GCUpdateRoot;
  9. import gc.GCUtil;
  10. import oram.Forest;
  11. import oram.Metadata;
  12. import protocols.Protocol;
  13. import protocols.struct.Party;
  14. import protocols.struct.PreData;
  15. import util.M;
  16. import util.P;
  17. import util.Timer;
  18. public class PreUpdateRoot extends Protocol {
  19. private int pid = P.UR;
  20. public PreUpdateRoot(Communication con1, Communication con2) {
  21. super(con1, con2);
  22. }
  23. public void runE(PreData predata, boolean firstTree, int sw, int lBits, Timer timer) {
  24. if (firstTree)
  25. return;
  26. timer.start(pid, M.offline_comp);
  27. int sLogW = (int) Math.ceil(Math.log(sw) / Math.log(2));
  28. predata.ur_j1KeyPairs = GCUtil.genKeyPairs(sLogW);
  29. predata.ur_LiKeyPairs = GCUtil.genKeyPairs(lBits);
  30. predata.ur_E_feKeyPairs = GCUtil.genKeyPairs(sw);
  31. predata.ur_C_feKeyPairs = GCUtil.genKeyPairs(sw);
  32. GCSignal[] j1ZeroKeys = GCUtil.getZeroKeys(predata.ur_j1KeyPairs);
  33. GCSignal[] LiZeroKeys = GCUtil.getZeroKeys(predata.ur_LiKeyPairs);
  34. GCSignal[] E_feZeroKeys = GCUtil.getZeroKeys(predata.ur_E_feKeyPairs);
  35. GCSignal[] C_feZeroKeys = GCUtil.getZeroKeys(predata.ur_C_feKeyPairs);
  36. predata.ur_E_labelKeyPairs = new GCSignal[sw][][];
  37. predata.ur_C_labelKeyPairs = new GCSignal[sw][][];
  38. GCSignal[][] E_labelZeroKeys = new GCSignal[sw][];
  39. GCSignal[][] C_labelZeroKeys = new GCSignal[sw][];
  40. for (int i = 0; i < sw; i++) {
  41. predata.ur_E_labelKeyPairs[i] = GCUtil.genKeyPairs(lBits);
  42. predata.ur_C_labelKeyPairs[i] = GCUtil.genKeyPairs(lBits);
  43. E_labelZeroKeys[i] = GCUtil.getZeroKeys(predata.ur_E_labelKeyPairs[i]);
  44. C_labelZeroKeys[i] = GCUtil.getZeroKeys(predata.ur_C_labelKeyPairs[i]);
  45. }
  46. Network channel = new Network(null, con1);
  47. CompEnv<GCSignal> gen = new GCGen(channel, timer, pid, M.offline_write);
  48. GCSignal[][] outZeroKeys = new GCUpdateRoot<GCSignal>(gen, lBits + 1, sw).rootFindDeepestAndEmpty(j1ZeroKeys,
  49. LiZeroKeys, E_feZeroKeys, C_feZeroKeys, E_labelZeroKeys, C_labelZeroKeys);
  50. ((GCGen) gen).sendLastSetGTT();
  51. predata.ur_outKeyHashes = new byte[outZeroKeys.length][][];
  52. for (int i = 0; i < outZeroKeys.length; i++)
  53. predata.ur_outKeyHashes[i] = GCUtil.genOutKeyHashes(outZeroKeys[i]);
  54. timer.start(pid, M.offline_write);
  55. con2.write(predata.ur_C_feKeyPairs);
  56. con2.write(predata.ur_C_labelKeyPairs);
  57. con1.write(predata.ur_outKeyHashes);
  58. timer.stop(pid, M.offline_write);
  59. PreSSXOT pressxot = new PreSSXOT(con1, con2, 0);
  60. pressxot.runE(predata, timer);
  61. timer.stop(pid, M.offline_comp);
  62. }
  63. public long runD(PreData predata, boolean firstTree, int sw, int lBits, int[] tupleParam, Timer timer) {
  64. if (firstTree)
  65. return 0;
  66. timer.start(pid, M.offline_comp);
  67. int logSW = (int) Math.ceil(Math.log(sw) / Math.log(2));
  68. GCSignal[] j1ZeroKeys = GCUtil.genEmptyKeys(logSW);
  69. GCSignal[] LiZeroKeys = GCUtil.genEmptyKeys(lBits);
  70. GCSignal[] E_feZeroKeys = GCUtil.genEmptyKeys(sw);
  71. GCSignal[] C_feZeroKeys = GCUtil.genEmptyKeys(sw);
  72. GCSignal[][] E_labelZeroKeys = new GCSignal[sw][];
  73. GCSignal[][] C_labelZeroKeys = new GCSignal[sw][];
  74. for (int i = 0; i < sw; i++) {
  75. E_labelZeroKeys[i] = GCUtil.genEmptyKeys(lBits);
  76. C_labelZeroKeys[i] = GCUtil.genEmptyKeys(lBits);
  77. }
  78. Network channel = new Network(con1, null);
  79. CompEnv<GCSignal> eva = new GCEva(channel, timer, pid, M.offline_read);
  80. predata.ur_gcur = new GCUpdateRoot<GCSignal>(eva, lBits + 1, sw);
  81. predata.ur_gcur.rootFindDeepestAndEmpty(j1ZeroKeys, LiZeroKeys, E_feZeroKeys, C_feZeroKeys, E_labelZeroKeys,
  82. C_labelZeroKeys);
  83. ((GCEva) eva).receiveLastSetGTT();
  84. eva.setEvaluate();
  85. timer.start(pid, M.offline_read);
  86. predata.ur_outKeyHashes = con1.readTripleByteArray();
  87. timer.stop(pid, M.offline_read);
  88. PreSSXOT pressxot = new PreSSXOT(con1, con2, 0);
  89. pressxot.runD(predata, sw + 1, sw, tupleParam, timer);
  90. timer.stop(pid, M.offline_comp);
  91. return eva.numOfAnds;
  92. }
  93. public void runC(PreData predata, boolean firstTree, Timer timer) {
  94. if (firstTree)
  95. return;
  96. timer.start(pid, M.offline_comp);
  97. timer.start(pid, M.offline_read);
  98. predata.ur_C_feKeyPairs = con1.readDoubleGCSignalArray();
  99. predata.ur_C_labelKeyPairs = con1.readTripleGCSignalArray();
  100. timer.stop(pid, M.offline_read);
  101. PreSSXOT pressxot = new PreSSXOT(con1, con2, 0);
  102. pressxot.runC(predata, timer);
  103. timer.stop(pid, M.offline_comp);
  104. }
  105. @Override
  106. public void run(Party party, Metadata md, Forest forest) {
  107. }
  108. }