GCUtil.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package gc;
  2. import java.math.BigInteger;
  3. import com.oblivm.backend.gc.GCGenComp;
  4. import com.oblivm.backend.gc.GCSignal;
  5. import crypto.Crypto;
  6. import exceptions.LengthNotMatchException;
  7. import oram.Tuple;
  8. import util.Util;
  9. public class GCUtil {
  10. public static GCSignal[] genEmptyKeys(int n) {
  11. GCSignal[] keys = new GCSignal[n];
  12. for (int i = 0; i < n; i++)
  13. keys[i] = new GCSignal(new byte[GCSignal.len]);
  14. return keys;
  15. }
  16. public static GCSignal[][] genKeyPairs(int n) {
  17. GCSignal[][] pairs = new GCSignal[n][];
  18. for (int i = 0; i < n; i++)
  19. pairs[i] = GCGenComp.genPair();
  20. return pairs;
  21. }
  22. public static GCSignal[] getZeroKeys(GCSignal[][] pairs) {
  23. GCSignal[] keys = new GCSignal[pairs.length];
  24. for (int i = 0; i < keys.length; i++)
  25. keys[i] = pairs[i][0];
  26. return keys;
  27. }
  28. public static GCSignal[] revSelectKeys(GCSignal[][] pairs, byte[] input) {
  29. BigInteger in = new BigInteger(1, input);
  30. GCSignal[] out = new GCSignal[pairs.length];
  31. for (int i = 0; i < pairs.length; i++)
  32. out[i] = pairs[i][in.testBit(i) ? 1 : 0];
  33. return out;
  34. }
  35. public static GCSignal[] selectKeys(GCSignal[][] pairs, byte[] input) {
  36. BigInteger in = new BigInteger(1, input);
  37. GCSignal[] out = new GCSignal[pairs.length];
  38. for (int i = 0; i < pairs.length; i++)
  39. out[i] = pairs[i][in.testBit(pairs.length - 1 - i) ? 1 : 0];
  40. return out;
  41. }
  42. public static GCSignal[][] selectLabelKeys(GCSignal[][][] labelPairs, Tuple[] tuples) {
  43. if (tuples.length != labelPairs.length)
  44. throw new LengthNotMatchException(tuples.length + " != " + labelPairs.length);
  45. GCSignal[][] out = new GCSignal[tuples.length][];
  46. for (int i = 0; i < tuples.length; i++)
  47. out[i] = revSelectKeys(labelPairs[i], tuples[i].getL());
  48. return out;
  49. }
  50. public static GCSignal[] selectFeKeys(GCSignal[][] pairs, Tuple[] tuples) {
  51. if (tuples.length != pairs.length)
  52. throw new LengthNotMatchException(tuples.length + " != " + pairs.length);
  53. GCSignal[] out = new GCSignal[pairs.length];
  54. for (int i = 0; i < pairs.length; i++)
  55. out[i] = pairs[i][new BigInteger(tuples[i].getF()).testBit(0) ? 1 : 0];
  56. return out;
  57. }
  58. public static synchronized byte[][] genOutKeyHashes(GCSignal[] outZeroKeys) {
  59. byte[][] hashes = new byte[outZeroKeys.length][];
  60. for (int i = 0; i < outZeroKeys.length; i++) {
  61. hashes[i] = Crypto.sha1.digest(outZeroKeys[i].bytes);
  62. }
  63. return hashes;
  64. }
  65. public static BigInteger evaOutKeys(GCSignal[] outKeys, byte[][] genHashes) {
  66. if (outKeys.length != genHashes.length)
  67. throw new LengthNotMatchException(outKeys.length + " != " + genHashes.length);
  68. byte[][] evaHashes = genOutKeyHashes(outKeys);
  69. BigInteger output = BigInteger.ZERO;
  70. for (int i = 0; i < outKeys.length; i++) {
  71. if (outKeys[i].isPublic()) {
  72. if (outKeys[i].v)
  73. output = output.setBit(i);
  74. } else if (!Util.equal(genHashes[i], evaHashes[i])) {
  75. output = output.setBit(i);
  76. }
  77. }
  78. return output;
  79. }
  80. public static GCSignal[][] recoverOutKeyPairs(GCSignal[] outZeroKeys) {
  81. GCSignal[][] pairs = new GCSignal[outZeroKeys.length][2];
  82. for (int i = 0; i < outZeroKeys.length; i++) {
  83. pairs[i][0] = outZeroKeys[i];
  84. pairs[i][1] = GCGenComp.R.xor(pairs[i][0]);
  85. }
  86. return pairs;
  87. }
  88. public static synchronized byte[] hashAll(GCSignal[] keys) {
  89. for (int i = 0; i < keys.length; i++)
  90. Crypto.sha1.update(keys[i].bytes);
  91. return Crypto.sha1.digest();
  92. }
  93. }