GCEva.java 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package com.oblivm.backend.gc.regular;
  2. import java.util.Arrays;
  3. import com.oblivm.backend.flexsc.Flag;
  4. import com.oblivm.backend.flexsc.Mode;
  5. import com.oblivm.backend.gc.GCEvaComp;
  6. import com.oblivm.backend.gc.GCSignal;
  7. import com.oblivm.backend.network.Network;
  8. import util.Timer;
  9. public class GCEva extends GCEvaComp {
  10. Garbler gb;
  11. GCSignal[][] gtt = new GCSignal[2][2];
  12. boolean evaluate = false;
  13. GCEva next = null;
  14. GCEva curr = null;
  15. Timer timer = null;
  16. int p;
  17. int m;
  18. public GCEva(Network channel) {
  19. super(channel, Mode.REAL);
  20. gb = new Garbler();
  21. gtt[0][0] = GCSignal.ZERO;
  22. gtt[0][1] = GCSignal.newInstance(new byte[10]);
  23. gtt[1][0] = GCSignal.newInstance(new byte[10]);
  24. gtt[1][1] = GCSignal.newInstance(new byte[10]);
  25. }
  26. public GCEva(Network channel, Timer timer, int p, int m) {
  27. super(channel, Mode.REAL);
  28. gb = new Garbler();
  29. gtt[0][0] = GCSignal.ZERO;
  30. gtt[0][1] = GCSignal.newInstance(new byte[10]);
  31. gtt[1][0] = GCSignal.newInstance(new byte[10]);
  32. gtt[1][1] = GCSignal.newInstance(new byte[10]);
  33. this.timer = timer;
  34. this.p = p;
  35. this.m = m;
  36. }
  37. public void setEvaluate() {
  38. evaluate = true;
  39. curr = this;
  40. }
  41. private void receiveGTT() {
  42. if (timer == null) {
  43. try {
  44. Flag.sw.startGCIO();
  45. GCSignal.receive(channel, gtt[0][1]);
  46. GCSignal.receive(channel, gtt[1][0]);
  47. GCSignal.receive(channel, gtt[1][1]);
  48. // gtt[1][0] = GCSignal.receive(channel);
  49. // gtt[1][1] = GCSignal.receive(channel);
  50. Flag.sw.stopGCIO();
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. System.exit(1);
  54. }
  55. } else {
  56. timer.start(p, m);
  57. byte[] rows = channel.sender.read();
  58. timer.stop(p, m);
  59. gtt[0][1].bytes = Arrays.copyOfRange(rows, 0, GCSignal.len);
  60. gtt[1][0].bytes = Arrays.copyOfRange(rows, GCSignal.len, GCSignal.len * 2);
  61. gtt[1][1].bytes = Arrays.copyOfRange(rows, GCSignal.len * 2, rows.length);
  62. /*
  63. * timer.start(p, m); GCSignal[] rows = channel.sender.readObject();
  64. * timer.stop(p, m);
  65. *
  66. * gtt[0][1].bytes = rows[0].bytes; gtt[1][0].bytes = rows[1].bytes;
  67. * gtt[1][1].bytes = rows[2].bytes;
  68. */
  69. }
  70. }
  71. public GCSignal and(GCSignal a, GCSignal b) {
  72. Flag.sw.startGC();
  73. GCSignal res;
  74. if (a.isPublic() && b.isPublic())
  75. res = new GCSignal(a.v && b.v);
  76. else if (a.isPublic())
  77. res = a.v ? b : new GCSignal(false);
  78. else if (b.isPublic())
  79. res = b.v ? a : new GCSignal(false);
  80. else {
  81. res = new GCSignal(new byte[10]);
  82. if (!evaluate) {
  83. ++numOfAnds;
  84. if (curr == null) {
  85. curr = this;
  86. } else {
  87. curr.next = new GCEva(channel, timer, p, m);
  88. curr = curr.next;
  89. }
  90. curr.receiveGTT();
  91. } else {
  92. int i0 = a.getLSB();
  93. int i1 = b.getLSB();
  94. gb.dec(a, b, gid, curr.gtt[i0][i1], res);
  95. curr = curr.next;
  96. gid++;
  97. }
  98. }
  99. Flag.sw.stopGC();
  100. return res;
  101. }
  102. }