GCGen.java 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package com.oblivm.backend.gc.halfANDs;
  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.OPT);
  11. gb = new Garbler();
  12. }
  13. private GCSignal labelL[] = new GCSignal[2];
  14. private GCSignal labelR[] = new GCSignal[2];
  15. private GCSignal TG, WG, TE, WE;
  16. private GCSignal garble(GCSignal a, GCSignal b) {
  17. labelL[0] = a;
  18. labelL[1] = R.xor(labelL[0]);
  19. labelR[0] = b;
  20. labelR[1] = R.xor(labelR[0]);
  21. int cL = a.getLSB();
  22. int cR = b.getLSB();
  23. // first half gate
  24. GCSignal G1 = gb.hash(labelL[0], gid, false);
  25. TG = G1.xor(gb.hash(labelL[1], gid, false)).xor((cR == 1) ? R : GCSignal.ZERO);
  26. WG = G1.xor((cL == 1) ? TG : GCSignal.ZERO);
  27. // second half gate
  28. G1 = gb.hash(labelR[0], gid, true);
  29. TE = G1.xor(gb.hash(labelR[1], gid, true)).xor(labelL[0]);
  30. WE = G1.xor((cR == 1) ? (TE.xor(labelL[0])) : GCSignal.ZERO);
  31. // send the encrypted gate
  32. try {
  33. Flag.sw.startGCIO();
  34. TG.send(channel);
  35. TE.send(channel);
  36. Flag.sw.stopGCIO();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. System.exit(1);
  40. }
  41. // combine halves
  42. return WG.xor(WE);
  43. }
  44. public GCSignal and(GCSignal a, GCSignal b) {
  45. Flag.sw.startGC();
  46. GCSignal res;
  47. if (a.isPublic() && b.isPublic())
  48. res = ((a.v && b.v) ? new GCSignal(true) : new GCSignal(false));
  49. else if (a.isPublic())
  50. res = a.v ? b : new GCSignal(false);
  51. else if (b.isPublic())
  52. res = b.v ? a : new GCSignal(false);
  53. else {
  54. ++numOfAnds;
  55. GCSignal ret = garble(a, b);
  56. gid++;
  57. res = ret;
  58. gatesRemain = true;
  59. }
  60. Flag.sw.stopGC();
  61. return res;
  62. }
  63. @Override
  64. public void setEvaluate() {
  65. // TODO Auto-generated method stub
  66. }
  67. }