示例#1
0
        private void SetUpAllHonest(int n, int f)
        {
            _deliveryService    = new DeliveryService();
            _broadcasts         = new IConsensusProtocol[n];
            _broadcasters       = new IConsensusBroadcaster[n];
            _resultInterceptors = new ProtocolInvoker <BinaryAgreementId, bool> [n];
            _privateKeys        = new IPrivateConsensusKeySet[n];
            var keygen  = new TrustedKeyGen(n, f);
            var shares  = keygen.GetPrivateShares().ToArray();
            var pubKeys = new PublicKeySet(shares.Select(share => share.GetPublicKeyShare()), f);

            _publicKeys = new PublicConsensusKeySet(n, f, null !, pubKeys, Enumerable.Empty <ECDSAPublicKey>());
            for (var i = 0; i < n; ++i)
            {
                _resultInterceptors[i] = new ProtocolInvoker <BinaryAgreementId, bool>();
                _privateKeys[i]        = new PrivateConsensusKeySet(null !, null !, shares[i]);
                _broadcasters[i]       = new BroadcastSimulator(i, _publicKeys, _privateKeys[i], _deliveryService, true);
            }

            for (uint i = 0; i < n; ++i)
            {
                _broadcasts[i] = new BinaryAgreement(new BinaryAgreementId(0, 0), _publicKeys, _broadcasters[i]);
                _broadcasters[i].RegisterProtocols(new[] { _broadcasts[i], _resultInterceptors[i] });
            }
        }
示例#2
0
        public void ThresholdKeyGen()
        {
            const int n = 7, f = 2;
            var keygen = new TrustedKeyGen(n, f);
            var shares = keygen.GetPrivateShares().ToArray();
            var data = 0xdeadbeef.ToBytes().ToArray();
            var pubKeys = new PublicKeySet(shares.Select(share => share.GetPublicKeyShare()), f);
            var signers = new IThresholdSigner[n];
            for (var i = 0; i < n; ++i)
            {
                signers[i] = new ThresholdSigner(data, shares[i], pubKeys);
            }

            var signatureShares = signers.Select(signer => signer.Sign()).ToArray();
            var sigs = new Signature[n];
            var success = new bool[n];
            for (var i = 0; i < n; ++i) success[i] = true;
            for (var i = 0; i < n; ++i)
            {
                for (var j = 0; j < n; ++j)
                {
                    success[i] &= signers[i].AddShare(j, signatureShares[j], out var sig);
                    if (sigs[i] == null && sig != null)
                        sigs[i] = sig;
                }
            }

            for (int i = 0; i < n; ++i)
            {
                Assert.IsTrue(success[i], $"Player {i} did not terminate successfully");
                Assert.IsTrue(pubKeys.SharedPublicKey.ValidateSignature(sigs[i], data));
            }
        }
示例#3
0
        public void SetUp(int n, int f)
        {
            _deliveryService    = new DeliveryService();
            _broadcasts         = new IConsensusProtocol[n];
            _broadcasters       = new IConsensusBroadcaster[n];
            _resultInterceptors = new ProtocolInvoker <HoneyBadgerId, ISet <IRawShare> > [n];
            var keygen     = new TrustedKeyGen(n, f);
            var shares     = keygen.GetPrivateShares().ToArray();
            var pubKeys    = new PublicKeySet(shares.Select(share => share.GetPublicKeyShare()), f);
            var tpkeKeygen = new Crypto.TPKE.TrustedKeyGen(n, f);

            var ecdsaKeys = Enumerable.Range(0, n)
                            .Select(i => Crypto.GenerateRandomBytes(32))
                            .Select(x => x.ToPrivateKey())
                            .Select(k => new EcdsaKeyPair(k))
                            .ToArray();

            _publicKeys = new PublicConsensusKeySet(n, f, tpkeKeygen.GetPubKey(), pubKeys,
                                                    ecdsaKeys.Select(k => k.PublicKey));
            _privateKeys = new IPrivateConsensusKeySet[n];
            for (var i = 0; i < n; ++i)
            {
                _resultInterceptors[i] = new ProtocolInvoker <HoneyBadgerId, ISet <IRawShare> >();
                _privateKeys[i]        = new PrivateConsensusKeySet(ecdsaKeys[i], tpkeKeygen.GetPrivKey(i), shares[i]);
                _broadcasters[i]       = new BroadcastSimulator(i, _publicKeys, _privateKeys[i], _deliveryService, true);
            }
        }
示例#4
0
        public void ThresholdKeyGen()
        {
            var keygen = new TrustedKeyGen(N, F);

            var pubKey = keygen.GetPubKey();
            // var verificationKey = keygen.GetVerificationKey();
            var privKeyTmp = new List <PrivateKey>();

            for (var i = 0; i < N; ++i)
            {
                privKeyTmp.Add(keygen.GetPrivKey(i));
            }
            var privKey = privKeyTmp.ToArray();

            var len  = _rnd.Next() % 100 + 1;
            var data = new byte[len];

            _rnd.NextBytes(data);
            var share = new RawShare(data, Id);

            var enc = pubKey.Encrypt(share);

            var chosen = new HashSet <int>();

            while (chosen.Count < F)
            {
                chosen.Add(_rnd.Next(0, N - 1));
            }

            var parts = new List <PartiallyDecryptedShare>();

            foreach (var dec in chosen.Select(i => privKey[i].Decrypt(enc)))
            {
                // Assert.True(verificationKey.Verify(enc, dec));
                parts.Add(dec);
            }

            var share2 = pubKey.FullDecrypt(enc, parts);

            Assert.AreEqual(share.Id, share2.Id);
            for (var i = 0; i < len; ++i)
            {
                Assert.AreEqual(share.Data[i], share2.Data[i]);
            }
        }
示例#5
0
        public void SetUp(int n, int f)
        {
            var keygen  = new TrustedKeyGen(n, f);
            var shares  = keygen.GetPrivateShares().ToArray();
            var pubKeys = new PublicKeySet(shares.Select(share => share.GetPublicKeyShare()), f);

            _deliveryService    = new DeliveryService();
            _coins              = new IConsensusProtocol[n];
            _broadcasters       = new IConsensusBroadcaster[n];
            _resultInterceptors = new ProtocolInvoker <CoinId, CoinResult> [n];
            _wallets            = new IPrivateConsensusKeySet[n];
            _publicKeys         = new PublicConsensusKeySet(n, f, null !, pubKeys, Enumerable.Empty <ECDSAPublicKey>());
            for (var i = 0; i < n; ++i)
            {
                _resultInterceptors[i] = new ProtocolInvoker <CoinId, CoinResult>();
                _wallets[i]            = new PrivateConsensusKeySet(null !, null !, shares[i]);
                _broadcasters[i]       = new BroadcastSimulator(i, _publicKeys, _wallets[i], _deliveryService, false);
                _coins[i] = new CommonCoin(
                    new CoinId(0, 0, 0), _publicKeys, shares[i], _broadcasters[i]
                    );
                _broadcasters[i].RegisterProtocols(new[] { _coins[i], _resultInterceptors[i] });
            }
        }