MpcLib.Circuits.PermutationNetwork.CollapsePermutationGates C# (CSharp) Method

CollapsePermutationGates() public method

public CollapsePermutationGates ( ) : void
return void
        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();
        }

Usage Example

示例#1
0
文件: TestApp.cs 项目: mahdiz/mpclib
        /*
        public static void SetupSimpleCircuitEvaluation(Quorum quorum)
        {
            int n = quorum.Size;
            var polyDeg = (int)Math.Ceiling(n / 3.0) - 1;

            Debug.Assert((n & (n - 1)) == 0); // is power of 2

            network = new LPSortingNetwork(n);

            IList<BigZp>[] shares = new IList<BigZp>[n];

            for (int i = 0; i < n; i++)
                shares[i] = BigShamirSharing.Share(new BigZp(prime, 500 - 2*i), n, polyDeg);

            foreach (var id in quorum.Members)
            {
                Dictionary<InputGateAddress, Share<BigZp>> inShares = new Dictionary<InputGateAddress, Share<BigZp>>();

                int i = 0;
                foreach (var inAddr in network.Circuit.InputAddrs)
                {
                    inShares[inAddr] = new Share<BigZp>(shares[i][id]);
                    i++;
                }

                TestParty<IDictionary<OutputGateAddress, Share<BigZp>>> party = new TestParty<IDictionary<OutputGateAddress, Share<BigZp>>>();
                party.UnderTest = new SecureGroupCircuitEvaluation(party, quorum.Clone() as Quorum, network.Circuit, inShares);
                NetSimulator.RegisterParty(party);
            }
        }
        */
        public static void SetupMultiQuorumCircuitEvaluation(Quorum bigQuorum)
        {
            int n = bigQuorum.Size;

            int qSize = n / 2;

            var polyDeg = (int)Math.Ceiling(qSize / 3.0) - 1;

            var quorums = new List<Quorum>();
            quorums.Add(new Quorum(0, 0, qSize));
            quorums.Add(new Quorum(1, qSize, 2*qSize));

            Debug.Assert((n & (n - 1)) == 0); // is power of 2

            network = new LPSortingNetwork(n);
            //network = SortingNetworkFactory.CreateButterflyTournamentRound(n);

            network.CollapsePermutationGates();

            IList<BigZp>[] shares = new IList<BigZp>[n];

            for (int i = 0; i < n; i++)
                shares[i] = BigShamirSharing.Share(new BigZp(prime, 500 - 2 * i), qSize, polyDeg);

            Dictionary<Gate, Quorum> gqmapping = new Dictionary<Gate, Quorum>();
            for (int i = 0; i < network.Circuit.TopologicalOrder.Count; i++)
                gqmapping[network.Circuit.TopologicalOrder[i]] = quorums[i];

            foreach (var id in bigQuorum.Members)
            {
                Dictionary<InputGateAddress, Share<BigZp>> inShares = new Dictionary<InputGateAddress, Share<BigZp>>();

                int i = 0;
                foreach (var inAddr in network.Circuit.InputAddrs)
                {
                    inShares[inAddr] = new Share<BigZp>(shares[i][id % 4]);
                    i++;
                }

                TestParty<IDictionary<OutputGateAddress, Share<BigZp>>> party = new TestParty<IDictionary<OutputGateAddress, Share<BigZp>>>();
                Quorum[] quorumsClone = quorums.Select(a => a.Clone() as Quorum).ToArray();

                party.UnderTest =
                    new SecureMultiQuorumCircuitEvaluation<Share<BigZp>>(party, quorumsClone[id / qSize], quorumsClone,
                    ProtocolIdGenerator.GenericIdentifier(0), network.Circuit, inShares, new BigZpShareGateEvaluationFactory(prime), gqmapping, prime);

                NetSimulator.RegisterParty(party);
            }
        }