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); }
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}"); }