GCEva.java 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. public class GCEva extends GCEvaComp {
  8. Garbler gb;
  9. GCSignal[][] gtt = new GCSignal[2][2];
  10. boolean evaluate = false;
  11. GCEva next = null;
  12. GCEva curr = null;
  13. public GCEva(Network channel) {
  14. super(channel, Mode.REAL);
  15. gb = new Garbler();
  16. gtt[0][0] = GCSignal.ZERO;
  17. gtt[0][1] = GCSignal.newInstance(new byte[10]);
  18. gtt[1][0] = GCSignal.newInstance(new byte[10]);
  19. gtt[1][1] = GCSignal.newInstance(new byte[10]);
  20. }
  21. public GCEva(GCEva env) {
  22. super(env.channel, Mode.REAL);
  23. gb = new Garbler();
  24. gtt[0][0] = GCSignal.ZERO;
  25. gtt[0][1] = GCSignal.newInstance(new byte[10]);
  26. gtt[1][0] = GCSignal.newInstance(new byte[10]);
  27. gtt[1][1] = GCSignal.newInstance(new byte[10]);
  28. }
  29. public void setEvaluate() {
  30. evaluate = true;
  31. curr = this;
  32. }
  33. private void receiveGTT() {
  34. try {
  35. Flag.sw.startGCIO();
  36. GCSignal.receive(channel, gtt[0][1]);
  37. GCSignal.receive(channel, gtt[1][0]);
  38. GCSignal.receive(channel, gtt[1][1]);
  39. // gtt[1][0] = GCSignal.receive(channel);
  40. // gtt[1][1] = GCSignal.receive(channel);
  41. Flag.sw.stopGCIO();
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. System.exit(1);
  45. }
  46. }
  47. public GCSignal and(GCSignal a, GCSignal b) {
  48. Flag.sw.startGC();
  49. GCSignal res;
  50. if (a.isPublic() && b.isPublic())
  51. res = new GCSignal(a.v && b.v);
  52. else if (a.isPublic())
  53. res = a.v ? b : new GCSignal(false);
  54. else if (b.isPublic())
  55. res = b.v ? a : new GCSignal(false);
  56. else {
  57. res = new GCSignal(new byte[10]);
  58. if (!evaluate) {
  59. ++numOfAnds;
  60. if (curr == null) {
  61. curr = this;
  62. } else {
  63. curr.next = new GCEva(this);
  64. curr = curr.next;
  65. }
  66. curr.receiveGTT();
  67. } else {
  68. int i0 = a.getLSB();
  69. int i1 = b.getLSB();
  70. gb.dec(a, b, gid, curr.gtt[i0][i1], res);
  71. curr = curr.next;
  72. gid++;
  73. }
  74. }
  75. Flag.sw.stopGC();
  76. return res;
  77. }
  78. }