GCEva.java 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 void setEvaluate() {
  22. evaluate = true;
  23. curr = this;
  24. }
  25. private void receiveGTT() {
  26. try {
  27. Flag.sw.startGCIO();
  28. GCSignal.receive(channel, gtt[0][1]);
  29. GCSignal.receive(channel, gtt[1][0]);
  30. GCSignal.receive(channel, gtt[1][1]);
  31. // gtt[1][0] = GCSignal.receive(channel);
  32. // gtt[1][1] = GCSignal.receive(channel);
  33. Flag.sw.stopGCIO();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. System.exit(1);
  37. }
  38. }
  39. public GCSignal and(GCSignal a, GCSignal b) {
  40. Flag.sw.startGC();
  41. GCSignal res;
  42. if (a.isPublic() && b.isPublic())
  43. res = new GCSignal(a.v && b.v);
  44. else if (a.isPublic())
  45. res = a.v ? b : new GCSignal(false);
  46. else if (b.isPublic())
  47. res = b.v ? a : new GCSignal(false);
  48. else {
  49. res = new GCSignal(new byte[10]);
  50. if (!evaluate) {
  51. ++numOfAnds;
  52. if (curr == null) {
  53. curr = this;
  54. } else {
  55. curr.next = new GCEva(channel);
  56. curr = curr.next;
  57. }
  58. curr.receiveGTT();
  59. } else {
  60. int i0 = a.getLSB();
  61. int i1 = b.getLSB();
  62. gb.dec(a, b, gid, curr.gtt[i0][i1], res);
  63. curr = curr.next;
  64. gid++;
  65. }
  66. }
  67. Flag.sw.stopGC();
  68. return res;
  69. }
  70. }