Access.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package protocols;
  2. import java.math.BigInteger;
  3. import java.util.Arrays;
  4. import org.apache.commons.lang3.ArrayUtils;
  5. import communication.Communication;
  6. import exceptions.NoSuchPartyException;
  7. import oram.Bucket;
  8. import oram.Forest;
  9. import oram.Metadata;
  10. import oram.Tree;
  11. import oram.Tuple;
  12. import util.Util;
  13. public class Access extends Protocol {
  14. public Access(Communication con1, Communication con2) {
  15. super(con1, con2);
  16. }
  17. public void runE(PreData predata, Tree OTi, byte[] Li, byte[] Nip1, byte[] Ni, byte[] Nip1_pr) {
  18. // step 1
  19. Bucket[] pathBuckets = OTi.getBucketsOnPath(new BigInteger(1, Li).longValue());
  20. // Object[] objArray = Util.permute(pathBuckets, predata.access_sigma);
  21. // pathBuckets = Arrays.copyOf(objArray, objArray.length,
  22. // Bucket[].class);
  23. for (int i = 0; i < pathBuckets.length; i++) {
  24. pathBuckets[i].setXor(predata.access_p[i]);
  25. }
  26. // step 3
  27. int numTuples = OTi.getStashSize() + (pathBuckets.length - 1) * OTi.getW();
  28. byte[][] a = new byte[numTuples][];
  29. byte[][] m = new byte[numTuples][];
  30. int tupleCnt = 0;
  31. for (int i = 0; i < pathBuckets.length; i++)
  32. for (int j = 0; j < pathBuckets[i].getNumTuples(); j++) {
  33. Tuple tuple = pathBuckets[i].getTuple(j);
  34. a[tupleCnt] = ArrayUtils.addAll(tuple.getF(), tuple.getN());
  35. m[tupleCnt] = tuple.getA();
  36. tupleCnt++;
  37. }
  38. for (int i = 0; i < numTuples; i++) {
  39. for (int j = 0; j < Ni.length; j++)
  40. a[i][a[i].length - 1 - j] ^= Ni[Ni.length - 1 - j];
  41. }
  42. SSCOT sscot = new SSCOT(con1, con2);
  43. sscot.runE(predata, m, a);
  44. }
  45. public void runD(PreData predata, Tree OTi, byte[] Li, byte[] Nip1, byte[] Ni, byte[] Nip1_pr) {
  46. // step 1
  47. Bucket[] pathBuckets = OTi.getBucketsOnPath(new BigInteger(1, Li).longValue());
  48. // Object[] objArray = Util.permute(pathBuckets, predata.access_sigma);
  49. // pathBuckets = Arrays.copyOf(objArray, objArray.length,
  50. // Bucket[].class);
  51. for (int i = 0; i < pathBuckets.length; i++) {
  52. pathBuckets[i].setXor(predata.access_p[i]);
  53. }
  54. // step 2
  55. con2.write(pathBuckets);
  56. con2.write(Nip1);
  57. // step 3
  58. int numTuples = OTi.getStashSize() + (pathBuckets.length - 1) * OTi.getW();
  59. byte[][] b = new byte[numTuples][];
  60. int tupleCnt = 0;
  61. for (int i = 0; i < pathBuckets.length; i++)
  62. for (int j = 0; j < pathBuckets[i].getNumTuples(); j++) {
  63. Tuple tuple = pathBuckets[i].getTuple(j);
  64. b[tupleCnt] = ArrayUtils.addAll(tuple.getF(), tuple.getN());
  65. tupleCnt++;
  66. }
  67. for (int i = 0; i < numTuples; i++) {
  68. b[i][0] ^= 1;
  69. for (int j = 0; j < Ni.length; j++)
  70. b[i][b[i].length - 1 - j] ^= Ni[Ni.length - 1 - j];
  71. }
  72. SSCOT sscot = new SSCOT(con1, con2);
  73. sscot.runD(predata, b);
  74. }
  75. public void runC() {
  76. // step 2
  77. Object[] objArray = con2.readObjectArray();
  78. Bucket[] pathBuckets = Arrays.copyOf(objArray, objArray.length, Bucket[].class);
  79. byte[] Nip1 = con2.read();
  80. // step 3
  81. SSCOT sscot = new SSCOT(con1, con2);
  82. sscot.runC();
  83. }
  84. @Override
  85. public void run(Party party, Metadata md, Forest forest) {
  86. // for (int j = 0; j < 100; j++) {
  87. PreData predata = new PreData();
  88. PreAccess preaccess = new PreAccess(con1, con2);
  89. int treeIndex = 2;
  90. Tree tree = null;
  91. int numBuckets = 0;
  92. if (forest != null) {
  93. tree = forest.getTree(treeIndex);
  94. numBuckets = tree.getD();
  95. }
  96. byte[] Li = new byte[] { 0 };
  97. if (party == Party.Eddie) {
  98. preaccess.runE(predata, tree, numBuckets);
  99. runE(predata, tree, Li, Li, Li, Li);
  100. } else if (party == Party.Debbie) {
  101. preaccess.runD(predata);
  102. runD(predata, tree, Li, Li, Li, Li);
  103. } else if (party == Party.Charlie) {
  104. preaccess.runC();
  105. runC();
  106. } else {
  107. throw new NoSuchPartyException(party + "");
  108. }
  109. // }
  110. }
  111. }