PostProcessT.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package protocols;
  2. import java.math.BigInteger;
  3. import communication.Communication;
  4. import crypto.Crypto;
  5. import exceptions.AccessException;
  6. import exceptions.NoSuchPartyException;
  7. import measure.M;
  8. import measure.P;
  9. import measure.Timer;
  10. import oram.Forest;
  11. import oram.Metadata;
  12. import oram.Tree;
  13. import oram.Tuple;
  14. import util.Util;
  15. public class PostProcessT extends Protocol {
  16. public PostProcessT(Communication con1, Communication con2) {
  17. super(con1, con2);
  18. }
  19. public Tuple runE(PreData predata, Tuple Ti, boolean lastTree, Timer timer) {
  20. timer.start(P.PPT, M.online_comp);
  21. if (lastTree) {
  22. Tuple out = new Tuple(Ti);
  23. Util.setXor(out.getL(), predata.ppt_Li);
  24. timer.stop(P.PPT, M.online_comp);
  25. return out;
  26. }
  27. // step 1
  28. timer.start(P.PPT, M.online_read);
  29. int delta = con2.readObject();
  30. timer.stop(P.PPT, M.online_read);
  31. // step 3
  32. int twoTauPow = predata.ppt_s.length;
  33. byte[][] e = new byte[twoTauPow][];
  34. for (int i = 0; i < twoTauPow; i++)
  35. e[i] = predata.ppt_s[(i + delta) % twoTauPow];
  36. byte[] e_all = new byte[twoTauPow * e[0].length];
  37. for (int i = 0; i < twoTauPow; i++)
  38. System.arraycopy(e[i], 0, e_all, i * e[0].length, e[0].length);
  39. Tuple out = new Tuple(Ti);
  40. Util.setXor(out.getL(), predata.ppt_Li);
  41. Util.setXor(out.getA(), e_all);
  42. timer.stop(P.PPT, M.online_comp);
  43. return out;
  44. }
  45. public void runD() {
  46. }
  47. public Tuple runC(PreData predata, Tuple Ti, byte[] Li, byte[] Lip1, int j2, boolean lastTree, Timer timer) {
  48. timer.start(P.PPT, M.online_comp);
  49. if (lastTree) {
  50. Tuple out = new Tuple(Ti);
  51. Util.setXor(out.getL(), Util.xor(Li, predata.ppt_Li));
  52. timer.stop(P.PPT, M.online_comp);
  53. return out;
  54. }
  55. // step 1
  56. int twoTauPow = predata.ppt_r.length;
  57. int delta = (predata.ppt_alpha - j2 + twoTauPow) % twoTauPow;
  58. timer.start(P.PPT, M.online_write);
  59. con1.write(delta);
  60. timer.stop(P.PPT, M.online_write);
  61. // step 2
  62. byte[][] c = new byte[twoTauPow][];
  63. for (int i = 0; i < twoTauPow; i++)
  64. c[i] = predata.ppt_r[(i + delta) % twoTauPow];
  65. c[j2] = Util.xor(Util.xor(c[j2], Lip1), predata.ppt_Lip1);
  66. byte[] c_all = new byte[twoTauPow * Lip1.length];
  67. for (int i = 0; i < twoTauPow; i++)
  68. System.arraycopy(c[i], 0, c_all, i * Lip1.length, Lip1.length);
  69. Tuple out = new Tuple(Ti);
  70. Util.setXor(out.getL(), Util.xor(Li, predata.ppt_Li));
  71. Util.setXor(out.getA(), c_all);
  72. timer.stop(P.PPT, M.online_comp);
  73. return out;
  74. }
  75. // for testing correctness
  76. @Override
  77. public void run(Party party, Metadata md, Forest forest) {
  78. int records = 5;
  79. int repeat = 5;
  80. int tau = md.getTau();
  81. int numTrees = md.getNumTrees();
  82. long numInsert = md.getNumInsertRecords();
  83. int addrBits = md.getAddrBits();
  84. Timer timer = new Timer();
  85. sanityCheck();
  86. System.out.println();
  87. for (int i = 0; i < records; i++) {
  88. long N = Util.nextLong(numInsert, Crypto.sr);
  89. for (int j = 0; j < repeat; j++) {
  90. System.out.println("Test: " + i + " " + j);
  91. System.out.println("N=" + BigInteger.valueOf(N).toString(2));
  92. byte[] Li = new byte[0];
  93. PreData prev = null;
  94. for (int ti = 0; ti < numTrees; ti++) {
  95. long Ni_value = Util.getSubBits(N, addrBits, addrBits - md.getNBitsOfTree(ti));
  96. long Nip1_pr_value = Util.getSubBits(N, addrBits - md.getNBitsOfTree(ti),
  97. Math.max(addrBits - md.getNBitsOfTree(ti) - tau, 0));
  98. byte[] Ni = Util.longToBytes(Ni_value, md.getNBytesOfTree(ti));
  99. byte[] Nip1_pr = Util.longToBytes(Nip1_pr_value, (tau + 7) / 8);
  100. PreData predata = new PreData();
  101. PreAccess preaccess = new PreAccess(con1, con2);
  102. Access access = new Access(con1, con2);
  103. PrePostProcessT prepostprocesst = new PrePostProcessT(con1, con2);
  104. if (party == Party.Eddie) {
  105. Tree OTi = forest.getTree(ti);
  106. int numTuples = (OTi.getD() - 1) * OTi.getW() + OTi.getStashSize();
  107. preaccess.runE(predata, OTi, numTuples, timer);
  108. byte[] sE_Ni = Util.nextBytes(Ni.length, Crypto.sr);
  109. byte[] sD_Ni = Util.xor(Ni, sE_Ni);
  110. con1.write(sD_Ni);
  111. byte[] sE_Nip1_pr = Util.nextBytes(Nip1_pr.length, Crypto.sr);
  112. byte[] sD_Nip1_pr = Util.xor(Nip1_pr, sE_Nip1_pr);
  113. con1.write(sD_Nip1_pr);
  114. OutAccess outaccess = access.runE(predata, OTi, sE_Ni, sE_Nip1_pr, timer);
  115. if (ti == numTrees - 1)
  116. con2.write(N);
  117. prepostprocesst.runE(predata, timer);
  118. Tuple Ti_prime = runE(predata, outaccess.E_Ti, ti == numTrees - 1, timer);
  119. Ti_prime.setXor(con2.readObject());
  120. byte[] Li_prime = Util.xor(predata.ppt_Li, con2.read());
  121. byte[] Lip1_prime = Util.xor(predata.ppt_Lip1, con2.read());
  122. int j2 = con2.readObject();
  123. Tuple Ti = outaccess.E_Ti.xor(con2.readObject());
  124. if (!Util.equal(Ti.getF(), Ti_prime.getF()))
  125. System.err.println("PPT test failed");
  126. else if (!Util.equal(Ti.getN(), Ti_prime.getN()))
  127. System.err.println("PPT test failed");
  128. else if (!Util.equal(Li_prime, Ti_prime.getL()))
  129. System.err.println("PPT test failed");
  130. else if (!Util.equal(Lip1_prime,
  131. Ti_prime.getSubA(j2 * Lip1_prime.length, (j2 + 1) * Lip1_prime.length)))
  132. System.err.println("PPT test failed");
  133. else
  134. System.out.println("PPT test passed");
  135. } else if (party == Party.Debbie) {
  136. Tree OTi = forest.getTree(ti);
  137. preaccess.runD(predata, timer);
  138. byte[] sD_Ni = con1.read();
  139. byte[] sD_Nip1_pr = con1.read();
  140. access.runD(predata, OTi, sD_Ni, sD_Nip1_pr, timer);
  141. prepostprocesst.runD(predata, prev, md.getLBytesOfTree(ti), md.getAlBytesOfTree(ti), tau,
  142. timer);
  143. runD();
  144. } else if (party == Party.Charlie) {
  145. preaccess.runC(timer);
  146. System.out.println("L" + ti + "=" + new BigInteger(1, Li).toString(2));
  147. OutAccess outaccess = access.runC(md, ti, Li, timer);
  148. prepostprocesst.runC(predata, prev, md.getLBytesOfTree(ti), md.getAlBytesOfTree(ti), timer);
  149. Tuple Ti_prime = runC(predata, outaccess.C_Ti, Li, outaccess.C_Lip1, outaccess.C_j2,
  150. ti == numTrees - 1, timer);
  151. Li = outaccess.C_Lip1;
  152. if (ti == numTrees - 1) {
  153. N = con1.readObject();
  154. long data = new BigInteger(1, outaccess.C_Ti.getA()).longValue();
  155. if (N == data) {
  156. System.out.println("Access passed");
  157. System.out.println();
  158. } else {
  159. throw new AccessException("Access failed");
  160. }
  161. }
  162. con1.write(Ti_prime);
  163. con1.write(predata.ppt_Li);
  164. con1.write(predata.ppt_Lip1);
  165. con1.write(outaccess.C_j2);
  166. con1.write(outaccess.C_Ti);
  167. } else {
  168. throw new NoSuchPartyException(party + "");
  169. }
  170. prev = predata;
  171. }
  172. }
  173. }
  174. // timer.print();
  175. }
  176. }