GCGenComp.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package com.oblivm.backend.gc;
  2. import java.io.IOException;
  3. import com.oblivm.backend.flexsc.CompEnv;
  4. import com.oblivm.backend.flexsc.Flag;
  5. import com.oblivm.backend.flexsc.Mode;
  6. import com.oblivm.backend.flexsc.Party;
  7. import com.oblivm.backend.network.Network;
  8. import com.oblivm.backend.ot.FakeOTSender;
  9. import com.oblivm.backend.ot.OTExtSender;
  10. import com.oblivm.backend.ot.OTPreprocessSender;
  11. import com.oblivm.backend.ot.OTSender;
  12. public abstract class GCGenComp extends GCCompEnv {
  13. static public GCSignal R = null;
  14. static {
  15. R = GCSignal.freshLabel(CompEnv.rnd);
  16. R.setLSB();
  17. }
  18. OTSender snd;
  19. protected long gid = 0;
  20. public GCGenComp(Network channel, Mode mode) {
  21. super(channel, Party.Alice, mode);
  22. if (Flag.FakeOT)
  23. snd = new FakeOTSender(80, channel);
  24. else if (Flag.ProprocessOT)
  25. snd = new OTPreprocessSender(80, channel);
  26. else
  27. snd = new OTExtSender(80, channel);
  28. }
  29. public static GCSignal[] genPairForLabel(Mode mode) {
  30. GCSignal[] label = new GCSignal[2];
  31. if (mode != Mode.OFFLINE || !Flag.offline)
  32. label[0] = GCSignal.freshLabel(rnd);
  33. if (mode == Mode.OFFLINE) {
  34. if (Flag.offline) {
  35. label[0] = new GCSignal(com.oblivm.backend.gc.offline.GCGen.fread.read(10));
  36. } else
  37. label[0].send(com.oblivm.backend.gc.offline.GCGen.fout);
  38. }
  39. label[1] = R.xor(label[0]);
  40. return label;
  41. }
  42. public static GCSignal[] genPair() {
  43. GCSignal[] label = new GCSignal[2];
  44. label[0] = GCSignal.freshLabel(rnd);
  45. label[1] = R.xor(label[0]);
  46. return label;
  47. }
  48. public GCSignal inputOfAlice(boolean in) {
  49. Flag.sw.startOT();
  50. GCSignal[] label = genPairForLabel(mode);
  51. Flag.sw.startOTIO();
  52. label[in ? 1 : 0].send(channel);
  53. flush();
  54. Flag.sw.stopOTIO();
  55. Flag.sw.stopOT();
  56. return label[0];
  57. }
  58. public GCSignal inputOfBob(boolean in) {
  59. Flag.sw.startOT();
  60. GCSignal[] label = genPairForLabel(mode);
  61. try {
  62. snd.send(label);
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. Flag.sw.stopOT();
  67. return label[0];
  68. }
  69. public GCSignal[] inputOfAlice(boolean[] x) {
  70. Flag.sw.startOT();
  71. GCSignal[][] pairs = new GCSignal[x.length][2];
  72. GCSignal[] result = new GCSignal[x.length];
  73. for (int i = 0; i < x.length; ++i) {
  74. pairs[i] = genPairForLabel(mode);
  75. result[i] = pairs[i][0];
  76. }
  77. Flag.sw.startOTIO();
  78. for (int i = 0; i < x.length; ++i)
  79. pairs[i][x[i] ? 1 : 0].send(channel);
  80. flush();
  81. Flag.sw.stopOTIO();
  82. Flag.sw.stopOT();
  83. return result;
  84. }
  85. public GCSignal[] inputOfBob(boolean[] x) {
  86. Flag.sw.startOT();
  87. GCSignal[][] pair = new GCSignal[x.length][2];
  88. for (int i = 0; i < x.length; ++i)
  89. pair[i] = genPairForLabel(mode);
  90. try {
  91. snd.send(pair);
  92. } catch (IOException e) {
  93. // TODO Auto-generated catch block
  94. e.printStackTrace();
  95. }
  96. GCSignal[] result = new GCSignal[x.length];
  97. for (int i = 0; i < x.length; ++i)
  98. result[i] = pair[i][0];
  99. Flag.sw.stopOT();
  100. return result;
  101. }
  102. protected boolean gatesRemain = false;
  103. public boolean outputToAlice(GCSignal out) {
  104. if (gatesRemain) {
  105. gatesRemain = false;
  106. flush();
  107. }
  108. if (out.isPublic())
  109. return out.v;
  110. GCSignal lb = GCSignal.receive(channel);
  111. if (lb.equals(out))
  112. return false;
  113. else if (lb.equals(R.xor(out)))
  114. return true;
  115. try {
  116. throw new Exception("bad label at final output.");
  117. } catch (Exception e) {
  118. // TODO Auto-generated catch block
  119. e.printStackTrace();
  120. }
  121. return false;
  122. }
  123. public boolean outputToBob(GCSignal out) {
  124. if (!out.isPublic())
  125. out.send(channel);
  126. return false;
  127. }
  128. public boolean[] outputToBob(GCSignal[] out) {
  129. boolean[] result = new boolean[out.length];
  130. for (int i = 0; i < result.length; ++i) {
  131. if (!out[i].isPublic())
  132. out[i].send(channel);
  133. }
  134. flush();
  135. for (int i = 0; i < result.length; ++i)
  136. result[i] = false;
  137. return result;
  138. }
  139. public boolean[] outputToAlice(GCSignal[] out) {
  140. boolean[] result = new boolean[out.length];
  141. for (int i = 0; i < result.length; ++i) {
  142. result[i] = outputToAlice(out[i]);
  143. }
  144. return result;
  145. }
  146. public GCSignal xor(GCSignal a, GCSignal b) {
  147. if (a.isPublic() && b.isPublic())
  148. return new GCSignal(a.v ^ b.v);
  149. else if (a.isPublic())
  150. return a.v ? not(b) : new GCSignal(b);
  151. else if (b.isPublic())
  152. return b.v ? not(a) : new GCSignal(a);
  153. else {
  154. return a.xor(b);
  155. }
  156. }
  157. public GCSignal not(GCSignal a) {
  158. if (a.isPublic())
  159. return new GCSignal(!a.v);
  160. else
  161. return R.xor(a);
  162. }
  163. }