CompEnv.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Copyright (C) 2014 by Xiao Shaun Wang <wangxiao@cs.umd.edu>
  2. package com.oblivm.backend.flexsc;
  3. import java.security.NoSuchAlgorithmException;
  4. import java.security.SecureRandom;
  5. import java.security.Security;
  6. import com.oblivm.backend.network.Network;
  7. import com.oblivm.backend.rand.ISAACProvider;
  8. import com.oblivm.backend.util.Utils;
  9. public abstract class CompEnv<T> {
  10. public long numOfAnds = 0;
  11. public static SecureRandom rnd;
  12. static {
  13. Security.addProvider(new ISAACProvider());
  14. try {
  15. rnd = SecureRandom.getInstance("ISAACRandom");
  16. } catch (NoSuchAlgorithmException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. @SuppressWarnings("rawtypes")
  21. public static CompEnv getEnv(Mode mode, Party p, Network w) {
  22. if (mode == Mode.REAL)
  23. if (p == Party.Bob)
  24. return new com.oblivm.backend.gc.regular.GCEva(w);
  25. else
  26. return new com.oblivm.backend.gc.regular.GCGen(w);
  27. else if (mode == Mode.OPT)
  28. if (p == Party.Bob)
  29. return new com.oblivm.backend.gc.halfANDs.GCEva(w);
  30. else
  31. return new com.oblivm.backend.gc.halfANDs.GCGen(w);
  32. else if (mode == Mode.VERIFY)
  33. return new CVCompEnv(w, p);
  34. else if (mode == Mode.COUNT)
  35. return new PMCompEnv(w, p);
  36. else if (mode == Mode.OFFLINE) {
  37. if (p == Party.Bob)
  38. return new com.oblivm.backend.gc.offline.GCEva(w);
  39. else
  40. return new com.oblivm.backend.gc.offline.GCGen(w);
  41. } else {
  42. try {
  43. throw new Exception("not a supported Mode!");
  44. } catch (Exception e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }
  48. return null;
  49. }
  50. }
  51. public Network channel;
  52. public Party party;
  53. public Mode mode;
  54. public CompEnv(Network w, Party p, Mode m) {
  55. this.channel = w;
  56. this.mode = m;
  57. this.party = p;
  58. }
  59. public abstract T inputOfAlice(boolean in);
  60. public abstract T inputOfBob(boolean in);
  61. public abstract boolean outputToAlice(T out);
  62. public abstract boolean outputToBob(T out);
  63. public abstract T[] inputOfAlice(boolean[] in);
  64. public abstract T[] inputOfBob(boolean[] in);
  65. public T[][] inputOfAlice(boolean[][] in) {
  66. boolean[] flattened = Utils.flatten(in);
  67. T[] res = inputOfAlice(flattened);
  68. T[][] unflattened = newTArray(in.length, in[0].length);
  69. Utils.unflatten(res, unflattened);
  70. return unflattened;
  71. }
  72. public T[][] inputOfBob(boolean[][] in) {
  73. boolean[] flattened = Utils.flatten(in);
  74. T[] res = inputOfBob(flattened);
  75. T[][] unflattened = newTArray(in.length, in[0].length);
  76. Utils.unflatten(res, unflattened);
  77. return unflattened;
  78. }
  79. public T[][][] inputOfAlice(boolean[][][] in) {
  80. boolean[] flattened = Utils.flatten(in);
  81. T[] res = inputOfAlice(flattened);
  82. T[][][] unflattened = newTArray(in.length, in[0].length, in[0][0].length);
  83. Utils.unflatten(res, unflattened);
  84. return unflattened;
  85. }
  86. public T[][][] inputOfBob(boolean[][][] in) {
  87. boolean[] flattened = Utils.flatten(in);
  88. T[] res = inputOfBob(flattened);
  89. T[][][] unflattened = newTArray(in.length, in[0].length, in[0][0].length);
  90. Utils.unflatten(res, unflattened);
  91. return unflattened;
  92. }
  93. public abstract boolean[] outputToAlice(T[] out);
  94. public abstract boolean[] outputToBob(T[] out);
  95. public abstract T and(T a, T b);
  96. public abstract void setEvaluate();
  97. public abstract T xor(T a, T b);
  98. public abstract T not(T a);
  99. public abstract T ONE();
  100. public abstract T ZERO();
  101. public abstract T[] newTArray(int len);
  102. public abstract T[][] newTArray(int d1, int d2);
  103. public abstract T[][][] newTArray(int d1, int d2, int d3);
  104. public abstract T newT(boolean v);
  105. public Party getParty() {
  106. return party;
  107. }
  108. public void flush() {
  109. channel.flush();
  110. }
  111. public Mode getMode() {
  112. return mode;
  113. }
  114. }