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); }
public virtual object Clone() { Quorum q = (Quorum)this.MemberwiseClone(); q.Members = new SortedSet <int>(Members); return(q); }
public override bool Equals(object obj) { if (!(obj is Quorum)) { return(false); } Quorum other = (Quorum)obj; // should be sufficient return(other.QuorumNumber == QuorumNumber); }
/* 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); } }
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); } }
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); } }
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); } }
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); } }
public QuorumProtocol(Party me, Quorum quorum, ulong protocolId) : base(me, quorum.Members, protocolId) { Quorum = quorum; }
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); } }
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(); }
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); }
// 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"); }
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; }
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); } }
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)); }
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); } }
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); }
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); } }
public QuorumProtocol(Party me, Quorum quorum) : this(me, quorum, quorum.GetNextProtocolId()) { }