Example #1
0
        private void RunNSenders(
            int n, int f,
            DeliveryServiceMode mode = DeliveryServiceMode.TAKE_RANDOM,
            double repeatProbability = .0
            )
        {
            SetUpAllHonestNSenders(n, f);
            _deliveryService.RepeatProbability = repeatProbability;
            _deliveryService.Mode = mode;
            var rnd         = new Random();
            var mutePlayers = new List <int>();

            while (_deliveryService.MutedPlayers.Count < f)
            {
                var tmp = rnd.Next(0, n);
                _deliveryService.MutePlayer(tmp);
                mutePlayers.Add(tmp);
            }

            for (var i = 0; i < n; ++i)
            {
                _broadcasters[i].InternalRequest(new ProtocolRequest <ReliableBroadcastId, EncryptedShare?>
                                                     (_resultInterceptors[i].Id, new ReliableBroadcastId(i, 0), _testShare));

                for (var j = 0; j < n; ++j)
                {
                    if (j == i)
                    {
                        continue;
                    }
                    _broadcasters[i].InternalRequest(new ProtocolRequest <ReliableBroadcastId, EncryptedShare?>
                                                         (_resultInterceptors[i].Id, new ReliableBroadcastId(j, 0), null));
                }
            }


            for (var i = 0; i < n; ++i)
            {
                if (!mutePlayers.Contains(i))
                {
                    _broadcasts[i].WaitFinish();
                }
            }

            for (var i = 0; i < n; ++i)
            {
                if (!mutePlayers.Contains(i))
                {
                    Assert.AreEqual(_testShare, _resultInterceptors[i].Result);
                }
            }

            for (var i = 0; i < n; ++i)
            {
                if (!mutePlayers.Contains(i))
                {
                    Assert.IsTrue(_broadcasts[i].Terminated, $"protocol {i} did not terminate");
                }
            }
        }
Example #2
0
        private void TestAllCommonSubset(int n, int f, DeliveryServiceMode mode = DeliveryServiceMode.TAKE_FIRST)
        {
            SetUpAllHonest(n, f);
            _deliveryService.Mode = mode;
            var inputs = new List <EncryptedShare>();
            var rnd    = new byte[32];

            _rnd.NextBytes(rnd);
            for (var i = 0; i < n; ++i)
            {
                var testShare = new EncryptedShare(G1.Generator, rnd, G2.Generator, i);
                inputs.Add(testShare);
                _broadcasters[i].InternalRequest(new ProtocolRequest <CommonSubsetId, EncryptedShare>(
                                                     _resultInterceptors[i].Id, (_acs[i].Id as CommonSubsetId) !, testShare
                                                     ));
            }

            for (var i = 0; i < n; ++i)
            {
                if (_deliveryService.MutedPlayers.Contains(i))
                {
                    continue;
                }
                _acs[i].WaitResult();
            }

            _deliveryService.WaitFinish();
            for (var i = 0; i < n; ++i)
            {
                _broadcasters[i].Terminate();
                foreach (var id in _broadcasters[i].Registry.Keys)
                {
                    Assert.NotNull(id);
                    var protocol = _broadcasters[i].GetProtocolById(id);
                    if (protocol == null)
                    {
                        continue;
                    }
                    protocol.Terminate();
                    protocol.WaitFinish();
                }
            }

            var outputs = new List <ISet <EncryptedShare> >();

            for (var i = 0; i < n; ++i)
            {
                Assert.IsTrue(_acs[i].Terminated, $"protocol {i} did not terminated");
                Assert.AreEqual(_resultInterceptors[i].ResultSet, 1,
                                $"protocol {i} has emitted result not once but {_resultInterceptors[i].ResultSet}");
                Assert.AreEqual(n, _resultInterceptors[i].Result.Count);

                outputs.Add(_resultInterceptors[i].Result);
            }

            CheckOutput(n, f, inputs.ToArray(), outputs.ToArray());
        }
Example #3
0
        public void RunBinaryAgreementRandom(
            int n, int f, DeliveryServiceMode mode,
            int muteCnt = 0, double repeatProbability = .0
            )
        {
            SetUpAllHonest(n, f);
            _deliveryService.RepeatProbability = repeatProbability;
            _deliveryService.Mode = mode;
            while (_deliveryService.MutedPlayers.Count < muteCnt)
            {
                _deliveryService.MutePlayer(_rnd.Next(0, n));
            }

            var used = new BoolSet();

            for (var i = 0; i < n; ++i)
            {
                var cur = _rnd.Next() % 2 == 1;
                used = used.Add(cur);
                _broadcasters[i].InternalRequest(new ProtocolRequest <BinaryAgreementId, bool>(
                                                     _resultInterceptors[i].Id, (_broadcasts[i].Id as BinaryAgreementId) !, cur
                                                     ));
            }

            for (var i = 0; i < n; ++i)
            {
                if (_deliveryService.MutedPlayers.Contains(i))
                {
                    continue;
                }
                _broadcasts[i].WaitResult();
            }

            _deliveryService.WaitFinish();

            for (var i = 0; i < n; ++i)
            {
                if (_deliveryService.MutedPlayers.Contains(i))
                {
                    continue;
                }

                Assert.AreEqual(
                    _resultInterceptors[i].ResultSet, 1,
                    $"protocol has {i} emitted result not once but {_resultInterceptors[i].ResultSet}"
                    );
            }

            bool?res = null;

            for (var i = 0; i < n; ++i)
            {
                if (_deliveryService.MutedPlayers.Contains(i))
                {
                    continue;
                }
                var ans = _resultInterceptors[i].Result;
                res ??= ans;
                Assert.AreEqual(res, _resultInterceptors[i].Result);
            }

            Assert.IsNotNull(res);
            Assert.True(used.Contains(res !.Value));

            for (var i = 0; i < n; ++i)
            {
                _broadcasts[i].Terminate();
                _broadcasts[i].WaitFinish();
            }
        }
Example #4
0
        private static ThresholdKeyring[] SimulateKeygen(int n, int f, DeliveryServiceMode mode)
        {
            var ecdsaKeys = Enumerable.Range(0, n)
                            .Select(_ => Crypto.GeneratePrivateKey())
                            .Select(x => x.ToPrivateKey())
                            .Select(x => new EcdsaKeyPair(x))
                            .ToArray();

            var keyGens = Enumerable.Range(0, n)
                          .Select(i => new TrustlessKeygen(ecdsaKeys[i], ecdsaKeys.Select(x => x.PublicKey), f, 0))
                          .ToArray();


            var messageLedger = new RandomSamplingQueue <QueueItem>();

            messageLedger.Enqueue(new QueueItem(-1, null));

            var curKeys = keyGens.Select(_ => (ThresholdKeyring?)null).ToArray();

            while (messageLedger.Count > 0)
            {
                QueueItem?msg;
                var       success = mode switch
                {
                    DeliveryServiceMode.TAKE_FIRST => messageLedger.TryDequeue(out msg),
                    DeliveryServiceMode.TAKE_LAST => messageLedger.TryTakeLast(out msg),
                    DeliveryServiceMode.TAKE_RANDOM => messageLedger.TrySample(out msg),
                    _ => throw new NotImplementedException($"Unknown mode {mode}")
                };
                Assert.IsTrue(success);
                switch (msg?.payload)
                {
                case null:
                    for (var i = 0; i < n; ++i)
                    {
                        messageLedger.Enqueue(new QueueItem(i, keyGens[i].StartKeygen()));
                    }
                    break;

                case CommitMessage commitMessage:
                    for (var i = 0; i < n; ++i)
                    {
                        messageLedger.Enqueue(new QueueItem(i, keyGens[i].HandleCommit(msg.sender, commitMessage)));
                    }
                    break;

                case ValueMessage valueMessage:
                    for (var i = 0; i < n; ++i)
                    {
                        keyGens[i].HandleSendValue(msg.sender, valueMessage);
                    }
                    break;

                default:
                    Assert.Fail($"Message of type {msg.GetType()} occurred");
                    break;
                }

                for (var i = 0; i < n; ++i)
                {
                    var curKey = keyGens[i].TryGetKeys();
                    if (curKey is null)
                    {
                        Assert.AreEqual(null, curKeys[i]);
                        continue;
                    }

                    if (!curKeys[i].HasValue)
                    {
                        curKeys[i] = curKey;
                        continue;
                    }

                    Assert.IsTrue(curKey.Value.TpkePrivateKey.ToBytes()
                                  .SequenceEqual(curKeys[i] !.Value.TpkePrivateKey.ToBytes()));
                    Assert.AreEqual(curKey.Value.PublicPartHash(), curKeys[i] !.Value.PublicPartHash());
                }

                for (var i = 0; i < n; ++i)
                {
                    keyGens[i] = TestSerializationRoundTrip(keyGens[i], ecdsaKeys[i]);
                }
            }

            for (var i = 0; i < n; ++i)
            {
                Assert.IsTrue(keyGens[i].Finished());
                Assert.AreNotEqual(curKeys[i], null);
            }

            var keys = keyGens
                       .Select(x => x.TryGetKeys() ?? throw new Exception())
                       .ToArray();

            for (var i = 0; i < n; ++i)
            {
                Assert.AreEqual(keys[0].TpkePublicKey, keys[i].TpkePublicKey);
                Assert.AreEqual(keys[0].ThresholdSignaturePublicKeySet, keys[i].ThresholdSignaturePublicKeySet);
            }

            return(keys);
        }