static void Main(string[] args) { var requester = new SchnorrBlinding.Requester(); var r = new Key(Encoders.Hex.DecodeData("31E151628AED2A6ABF7155809CF4F3C762E7160F38B4DA56B784D9045190CFA0")); var key = new Key(Encoders.Hex.DecodeData("B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF")); var message = new uint256(Encoders.Hex.DecodeData("243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89")); switch (args[0]) { case "blind-verify": var blindedMessage = requester.BlindMessage(message, r.PubKey, key.PubKey); Console.WriteLine(blindedMessage); var blindedSignatureInput = Console.ReadLine(); var blindedSignature2 = uint256.Parse(blindedSignatureInput); var unblindedSignature = requester.UnblindSignature(blindedSignature2); var success = SchnorrBlinding.VerifySignature(message, unblindedSignature, key.PubKey); Console.WriteLine(success); return; case "sign": var signer = new SchnorrBlinding.Signer(key, r); var blindedMessageInput = Console.ReadLine(); var blindedMessage2 = uint256.Parse(blindedMessageInput); var blindSignature = signer.Sign(blindedMessage2); Console.WriteLine(blindSignature); return; } }
public void BlindingSignature() { // Test with known values var requester = new SchnorrBlinding.Requester(); var r = new Key(Encoders.Hex.DecodeData("31E151628AED2A6ABF7155809CF4F3C762E7160F38B4DA56B784D9045190CFA0")); var key = new Key(Encoders.Hex.DecodeData("B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF")); var signer = new SchnorrBlinding.Signer(key, r); var message = new uint256(Encoders.Hex.DecodeData("243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89"), false); var blindedMessage = requester.BlindMessage(message, r.PubKey, key.PubKey); var blindSignature = signer.Sign(blindedMessage); var unblindedSignature = requester.UnblindSignature(blindSignature); Assert.True(SchnorrBlinding.VerifySignature(message, unblindedSignature, key.PubKey)); Assert.False(SchnorrBlinding.VerifySignature(uint256.Zero, unblindedSignature, key.PubKey)); Assert.False(SchnorrBlinding.VerifySignature(uint256.One, unblindedSignature, key.PubKey)); // Test with unknown values requester = new SchnorrBlinding.Requester(); signer = new SchnorrBlinding.Signer(new Key(), new Key()); message = NBitcoin.Crypto.Hashes.Hash256(Encoders.ASCII.DecodeData("Hello world!")); blindedMessage = requester.BlindMessage(message, signer.R.PubKey, signer.Key.PubKey); blindSignature = signer.Sign(blindedMessage); unblindedSignature = requester.UnblindSignature(blindSignature); Assert.True(SchnorrBlinding.VerifySignature(message, unblindedSignature, signer.Key.PubKey)); Assert.False(SchnorrBlinding.VerifySignature(uint256.One, unblindedSignature, signer.Key.PubKey)); Assert.False(SchnorrBlinding.VerifySignature(uint256.One, unblindedSignature, signer.Key.PubKey)); var newMessage = Encoders.ASCII.DecodeData("Hello, World!"); for (var i = 0; i < 1_000; i++) { requester = new SchnorrBlinding.Requester(); signer = new SchnorrBlinding.Signer(new Key()); blindedMessage = requester.BlindMessage(newMessage, signer.R.PubKey, signer.Key.PubKey); blindSignature = signer.Sign(blindedMessage); unblindedSignature = requester.UnblindSignature(blindSignature); Assert.True(signer.VerifyUnblindedSignature(unblindedSignature, newMessage)); } var ex = Assert.Throws <ArgumentException>(() => signer.Sign(uint256.Zero)); Assert.StartsWith("Invalid blinded message.", ex.Message); }