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));
            }
        }
Exemple #2
0
 public CommonCoin(
     CoinId coinId, IPublicConsensusKeySet wallet, PrivateKeyShare privateKeyShare,
     IConsensusBroadcaster broadcaster
     ) : base(wallet, coinId, broadcaster)
 {
     _coinId          = coinId ?? throw new ArgumentNullException(nameof(coinId));
     _thresholdSigner = new ThresholdSigner(
         _coinId.ToBytes(), privateKeyShare, wallet.ThresholdSignaturePublicKeySet
         );
     _result = null;
 }