12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package com.oblivm.backend.gc.regular;
- import com.oblivm.backend.flexsc.Flag;
- import com.oblivm.backend.flexsc.Mode;
- import com.oblivm.backend.gc.GCEvaComp;
- import com.oblivm.backend.gc.GCSignal;
- import com.oblivm.backend.network.Network;
- public class GCEva extends GCEvaComp {
- Garbler gb;
- GCSignal[][] gtt = new GCSignal[2][2];
- boolean evaluate = false;
- GCEva next = null;
- GCEva curr = null;
- public GCEva(Network channel) {
- super(channel, Mode.REAL);
- gb = new Garbler();
- gtt[0][0] = GCSignal.ZERO;
- gtt[0][1] = GCSignal.newInstance(new byte[10]);
- gtt[1][0] = GCSignal.newInstance(new byte[10]);
- gtt[1][1] = GCSignal.newInstance(new byte[10]);
- }
- public void setEvaluate() {
- evaluate = true;
- curr = this;
- }
- private void receiveGTT() {
- try {
- Flag.sw.startGCIO();
- GCSignal.receive(channel, gtt[0][1]);
- GCSignal.receive(channel, gtt[1][0]);
- GCSignal.receive(channel, gtt[1][1]);
-
-
- Flag.sw.stopGCIO();
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- public GCSignal and(GCSignal a, GCSignal b) {
- Flag.sw.startGC();
- GCSignal res;
- if (a.isPublic() && b.isPublic())
- res = new GCSignal(a.v && b.v);
- else if (a.isPublic())
- res = a.v ? b : new GCSignal(false);
- else if (b.isPublic())
- res = b.v ? a : new GCSignal(false);
- else {
- res = new GCSignal(new byte[10]);
- if (!evaluate) {
- ++numOfAnds;
- if (curr == null) {
- curr = this;
- } else {
- curr.next = new GCEva(channel);
- curr = curr.next;
- }
- curr.receiveGTT();
- } else {
- int i0 = a.getLSB();
- int i1 = b.getLSB();
- gb.dec(a, b, gid, curr.gtt[i0][i1], res);
- curr = curr.next;
- gid++;
- }
- }
- Flag.sw.stopGC();
- return res;
- }
- }
|