123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- // Copyright (C) 2010 by Yan Huang <yhuang@virginia.edu>
- package YaoGC;
- import java.math.*;
- import Cipher.*;
- import sprout.oram.PID;
- import sprout.oram.TID;
- public abstract class AND_2_1 extends SimpleCircuit_2_1 {
- public AND_2_1() {
- super("AND_2_1");
- }
- public static AND_2_1 newInstance() {
- if (Circuit.isForGarbling)
- return new G_AND_2_1();
- else
- return new E_AND_2_1();
- }
- protected void compute() {
- int left = inputWires[0].value;
- int right = inputWires[1].value;
- outputWires[0].value = left & right;
- }
- protected void fillTruthTable() {
- Wire inWireL = inputWires[0];
- Wire inWireR = inputWires[1];
- Wire outWire = outputWires[0];
- BigInteger[] labelL = { inWireL.lbl, Wire.conjugate(inWireL.lbl) };
- if (inWireL.invd == true) {
- BigInteger tmp = labelL[0];
- labelL[0] = labelL[1];
- labelL[1] = tmp;
- }
- BigInteger[] labelR = { inWireR.lbl, Wire.conjugate(inWireR.lbl) };
- if (inWireR.invd == true) {
- BigInteger tmp = labelR[0];
- labelR[0] = labelR[1];
- labelR[1] = tmp;
- }
- int k = outWire.serialNum;
- gtt = new BigInteger[2][2];
- int cL = inWireL.lbl.testBit(0) ? 1 : 0;
- int cR = inWireR.lbl.testBit(0) ? 1 : 0;
- BigInteger[] lb = new BigInteger[2];
- timing.stopwatch[PID.sha1][TID.offline].start();
- lb[cL & cR] = Cipher.encrypt(labelL[cL], labelR[cR], k, BigInteger.ZERO);
- timing.stopwatch[PID.sha1][TID.offline].stop();
- lb[1 - (cL & cR)] = Wire.conjugate(lb[cL & cR]);
- outWire.lbl = lb[0];
- gtt[0 ^ cL][0 ^ cR] = lb[0];
- gtt[0 ^ cL][1 ^ cR] = lb[0];
- gtt[1 ^ cL][0 ^ cR] = lb[0];
- gtt[1 ^ cL][1 ^ cR] = lb[1];
- int lsb = lb[0].testBit(0) ? 1 : 0;
- if (outputWires[0].outBitEncPair != null) {
- timing.stopwatch[PID.sha1][TID.offline].start();
- outputWires[0].outBitEncPair[lsb] = Cipher.encrypt(k, lb[0], 0);
- outputWires[0].outBitEncPair[1 - lsb] = Cipher.encrypt(k, lb[1], 1);
- timing.stopwatch[PID.sha1][TID.offline].stop();
- }
- }
- protected boolean shortCut() {
- if (inputWires[0].value == 0) {
- outputWires[0].value = 0;
- return true;
- }
- if (inputWires[1].value == 0) {
- outputWires[0].value = 0;
- return true;
- }
- return false;
- }
- protected boolean collapse() {
- Wire inWireL = inputWires[0];
- Wire inWireR = inputWires[1];
- Wire outWire = outputWires[0];
- if (inWireL.lbl.equals(inWireR.lbl)) {
- if (inWireL.invd == inWireR.invd) {
- outWire.invd = inWireL.invd;
- outWire.setLabel(inWireL.lbl);
- } else {
- outWire.invd = false;
- outWire.value = 0;
- }
- return true;
- }
- return false;
- }
- }
|