Пример #1
0
        public bool HandleSendValue(int sender, ValueMessage message)
        {
            if (_keyGenStates[message.Proposer].Acks[sender])
            {
                throw new ArgumentException("Already handled this value");
            }
            _keyGenStates[message.Proposer].Acks[sender] = true;
            var myValue = Fr.FromBytes(Crypto.Secp256K1Decrypt(
                                           _keyPair.PrivateKey.Encode(), message.EncryptedValues[_myIdx]
                                           ));

            if (_keyGenStates[message.Proposer].Commitment is null)
            {
                throw new ArgumentException("Cannot handle value since there was no commitment yet");
            }
            if (!_keyGenStates[message.Proposer].Commitment !.Evaluate(_myIdx + 1, sender + 1)
                .Equals(G1.Generator * myValue)
                )
            {
                throw new ArgumentException("Decrypted value does not match commitment");
            }
            _keyGenStates[message.Proposer].Values[sender] = myValue;
            if (_keyGenStates[message.Proposer].ValueCount() > 2 * Faulty && !_finished.Contains(message.Proposer))
            {
                _finished.Add(message.Proposer);
            }

            if (_confirmSent)
            {
                return(false);
            }
            if (!Finished())
            {
                return(false);
            }
            _confirmSent = true;
            return(true);
        }
Пример #2
0
        public void Test_Secp256K1EncryptDecryptRoundTrip()
        {
            var key      = Crypto.GeneratePrivateKey();
            var baseText =
                "0xf86d808504a817c800832dc6c0948e7b7262e0fa4616566591d51f998f16a79fb547880de0b6b3a76400008025a0115105d96a43f41a5ea562bb3e591cbfa431a8cdae9c3030457adca2cb854f78a012fb41922c53c73473563003667ed8e783359c91d95b42301e1955d530b1ca33"
                .HexToBytes();

            const int n       = 1000;
            var       startTs = TimeUtils.CurrentTimeMillis();

            for (var it = 0; it < n; ++it)
            {
                var plaintext = baseText.Concat(it.ToBytes()).ToArray();
                var cipher    = Crypto.Secp256K1Encrypt(key.ToPrivateKey().GetPublicKey().EncodeCompressed(), plaintext);
                var decrypted = Crypto.Secp256K1Decrypt(key, cipher);
                Assert.IsTrue(plaintext.SequenceEqual(decrypted));
            }

            var endTs = TimeUtils.CurrentTimeMillis();

            Console.WriteLine($"{n} encrypt/decrypt: {endTs - startTs}ms, avg = {(double) (endTs - startTs) / n}");
        }