PrePermuteIndex.java 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package protocols.precomputation;
  2. import communication.Communication;
  3. import crypto.Crypto;
  4. import oram.Forest;
  5. import oram.Metadata;
  6. import protocols.Protocol;
  7. import protocols.struct.Party;
  8. import protocols.struct.PreData;
  9. import util.M;
  10. import util.P;
  11. import util.Timer;
  12. import util.Util;
  13. public class PrePermuteIndex extends Protocol {
  14. private int pid = P.PI;
  15. public PrePermuteIndex(Communication con1, Communication con2) {
  16. super(con1, con2);
  17. }
  18. public void runE(PreData predata, int d, int w, Timer timer) {
  19. timer.start(pid, M.offline_comp);
  20. int logW = (int) Math.ceil(Math.log(w + 1) / Math.log(2));
  21. predata.pi_p = new byte[d][];
  22. predata.pi_r = new byte[d][];
  23. predata.pi_a = new byte[d][];
  24. for (int i = 0; i < d; i++) {
  25. predata.pi_p[i] = Util.nextBytes((logW + 7) / 8, Crypto.sr);
  26. predata.pi_r[i] = Util.nextBytes((logW + 7) / 8, Crypto.sr);
  27. predata.pi_a[i] = Util.xor(predata.pi_p[i], predata.pi_r[i]);
  28. }
  29. predata.pi_a = Util.permute(predata.pi_a, predata.evict_pi);
  30. timer.start(pid, M.offline_write);
  31. con1.write(predata.pi_p);
  32. con1.write(predata.pi_a);
  33. con2.write(predata.pi_r);
  34. timer.stop(pid, M.offline_write);
  35. timer.stop(pid, M.offline_comp);
  36. }
  37. public void runD(PreData predata, Timer timer) {
  38. timer.start(pid, M.offline_read);
  39. predata.pi_p = con1.readDoubleByteArray();
  40. predata.pi_a = con1.readDoubleByteArray();
  41. timer.stop(pid, M.offline_read);
  42. }
  43. public void runC(PreData predata, Timer timer) {
  44. timer.start(pid, M.offline_read);
  45. predata.pi_r = con1.readDoubleByteArray();
  46. timer.stop(pid, M.offline_read);
  47. }
  48. @Override
  49. public void run(Party party, Metadata md, Forest forest) {
  50. }
  51. }