GCEvaComp.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package com.oblivm.backend.gc;
  2. import java.io.IOException;
  3. import java.util.Arrays;
  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.FakeOTReceiver;
  9. import com.oblivm.backend.ot.OTExtReceiver;
  10. import com.oblivm.backend.ot.OTPreprocessReceiver;
  11. import com.oblivm.backend.ot.OTReceiver;
  12. public abstract class GCEvaComp extends GCCompEnv {
  13. OTReceiver rcv;
  14. protected long gid = 0;
  15. public GCEvaComp(Network channel, Mode mode) {
  16. super(channel, Party.Bob, mode);
  17. if (Flag.FakeOT)
  18. rcv = new FakeOTReceiver(channel);
  19. else if (Flag.ProprocessOT)
  20. rcv = new OTPreprocessReceiver(channel);
  21. else
  22. rcv = new OTExtReceiver(channel);
  23. }
  24. public GCSignal inputOfAlice(boolean in) {
  25. Flag.sw.startOT();
  26. GCSignal signal = GCSignal.receive(channel);
  27. Flag.sw.stopOT();
  28. return signal;
  29. }
  30. public GCSignal inputOfBob(boolean in) {
  31. Flag.sw.startOT();
  32. GCSignal signal = null;
  33. try {
  34. signal = rcv.receive(in);
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. Flag.sw.stopOT();
  39. return signal;
  40. }
  41. public GCSignal[] inputOfBob(boolean[] x) {
  42. GCSignal[] ret = new GCSignal[x.length];
  43. for (int i = 0; i < x.length; i += Flag.OTBlockSize) {
  44. GCSignal[] tmp = inputOfBobInter(Arrays.copyOfRange(x, i, Math.min(i + Flag.OTBlockSize, x.length)));
  45. System.arraycopy(tmp, 0, ret, i, tmp.length);
  46. }
  47. return ret;
  48. }
  49. public GCSignal[] inputOfBobInter(boolean[] x) {
  50. Flag.sw.startOT();
  51. GCSignal[] signal = null;
  52. try {
  53. signal = rcv.receive(x);
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. Flag.sw.stopOT();
  58. return signal;
  59. }
  60. public GCSignal[] inputOfAlice(boolean[] x) {
  61. Flag.sw.startOT();
  62. GCSignal[] result = new GCSignal[x.length];
  63. for (int i = 0; i < x.length; ++i)
  64. result[i] = GCSignal.receive(channel);
  65. Flag.sw.stopOT();
  66. return result;
  67. }
  68. public boolean outputToAlice(GCSignal out) {
  69. if (!out.isPublic())
  70. out.send(channel);
  71. return false;
  72. }
  73. public boolean outputToBob(GCSignal out) {
  74. if (out.isPublic())
  75. return out.v;
  76. GCSignal lb = GCSignal.receive(channel);
  77. if (lb.equals(out))
  78. return false;
  79. else
  80. return true;
  81. }
  82. public boolean[] outputToAlice(GCSignal[] out) {
  83. boolean[] result = new boolean[out.length];
  84. for (int i = 0; i < result.length; ++i) {
  85. if (!out[i].isPublic())
  86. out[i].send(channel);
  87. }
  88. channel.flush();
  89. for (int i = 0; i < result.length; ++i)
  90. result[i] = false;
  91. return result;
  92. }
  93. public boolean[] outputToBob(GCSignal[] out) {
  94. boolean[] result = new boolean[out.length];
  95. for (int i = 0; i < result.length; ++i) {
  96. result[i] = outputToBob(out[i]);
  97. }
  98. return result;
  99. }
  100. public GCSignal xor(GCSignal a, GCSignal b) {
  101. if (a.isPublic() && b.isPublic())
  102. return ((a.v ^ b.v) ? new GCSignal(true) : new GCSignal(false));
  103. else if (a.isPublic())
  104. return a.v ? not(b) : b;
  105. else if (b.isPublic())
  106. return b.v ? not(a) : a;
  107. else
  108. return a.xor(b);
  109. }
  110. public GCSignal not(GCSignal a) {
  111. if (a.isPublic())
  112. return ((!a.v) ? new GCSignal(true) : new GCSignal(false));
  113. else {
  114. return a;
  115. }
  116. }
  117. }