Example #1
0
        public void CollapsePermutationGates()
        {
            // unwind input and output addresses until we find an address on a non-permutation gate
            for (int i = 0; i < WireCount; i++)
            {
                InputGateAddress inAddr = FirstGateForWire[i];
                while (inAddr != null && inAddr.Gate is PermutationGate)
                {
                    var pgate      = (PermutationGate)inAddr.Gate;
                    var permuteOut = pgate.GetLocalOutputAddress(pgate.Permute(inAddr.Port));

                    Circuit.OutputConnectionCounterparties.TryGetValue(permuteOut, out inAddr);
                }

                FirstGateForWire[i] = inAddr;
            }

            for (int i = 0; i < WireCount; i++)
            {
                OutputGateAddress outAddr = LastGateForWire[i];
                while (outAddr != null && outAddr.Gate is PermutationGate)
                {
                    var pgate     = (PermutationGate)outAddr.Gate;
                    var permuteIn = pgate.GetLocalInputAddress(pgate.Unpermute(outAddr.Port));

                    Circuit.InputConnectionCounterparties.TryGetValue(permuteIn, out outAddr);
                }

                LastGateForWire[i] = outAddr;
            }

            Circuit.CollapsePermutationGates();
        }
Example #2
0
        public void CollapsePermutationGates()
        {
            foreach (var gate in Gates.ToList())
            {
                if (gate is PermutationGate)
                {
                    PermutationGate pgate = (PermutationGate)gate;

                    for (int i = 0; i < pgate.Count; i++)
                    {
                        OutputGateAddress inputCounterparty  = InputConnectionCounterparties[pgate.GetLocalInputAddress(i)];
                        InputGateAddress  outputCounterparty = OutputConnectionCounterparties[pgate.GetLocalOutputAddress(pgate.Permute(i))];

                        AddConnection(new GateConnection(inputCounterparty, outputCounterparty));
                    }

                    RemoveGate(pgate);
                }
            }
        }
Example #3
0
        public object Clone(out Dictionary <Gate, Gate> mapping)
        {
            var clone = new Circuit();

            mapping = new Dictionary <Gate, Gate>();

            // add all of the gates and connections that I have
            foreach (var gate in Gates)
            {
                var gateClone = gate.Copy() as Gate;
                clone.Gates.Add(gateClone);
                mapping.Add(gate, gateClone);
            }

            foreach (var input in InputAddrs)
            {
                clone.InputAddrs.Add(new InputGateAddress(mapping[input.Gate], input.Port));
            }

            foreach (var output in OutputAddrs)
            {
                clone.OutputAddrs.Add(new OutputGateAddress(mapping[output.Gate], output.Port));
            }

            foreach (var oldInputGate in InputConnectionCounterparties.Keys)
            {
                var newInputGate  = new InputGateAddress(mapping[oldInputGate.Gate], oldInputGate.Port);
                var oldOutputGate = InputConnectionCounterparties[oldInputGate];
                var newOutputGate = new OutputGateAddress(mapping[oldOutputGate.Gate], oldOutputGate.Port);

                clone.InputConnectionCounterparties[newInputGate]   = newOutputGate;
                clone.OutputConnectionCounterparties[newOutputGate] = newInputGate;
            }

            return(clone);
        }
Example #4
0
        public object Clone(out Dictionary<Gate, Gate> mapping)
        {
            var clone = new Circuit();

            mapping = new Dictionary<Gate, Gate>();

            // add all of the gates and connections that I have
            foreach (var gate in Gates)
            {
                var gateClone = gate.Copy() as Gate;
                clone.Gates.Add(gateClone);
                mapping.Add(gate, gateClone);
            }

            foreach (var input in InputAddrs)
            {
                clone.InputAddrs.Add(new InputGateAddress(mapping[input.Gate], input.Port));
            }

            foreach (var output in OutputAddrs)
            {
                clone.OutputAddrs.Add(new OutputGateAddress(mapping[output.Gate], output.Port));
            }

            foreach (var oldInputGate in InputConnectionCounterparties.Keys)
            {
                var newInputGate = new InputGateAddress(mapping[oldInputGate.Gate], oldInputGate.Port);
                var oldOutputGate = InputConnectionCounterparties[oldInputGate];
                var newOutputGate = new OutputGateAddress(mapping[oldOutputGate.Gate], oldOutputGate.Port);

                clone.InputConnectionCounterparties[newInputGate] = newOutputGate;
                clone.OutputConnectionCounterparties[newOutputGate] = newInputGate;
            }

            return clone;
        }
Example #5
0
        public static void ReconstructDictionary(Quorum q, OutputGateAddress[] ordering, int qSize)
        {
            List<BigZp> result = new List<BigZp>();
            foreach (OutputGateAddress outAddr in ordering)
            {
                if (outAddr == null)
                    continue;
                BigZp[] shares = new BigZp[qSize];

                int j = 0;
                foreach (var id in q.Members)
                {
                    Protocol<IDictionary<OutputGateAddress, Share<BigZp>>> p = (NetSimulator.GetParty(id) as TestParty<IDictionary<OutputGateAddress, Share<BigZp>>>).UnderTest;
                    if (p.Result.ContainsKey(outAddr))
                        shares[j++] = p.Result[outAddr].Value;
                }
                result.Add(BigShamirSharing.Recombine(new List<BigZp>(shares), (int)Math.Ceiling(qSize / 3.0) - 1, prime));
            }

            Console.WriteLine("Result: " + string.Join(" ", result));
        }
Example #6
0
 public GateConnection(OutputGateAddress from, InputGateAddress to)
 {
     FromAddr = from;
     ToAddr   = to;
 }
Example #7
0
 public GateConnection(OutputGateAddress from, InputGateAddress to)
 {
     FromAddr = from;
     ToAddr = to;
 }