GCGen.java 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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.GCGenComp;
  5. import com.oblivm.backend.gc.GCSignal;
  6. import com.oblivm.backend.network.Network;
  7. public class GCGen extends GCGenComp {
  8. Garbler gb;
  9. public GCGen(Network channel) {
  10. super(channel, Mode.REAL);
  11. gb = new Garbler();
  12. for (int i = 0; i < 2; ++i) {
  13. labelL[i] = new GCSignal(new byte[10]);
  14. labelR[i] = new GCSignal(new byte[10]);
  15. lb[i] = new GCSignal(new byte[10]);
  16. toSend[0][i] = new GCSignal(new byte[10]);
  17. toSend[1][i] = new GCSignal(new byte[10]);
  18. }
  19. }
  20. private GCSignal[][] gtt = new GCSignal[2][2];
  21. private GCSignal[][] toSend = new GCSignal[2][2];
  22. private GCSignal labelL[] = new GCSignal[2];
  23. private GCSignal labelR[] = new GCSignal[2];
  24. private GCSignal[] lb = new GCSignal[2];
  25. private GCSignal garble(GCSignal a, GCSignal b) {
  26. labelL[0] = a;
  27. GCSignal.xor(R, labelL[0], labelL[1]);
  28. labelR[0] = b;
  29. GCSignal.xor(R, labelR[0], labelR[1]);
  30. int cL = a.getLSB();
  31. int cR = b.getLSB();
  32. gb.enc(labelL[cL], labelR[cR], gid, GCSignal.ZERO, lb[cL & cR]);
  33. GCSignal.xor(R, lb[cL & cR], lb[1 - (cL & cR)]);
  34. gtt[0 ^ cL][0 ^ cR] = lb[0];
  35. gtt[0 ^ cL][1 ^ cR] = lb[0];
  36. gtt[1 ^ cL][0 ^ cR] = lb[0];
  37. gtt[1 ^ cL][1 ^ cR] = lb[1];
  38. if (cL != 0 || cR != 0)
  39. gb.enc(labelL[0], labelR[0], gid, gtt[0 ^ cL][0 ^ cR], toSend[0 ^ cL][0 ^ cR]);
  40. if (cL != 0 || cR != 1)
  41. gb.enc(labelL[0], labelR[1], gid, gtt[0 ^ cL][1 ^ cR], toSend[0 ^ cL][1 ^ cR]);
  42. if (cL != 1 || cR != 0)
  43. gb.enc(labelL[1], labelR[0], gid, gtt[1 ^ cL][0 ^ cR], toSend[1 ^ cL][0 ^ cR]);
  44. if (cL != 1 || cR != 1)
  45. gb.enc(labelL[1], labelR[1], gid, gtt[1 ^ cL][1 ^ cR], toSend[1 ^ cL][1 ^ cR]);
  46. return GCSignal.newInstance(lb[0].bytes);
  47. }
  48. private void sendGTT() {
  49. try {
  50. Flag.sw.startGCIO();
  51. toSend[0][1].send(channel);
  52. toSend[1][0].send(channel);
  53. toSend[1][1].send(channel);
  54. Flag.sw.stopGCIO();
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. System.exit(1);
  58. }
  59. }
  60. public GCSignal and(GCSignal a, GCSignal b) {
  61. Flag.sw.startGC();
  62. GCSignal res;
  63. if (a.isPublic() && b.isPublic())
  64. res = ((a.v && b.v) ? new GCSignal(true) : new GCSignal(false));
  65. else if (a.isPublic())
  66. res = a.v ? b : new GCSignal(false);
  67. else if (b.isPublic())
  68. res = b.v ? a : new GCSignal(false);
  69. else {
  70. ++numOfAnds;
  71. GCSignal ret;
  72. ret = garble(a, b);
  73. sendGTT();
  74. gid++;
  75. gatesRemain = true;
  76. res = ret;
  77. }
  78. Flag.sw.stopGC();
  79. return res;
  80. }
  81. @Override
  82. public void setEvaluate() {
  83. }
  84. }