123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // by Boyang Wei
- package YaoGC;
- import java.math.*;
- import Cipher.*;
- import sprout.oram.PID;
- import sprout.oram.TID;
- public abstract class FF10_3_SC_2_2 extends SimpleCircuit_2_2 {
- public FF10_3_SC_2_2() {
- super("FF10_3_SC_2_2");
- }
- public static FF10_3_SC_2_2 newInstance() {
- if (Circuit.isForGarbling)
- return new G_FF10_3_SC_2_2();
- else
- return new E_FF10_3_SC_2_2();
- }
- protected void compute() {}
-
- private int outS(int l, int r) {
- int o;
- if (l == 0) {
- if (r == 0)
- o = 0;
- else
- o = 0;
- } else {
- if (r == 0)
- o = 1;
- else
- o = 1;
- }
- return o;
- }
-
- private int outO(int l, int r) {
- int o;
- if (l == 0) {
- if (r == 0)
- o = 0;
- else
- o = 0;
- } else {
- if (r == 0)
- o = 0;
- else
- o = 0;
- }
- return o;
- }
- protected void fillTruthTable() {
- Wire inWireL = inputWires[0];
- Wire inWireR = inputWires[1];
- Wire outWire0 = outputWires[0];
- Wire outWire1 = outputWires[1];
- 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 k0 = outWire0.serialNum;
- int k1 = outWire1.serialNum;
- gtt = new BigInteger[2][2];
- int cL = inWireL.lbl.testBit(0) ? 1 : 0;
- int cR = inWireR.lbl.testBit(0) ? 1 : 0;
- timing.stopwatch[PID.sha1][TID.offline].start();
- BigInteger lb = Cipher.encrypt(labelL[cL], labelR[cR], k0, k1, BigInteger.ZERO);
- timing.stopwatch[PID.sha1][TID.offline].stop();
- BigInteger[] lbS = new BigInteger[2];
- BigInteger[] lbO = new BigInteger[2];
-
- lbS[outS(cL, cR)] = lb.shiftRight(Wire.labelBitLength);
- lbO[outO(cL, cR)] = lb.and(Cipher.mask);
- lbS[1 - outS(cL, cR)] = Wire.conjugate(lbS[outS(cL, cR)]);
- lbO[1 - outO(cL, cR)] = Wire.conjugate(lbO[outO(cL, cR)]);
-
- outWire0.lbl = lbS[0];
- outWire1.lbl = lbO[0];
- gtt[0 ^ cL][0 ^ cR] = lbS[outS(0, 0)].shiftLeft(Wire.labelBitLength).xor(lbO[outO(0, 0)]);
- gtt[0 ^ cL][1 ^ cR] = lbS[outS(0, 1)].shiftLeft(Wire.labelBitLength).xor(lbO[outO(0, 1)]);
- gtt[1 ^ cL][0 ^ cR] = lbS[outS(1, 0)].shiftLeft(Wire.labelBitLength).xor(lbO[outO(1, 0)]);
- gtt[1 ^ cL][1 ^ cR] = lbS[outS(1, 1)].shiftLeft(Wire.labelBitLength).xor(lbO[outO(1, 1)]);
- int lsb = lbS[0].testBit(0) ? 1 : 0;
- if (outputWires[0].outBitEncPair != null) {
- timing.stopwatch[PID.sha1][TID.offline].start();
- outputWires[0].outBitEncPair[lsb] = Cipher.encrypt(k0, lbS[0], 0);
- outputWires[0].outBitEncPair[1 - lsb] = Cipher.encrypt(k0, lbS[1], 1);
- timing.stopwatch[PID.sha1][TID.offline].stop();
- }
-
- lsb = lbO[0].testBit(0) ? 1 : 0;
- if (outputWires[1].outBitEncPair != null) {
- timing.stopwatch[PID.sha1][TID.offline].start();
- outputWires[1].outBitEncPair[lsb] = Cipher.encrypt(k1, lbO[0], 0);
- outputWires[1].outBitEncPair[1 - lsb] = Cipher.encrypt(k1, lbO[1], 1);
- timing.stopwatch[PID.sha1][TID.offline].stop();
- }
- }
- protected boolean shortCut() {
- return false;
- }
- protected boolean collapse() {
- return false;
- }
- }
|