12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- package com.oblivm.backend.gc.halfANDs;
- import com.oblivm.backend.flexsc.Flag;
- import com.oblivm.backend.flexsc.Mode;
- import com.oblivm.backend.gc.GCGenComp;
- import com.oblivm.backend.gc.GCSignal;
- import com.oblivm.backend.network.Network;
- public class GCGen extends GCGenComp {
- Garbler gb;
- public GCGen(Network channel) {
- super(channel, Mode.OPT);
- gb = new Garbler();
- }
- private GCSignal labelL[] = new GCSignal[2];
- private GCSignal labelR[] = new GCSignal[2];
- private GCSignal TG, WG, TE, WE;
- private GCSignal garble(GCSignal a, GCSignal b) {
- labelL[0] = a;
- labelL[1] = R.xor(labelL[0]);
- labelR[0] = b;
- labelR[1] = R.xor(labelR[0]);
- int cL = a.getLSB();
- int cR = b.getLSB();
- // first half gate
- GCSignal G1 = gb.hash(labelL[0], gid, false);
- TG = G1.xor(gb.hash(labelL[1], gid, false)).xor((cR == 1) ? R : GCSignal.ZERO);
- WG = G1.xor((cL == 1) ? TG : GCSignal.ZERO);
- // second half gate
- G1 = gb.hash(labelR[0], gid, true);
- TE = G1.xor(gb.hash(labelR[1], gid, true)).xor(labelL[0]);
- WE = G1.xor((cR == 1) ? (TE.xor(labelL[0])) : GCSignal.ZERO);
- // send the encrypted gate
- try {
- Flag.sw.startGCIO();
- TG.send(channel);
- TE.send(channel);
- Flag.sw.stopGCIO();
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- // combine halves
- return WG.xor(WE);
- }
- public GCSignal and(GCSignal a, GCSignal b) {
- Flag.sw.startGC();
- GCSignal res;
- if (a.isPublic() && b.isPublic())
- res = ((a.v && b.v) ? new GCSignal(true) : new GCSignal(false));
- else if (a.isPublic())
- res = a.v ? b : new GCSignal(false);
- else if (b.isPublic())
- res = b.v ? a : new GCSignal(false);
- else {
- ++numOfAnds;
- GCSignal ret = garble(a, b);
- gid++;
- res = ret;
- gatesRemain = true;
- }
- Flag.sw.stopGC();
- return res;
- }
- @Override
- public void setEvaluate() {
- // TODO Auto-generated method stub
- }
- }
|