GCEva.java 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package com.oblivm.backend.gc.regular;
  2. import com.oblivm.backend.flexsc.Flag;
  3. import com.oblivm.backend.flexsc.Mode;
  4. import com.oblivm.backend.gc.GCEvaComp;
  5. import com.oblivm.backend.gc.GCSignal;
  6. import com.oblivm.backend.network.Network;
  7. import util.Timer;
  8. public class GCEva extends GCEvaComp {
  9. Garbler gb;
  10. GCSignal[][] gtt = new GCSignal[2][2];
  11. boolean evaluate = false;
  12. GCEva next = null;
  13. GCEva curr = null;
  14. Timer timer = null;
  15. int p;
  16. int m;
  17. public GCEva(Network channel) {
  18. super(channel, Mode.REAL);
  19. gb = new Garbler();
  20. gtt[0][0] = GCSignal.ZERO;
  21. gtt[0][1] = GCSignal.newInstance(new byte[10]);
  22. gtt[1][0] = GCSignal.newInstance(new byte[10]);
  23. gtt[1][1] = GCSignal.newInstance(new byte[10]);
  24. }
  25. public GCEva(Network channel, Timer timer, int p, int m) {
  26. super(channel, Mode.REAL);
  27. gb = new Garbler();
  28. gtt[0][0] = GCSignal.ZERO;
  29. gtt[0][1] = GCSignal.newInstance(new byte[10]);
  30. gtt[1][0] = GCSignal.newInstance(new byte[10]);
  31. gtt[1][1] = GCSignal.newInstance(new byte[10]);
  32. this.timer = timer;
  33. this.p = p;
  34. this.m = m;
  35. }
  36. public void setEvaluate() {
  37. evaluate = true;
  38. curr = this;
  39. }
  40. private void receiveGTT() {
  41. try {
  42. if (timer != null)
  43. timer.start(p, m);
  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. if (timer != null)
  52. timer.stop(p, m);
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. System.exit(1);
  56. }
  57. }
  58. public GCSignal and(GCSignal a, GCSignal b) {
  59. Flag.sw.startGC();
  60. GCSignal res;
  61. if (a.isPublic() && b.isPublic())
  62. res = new GCSignal(a.v && b.v);
  63. else if (a.isPublic())
  64. res = a.v ? b : new GCSignal(false);
  65. else if (b.isPublic())
  66. res = b.v ? a : new GCSignal(false);
  67. else {
  68. res = new GCSignal(new byte[10]);
  69. if (!evaluate) {
  70. ++numOfAnds;
  71. if (curr == null) {
  72. curr = this;
  73. } else {
  74. curr.next = new GCEva(channel);
  75. curr = curr.next;
  76. }
  77. curr.receiveGTT();
  78. } else {
  79. int i0 = a.getLSB();
  80. int i1 = b.getLSB();
  81. gb.dec(a, b, gid, curr.gtt[i0][i1], res);
  82. curr = curr.next;
  83. gid++;
  84. }
  85. }
  86. Flag.sw.stopGC();
  87. return res;
  88. }
  89. }