public void CheckVerificationMalformedSignature() { var randomKey = KeyWallet.Create(); var from = wallet.GetAddress(); var to = new Address("hx5bfdb090f43a808005ffc27c25b213145e80b7cd"); var transaction = TransactionBuilder.CreateBuilder() .Nid(NetworkId.Main) .From(from) .To(to) .Value(BigInteger.Parse("0de0b6b3a7640000", NumberStyles.AllowHexSpecifier)) .StepLimit(BigInteger.Parse("12345", NumberStyles.AllowHexSpecifier)) .Timestamp(BigInteger.Parse("563a6cf330136", NumberStyles.AllowHexSpecifier)) .Nonce(BigInteger.Parse("1")) .Build(); var signedTransaction = new SignedTransaction(transaction, wallet); var transactionProps = signedTransaction.GetTransactionProperties(); var allProps = signedTransaction.GetProperties(); var hash = SignedTransaction.GetTransactionHash(transactionProps); var signature = Base64.Decode(allProps.GetItem("signature").ToString()); signature[64] = 212; var result = EcdsaSignature.VerifySignature(randomKey.GetAddress(), signature, hash); Assert.False(result); }
public static SignedTransaction Deserialize(string transactionSerialized) { var(transaction, rpcObject) = TransactionDeserializer.DeserializeToTransactionAndRpc(transactionSerialized); var signature = rpcObject.GetItem("signature"); if (signature == null) { throw new InvalidOperationException("Signature is not provided"); } var sign = Base64.Decode(signature.ToString()); var sender = transaction.GetFrom(); var props = GetTransactionProperties(transaction); var transactionHash = GetTransactionHash(props); if (!EcdsaSignature.VerifySignature(sender, sign, transactionHash)) { throw new ArgumentException("Signature does not match", nameof(transactionSerialized)); } var signedTransaction = new SignedTransaction(transaction, rpcObject); return(signedTransaction); }