GCEva.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 p;
  18. int m;
  19. ArrayList<byte[]> msg = new ArrayList<byte[]>(threshold);
  20. public GCEva(Network channel) {
  21. super(channel, Mode.REAL);
  22. gb = new Garbler();
  23. gtt[0][0] = GCSignal.ZERO;
  24. gtt[0][1] = GCSignal.newInstance(new byte[10]);
  25. gtt[1][0] = GCSignal.newInstance(new byte[10]);
  26. gtt[1][1] = GCSignal.newInstance(new byte[10]);
  27. }
  28. public GCEva(Network channel, Timer timer, int p, int m) {
  29. super(channel, Mode.REAL);
  30. gb = new Garbler();
  31. gtt[0][0] = GCSignal.ZERO;
  32. gtt[0][1] = GCSignal.newInstance(new byte[10]);
  33. gtt[1][0] = GCSignal.newInstance(new byte[10]);
  34. gtt[1][1] = GCSignal.newInstance(new byte[10]);
  35. this.timer = timer;
  36. this.p = p;
  37. this.m = m;
  38. }
  39. public void setEvaluate() {
  40. evaluate = true;
  41. curr = this;
  42. }
  43. public void receiveLastSetGTT() {
  44. int remainder = (int) (numOfAnds % threshold);
  45. if (remainder > 0) {
  46. msg = channel.sender.readArrayList();
  47. for (int i = 0; i < remainder; i++) {
  48. if (curr == null) {
  49. curr = this;
  50. } else {
  51. curr.next = new GCEva(channel, timer, p, 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. msg = channel.sender.readArrayList();
  79. for (int i = 0; i < threshold; i++) {
  80. if (curr == null) {
  81. curr = this;
  82. } else {
  83. curr.next = new GCEva(channel, timer, p, m);
  84. curr = curr.next;
  85. }
  86. byte[] rows = msg.get(i);
  87. curr.gtt[0][1].bytes = Arrays.copyOfRange(rows, 0, GCSignal.len);
  88. curr.gtt[1][0].bytes = Arrays.copyOfRange(rows, GCSignal.len, GCSignal.len * 2);
  89. curr.gtt[1][1].bytes = Arrays.copyOfRange(rows, GCSignal.len * 2, rows.length);
  90. }
  91. msg.clear();
  92. }
  93. }
  94. }
  95. public GCSignal and(GCSignal a, GCSignal b) {
  96. Flag.sw.startGC();
  97. GCSignal res;
  98. if (a.isPublic() && b.isPublic())
  99. res = new GCSignal(a.v && b.v);
  100. else if (a.isPublic())
  101. res = a.v ? b : new GCSignal(false);
  102. else if (b.isPublic())
  103. res = b.v ? a : new GCSignal(false);
  104. else {
  105. res = new GCSignal(new byte[10]);
  106. if (!evaluate) {
  107. ++numOfAnds;
  108. receiveGTT();
  109. } else {
  110. int i0 = a.getLSB();
  111. int i1 = b.getLSB();
  112. gb.dec(a, b, gid, curr.gtt[i0][i1], res);
  113. curr = curr.next;
  114. gid++;
  115. }
  116. }
  117. Flag.sw.stopGC();
  118. return res;
  119. }
  120. }