GCEva.java 3.4 KB

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