Inheritance: ICloneable
コード例 #1
0
ファイル: Quorum.cs プロジェクト: mahdiz/mpclib
        public ulong GetNextTwoProtocolId(Quorum other, bool incrementOther = true)
        {
            if (this == other)
            {
                return(GetNextProtocolId());
            }

            if (!TwoQuorumProtocolIds.ContainsKey(other))
            {
                TwoQuorumProtocolIds[other] = 0;
            }

            // if we are failing this assert, we need to expand the range
            Debug.Assert(TwoQuorumProtocolIds[other] <= ushort.MaxValue);

            ulong retId = ProtocolIdGenerator.TwoQuorumProtocolIdentifier(QuorumNumber, other.QuorumNumber, TwoQuorumProtocolIds[other]);

            TwoQuorumProtocolIds[other]++;

            // increment the id in the other quorum (necessary because a party may be part of both quorums)
            if (incrementOther)
            {
                other.GetNextTwoProtocolId(this, false);
            }

            return(retId);
        }
コード例 #2
0
ファイル: Quorum.cs プロジェクト: mahdiz/mpclib
        public virtual object Clone()
        {
            Quorum q = (Quorum)this.MemberwiseClone();

            q.Members = new SortedSet <int>(Members);
            return(q);
        }
コード例 #3
0
ファイル: Quorum.cs プロジェクト: mahdiz/mpclib
        public override bool Equals(object obj)
        {
            if (!(obj is Quorum))
            {
                return(false);
            }
            Quorum other = (Quorum)obj;

            // should be sufficient
            return(other.QuorumNumber == QuorumNumber);
        }
コード例 #4
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);
            }
        }
コード例 #5
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        public static void SetupLeastSignificantBit(Quorum quorum)
        {
            int n = quorum.Size;

            var input = new BigZp(prime, 2);
            var polyDeg = (int)Math.Ceiling(n / 3.0) - 1;

            var shares = BigShamirSharing.Share(input, n, polyDeg);
            for (int i = 0; i < n; i++)
            {
                TestParty<Share<BigZp>> party = new TestParty<Share<BigZp>>();
                party.UnderTest = new LeastSignificantBitProtocol(party, quorum, new Share<BigZp>(shares[i]));
                NetSimulator.RegisterParty(party);
            }
        }
コード例 #6
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
 public static void SetupBitwiseRandomGeneration(Quorum quorum)
 {
     int n = quorum.Size;
     for (int i = 0; i < n; i++)
     {
         TestParty<List<Share<BigZp>>> party = new TestParty<List<Share<BigZp>>>();
         party.UnderTest = new RandomBitwiseGenProtocol(party, quorum, prime, 15);
         NetSimulator.RegisterParty(party);
     }
 }
コード例 #7
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        public static void SetupBitwiseLessThan(Quorum quorum)
        {
            int n = quorum.Size;
            var polyDeg = (int)Math.Ceiling(n / 3.0) - 1;

            var sharesA = BigShamirSharing.Share(new BigZp(prime, 1), n, polyDeg);
            var sharesB = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);
            var sharesC = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);
            var sharesD = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);

            var sharesE = BigShamirSharing.Share(new BigZp(prime, 1), n, polyDeg);
            var sharesF = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);
            var sharesG = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);
            var sharesH = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);

            for (int i = 0; i < n; i++)
            {
                TestParty<Share<BigZp>> party = new TestParty<Share<BigZp>>();
                party.UnderTest = new BitwiseLessThanProtocol(party, quorum,
                    MakeList(sharesA[i], sharesB[i], sharesC[i], sharesD[i]),
                    MakeList(sharesE[i], sharesF[i], sharesG[i], sharesH[i]));
                NetSimulator.RegisterParty(party);
            }
        }
コード例 #8
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        public static void SetupBitwiseAndProtocol(Quorum quorum)
        {
            int n = quorum.Size;

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

            var sharesA = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);
            var sharesB = BigShamirSharing.Share(new BigZp(prime, 1), n, polyDeg);
            var sharesC = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);

            var sharesD = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);
            var sharesE = BigShamirSharing.Share(new BigZp(prime, 1), n, polyDeg);
            var sharesF = BigShamirSharing.Share(new BigZp(prime, 1), n, polyDeg);

            for (int i = 0; i < n; i++)
            {
                Quorum q = quorum.Clone() as Quorum;
                TestParty<List<Share<BigZp>>> party = new TestParty<List<Share<BigZp>>>();
                party.UnderTest = new BitwiseOperationProtocol(party, q,
                    MakeList(sharesA[i], sharesB[i], sharesC[i]),
                    MakeList(sharesD[i], sharesE[i], sharesF[i]),
                    new SharedBitAnd.ProtocolFactory(party, q));
                NetSimulator.RegisterParty(party);
            }
        }
コード例 #9
0
ファイル: QuorumProtocol.cs プロジェクト: mahdiz/mpclib
 public QuorumProtocol(Party me, Quorum quorum, ulong protocolId)
     : base(me, quorum.Members, protocolId)
 {
     Quorum = quorum;
 }
コード例 #10
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        public static void SetupReconstructionProtocol(Quorum quorum)
        {
            int n = quorum.Size;
            var input = new BigZp(prime, 20);
            var polyDeg = (int)Math.Ceiling(n / 3.0) - 1;

            var shares = BigShamirSharing.Share(input, n, polyDeg);
            for (int i = 0; i < n; i++)
            {
                TestParty<BigZp> party = new TestParty<BigZp>();
                ReconstructionProtocol rp = new ReconstructionProtocol(party, quorum, new Share<BigZp>(shares[i]));
                party.UnderTest = rp;
                NetSimulator.RegisterParty(party);
            }
        }
コード例 #11
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        public static void ReconstructBitwise(Quorum q, int bitCount)
        {
            List<BigZp> result = new List<BigZp>();
            for (int i = bitCount - 1; i >= 0; i--)
            {
                BigZp[] shares = new BigZp[q.Size];

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

            foreach (var bit in result)
            {
                Console.Write(bit);
            }
            Console.WriteLine();
        }
コード例 #12
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        public static void Reconstruct(Quorum q)
        {
            BigZp[] shares = new BigZp[q.Size];

            int i = 0;
            foreach (var id in q.Members)
            {
                shares[i++] = (NetSimulator.GetParty(id) as TestParty<Share<BigZp>>).UnderTest.Result.Value;
            }

            var val = BigShamirSharing.Recombine(new List<BigZp>(shares), (int)Math.Ceiling(q.Size / 3.0) - 1, prime);

            Console.WriteLine("Output: " + val);
        }
コード例 #13
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        // number of parties
        /*
            prime = prime20;
            Main(32);
            NetSimulator.Reset();

            prime = prime30;
            Main(32);
            NetSimulator.Reset();

            prime = prime40;
            Main(32);
            NetSimulator.Reset();

            prime = prime50;
            Main(32);
            NetSimulator.Reset();
            */
        public static void Main(int n)
        {
            Debug.Assert(NumTheoryUtils.MillerRabin(prime, 5) == false);        // must be a prime

            // Create an MPC network, add parties, and init them with random inputs
            NetSimulator.Init(seed);   //seed
            StaticRandom.Init(seed+1); //seed + 1

            Quorum q = new Quorum(0, 0, n);

            SetupMps(n);

            //SetupMultiQuorumCircuitEvaluation(q);

            Console.WriteLine(n + " parties initialized. Running simulation...\n");
            // run the simulator
            var elapsedTime = Timex.Run(() => NetSimulator.Run());
               // CheckMps(n);
            //ReconstructDictionary(q, network.LastGateForWire, 4);

            Console.WriteLine("Simulation finished.  Checking results...\n");

            Console.WriteLine("# parties    = " + n);
            Console.WriteLine("# msgs sent  = " + NetSimulator.SentMessageCount.ToString("0.##E+00"));
            Console.WriteLine("# bits sent  = " + (NetSimulator.SentByteCount * 8).ToString("0.##E+00"));
            Console.WriteLine("Rounds       = " + NetSimulator.RoundCount + "\n");
            Console.WriteLine("Key size     = " + NumTheoryUtils.GetBitLength2(prime) + " bits");
            Console.WriteLine("Seed         = " + seed + "\n");
            Console.WriteLine("Elapsed time = " + elapsedTime.ToString("hh':'mm':'ss'.'fff") + "\n");
        }
コード例 #14
0
ファイル: Quorum.cs プロジェクト: mahdiz/mpclib
        public ulong GetNextTwoProtocolId(Quorum other, bool incrementOther = true)
        {
            if (this == other)
                return GetNextProtocolId();

            if (!TwoQuorumProtocolIds.ContainsKey(other))
                TwoQuorumProtocolIds[other] = 0;

            // if we are failing this assert, we need to expand the range
            Debug.Assert(TwoQuorumProtocolIds[other] <= ushort.MaxValue);

            ulong retId = ProtocolIdGenerator.TwoQuorumProtocolIdentifier(QuorumNumber, other.QuorumNumber, TwoQuorumProtocolIds[other]);
            TwoQuorumProtocolIds[other]++;

            // increment the id in the other quorum (necessary because a party may be part of both quorums)
            if (incrementOther)
               other.GetNextTwoProtocolId(this, false);

            return retId;
        }
コード例 #15
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        public static void SetupPrefixOrProtocol(Quorum quorum)
        {
            int n = quorum.Size;
            var polyDeg = (int)Math.Ceiling(n / 3.0) - 1;

            var sharesA = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);
            var sharesB = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);
            var sharesC = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);
            var sharesD = BigShamirSharing.Share(new BigZp(prime, 0), n, polyDeg);

            for (int i = 0; i < n; i++)
            {
                TestParty<List<Share<BigZp>>> party = new TestParty<List<Share<BigZp>>>();
                party.UnderTest = new PrefixOperationProtocol(party, quorum,
                    MakeList(sharesA[i], sharesB[i], sharesC[i], sharesD[i]),
                    new SharedBitOr.ProtocolFactory(party, quorum));
                NetSimulator.RegisterParty(party);
            }
        }
コード例 #16
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        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));
        }
コード例 #17
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
 public static void SetupRandomGenProtocol(Quorum quorum)
 {
     int n = quorum.Size;
     for (int i = 0; i < n; i++)
     {
         TestParty<Share<BigZp>> party = new TestParty<Share<BigZp>>();
         party.UnderTest = new RandGenProtocol(party, quorum.Clone() as Quorum, new BigZp(prime, i), prime);
         NetSimulator.RegisterParty(party);
     }
 }
コード例 #18
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        public static void ReconstructTuple(Quorum q)
        {
            BigZp[] shares1 = new BigZp[q.Size];
            BigZp[] shares2 = new BigZp[q.Size];

            int i = 0;
            foreach (var id in q.Members)
            {
                var result = (NetSimulator.GetParty(id) as TestParty<Tuple<Share<BigZp>, Share<BigZp>>>).UnderTest.Result;
                shares1[i] = result.Item1.Value;
                shares2[i] = result.Item2.Value;
                i++;
            }

            var val1 = BigShamirSharing.Recombine(new List<BigZp>(shares1), (int)Math.Ceiling(q.Size / 3.0) - 1, prime);
            var val2 = BigShamirSharing.Recombine(new List<BigZp>(shares2), (int)Math.Ceiling(q.Size / 3.0) - 1, prime);

            Console.WriteLine(val1 + " " + val2);
        }
コード例 #19
0
ファイル: TestApp.cs プロジェクト: mahdiz/mpclib
        public static void SetupShareMultiplicationProtocol(Quorum quorum)
        {
            int n = quorum.Size;
            var polyDeg = (int)Math.Ceiling(n / 3.0) - 1;

            var sharesA = BigShamirSharing.Share(new BigZp(prime, 20), n, polyDeg);
            var sharesB = BigShamirSharing.Share(new BigZp(prime, 3), n, polyDeg);

            for (int i = 0; i < n; i++)
            {
                TestParty<Share<BigZp>> party = new TestParty<Share<BigZp>>();
                party.UnderTest = new ShareMultiplicationProtocol(party, quorum.Clone() as Quorum, new Share<BigZp>(sharesA[i]), new Share<BigZp>(sharesB[i]));
                NetSimulator.RegisterParty(party);
            }
        }
コード例 #20
0
ファイル: QuorumProtocol.cs プロジェクト: mahdiz/mpclib
 public QuorumProtocol(Party me, Quorum quorum)
     : this(me, quorum, quorum.GetNextProtocolId())
 {
 }