PostProcessT.java 6.9 KB

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