Example #1
0
        public static Script ParseScript(string s)
        {
            MemoryStream result = new MemoryStream();

            if (mapOpNames.Count == 0)
            {
                mapOpNames = new Dictionary <string, OpcodeType>(Op._OpcodeByName);
                foreach (var kv in mapOpNames.ToArray())
                {
                    if (kv.Key.StartsWith("OP_", StringComparison.Ordinal))
                    {
                        var name = kv.Key.Substring(3, kv.Key.Length - 3);
                        mapOpNames.AddOrReplace(name, kv.Value);
                    }
                }
            }

            var words = s.Split(' ', '\t', '\n');

            foreach (string w in words)
            {
                if (w == "")
                {
                    continue;
                }
                if (w.All(l => l.IsDigit()) ||
                    (w.StartsWith("-") && w.Substring(1).All(l => l.IsDigit())))
                {
                    // Number
                    long n = long.Parse(w);
                    Op.GetPushOp(new BigInteger(n)).WriteTo(result);
                }
                else if (w.StartsWith("0x") && HexEncoder.IsWellFormed(w.Substring(2)))
                {
                    // Raw hex data, inserted NOT pushed onto stack:
                    var raw = Encoders.Hex.DecodeData(w.Substring(2));
                    result.Write(raw, 0, raw.Length);
                }
                else if (w.Length >= 2 && w.StartsWith("'") && w.EndsWith("'"))
                {
                    // Single-quoted string, pushed as data. NOTE: this is poor-man's
                    // parsing, spaces/tabs/newlines in single-quoted strings won't work.
                    var b = TestUtils.ToBytes(w.Substring(1, w.Length - 2));
                    Op.GetPushOp(b).WriteTo(result);
                }
                else if (mapOpNames.ContainsKey(w))
                {
                    // opcode, e.g. OP_ADD or ADD:
                    result.WriteByte((byte)mapOpNames[w]);
                }
                else
                {
                    Assert.True(false, "Invalid test");
                    return(null);
                }
            }

            return(new Script(result.ToArray()));
        }
Example #2
0
        public static Script ParseScript(string s)
        {
            MemoryStream result = new MemoryStream();

            if (mapOpNames.Count == 0)
            {
                for (int op = 0; op <= (byte)OpcodeType.OP_NOP10; op++)
                {
                    // Allow OP_RESERVED to get into mapOpNames
                    if (op < (byte)OpcodeType.OP_NOP && op != (byte)OpcodeType.OP_RESERVED)
                    {
                        continue;
                    }

                    var name = Op.GetOpName((OpcodeType)op);
                    if (name == "OP_UNKNOWN")
                    {
                        continue;
                    }
                    string strName = name;
                    mapOpNames[strName] = (OpcodeType)op;
                    // Convenience: OP_ADD and just ADD are both recognized:
                    strName             = strName.Replace("OP_", "");
                    mapOpNames[strName] = (OpcodeType)op;
                }
            }

            var words = s.Split(' ', '\t', '\n');

            foreach (string w in words)
            {
                if (w == "")
                {
                    continue;
                }
                if (w.All(l => Money.isdigit(l)) ||
                    (w.StartsWith("-") && w.Substring(1).All(l => Money.isdigit(l))))
                {
                    // Number
                    long n = long.Parse(w);
                    Op.GetPushOp(new BigInteger(n)).WriteTo(result);
                }
                else if (w.StartsWith("0x") && HexEncoder.IsWellFormed(w.Substring(2)))
                {
                    // Raw hex data, inserted NOT pushed onto stack:
                    var raw = Encoders.Hex.DecodeData(w.Substring(2));
                    result.Write(raw, 0, raw.Length);
                }
                else if (w.Length >= 2 && w.StartsWith("'") && w.EndsWith("'"))
                {
                    // Single-quoted string, pushed as data. NOTE: this is poor-man's
                    // parsing, spaces/tabs/newlines in single-quoted strings won't work.
                    var b = TestUtils.ToBytes(w.Substring(1, w.Length - 2));
                    Op.GetPushOp(b).WriteTo(result);
                }
                else if (mapOpNames.ContainsKey(w))
                {
                    // opcode, e.g. OP_ADD or ADD:
                    result.WriteByte((byte)mapOpNames[w]);
                }
                else
                {
                    Assert.True(false, "Invalid test");
                    return(null);
                }
            }

            return(new Script(result.ToArray()));
        }
Example #3
0
        private byte[] ToBytes(string data)
        {
            var b = TestUtils.ToBytes(data);

            return(b);
        }
        public void key_test1()
        {
            BitcoinSecret bsecret1  = this.networkMain.CreateBitcoinSecret(strSecret1);
            BitcoinSecret bsecret2  = this.networkMain.CreateBitcoinSecret(strSecret2);
            BitcoinSecret bsecret1C = this.networkMain.CreateBitcoinSecret(strSecret1C);
            BitcoinSecret bsecret2C = this.networkMain.CreateBitcoinSecret(strSecret2C);

            Assert.Throws <FormatException>(() => this.networkMain.CreateBitcoinSecret(strAddressBad));

            Key key1 = bsecret1.PrivateKey;

            Assert.True(key1.IsCompressed == false);
            Assert.True(bsecret1.Copy(true).PrivateKey.IsCompressed == true);
            Assert.True(bsecret1.Copy(true).Copy(false).IsCompressed == false);
            Assert.True(bsecret1.Copy(true).Copy(false).ToString() == bsecret1.ToString());
            Key key2 = bsecret2.PrivateKey;

            Assert.True(key2.IsCompressed == false);
            Key key1C = bsecret1C.PrivateKey;

            Assert.True(key1C.IsCompressed == true);
            Key key2C = bsecret2C.PrivateKey;

            Assert.True(key1C.IsCompressed == true);

            PubKey pubkey1  = key1.PubKey;
            PubKey pubkey2  = key2.PubKey;
            PubKey pubkey1C = key1C.PubKey;
            PubKey pubkey2C = key2C.PubKey;

            Assert.True(this.addr1.Hash == pubkey1.Hash);
            Assert.True(this.addr2.Hash == pubkey2.Hash);
            Assert.True(this.addr1C.Hash == pubkey1C.Hash);
            Assert.True(this.addr2C.Hash == pubkey2C.Hash);



            for (int n = 0; n < 16; n++)
            {
                string strMsg = String.Format("Very secret message {0}: 11", n);
                if (n == 10)
                {
                    //Test one long message
                    strMsg = String.Join(",", Enumerable.Range(0, 2000).Select(i => i.ToString()).ToArray());
                }
                uint256 hashMsg = Hashes.Hash256(TestUtils.ToBytes(strMsg));

                // normal signatures

                ECDSASignature sign1 = null, sign2 = null, sign1C = null, sign2C = null;
                var            tasks = new List <Task>();
                tasks.Add(Task.Run(() => sign1  = key1.Sign(hashMsg)));
                tasks.Add(Task.Run(() => sign2  = key2.Sign(hashMsg)));
                tasks.Add(Task.Run(() => sign1C = key1C.Sign(hashMsg)));
                tasks.Add(Task.Run(() => sign2C = key2C.Sign(hashMsg)));
                Task.WaitAll(tasks.ToArray());
                tasks.Clear();

                tasks.Add(Task.Run(() => Assert.True(pubkey1.Verify(hashMsg, sign1))));
                tasks.Add(Task.Run(() => Assert.True(pubkey2.Verify(hashMsg, sign2))));
                tasks.Add(Task.Run(() => Assert.True(pubkey1C.Verify(hashMsg, sign1C))));
                tasks.Add(Task.Run(() => Assert.True(pubkey2C.Verify(hashMsg, sign2C))));
                Task.WaitAll(tasks.ToArray());
                tasks.Clear();

                tasks.Add(Task.Run(() => Assert.True(pubkey1.Verify(hashMsg, sign1))));
                tasks.Add(Task.Run(() => Assert.True(!pubkey1.Verify(hashMsg, sign2))));
                tasks.Add(Task.Run(() => Assert.True(pubkey1.Verify(hashMsg, sign1C))));
                tasks.Add(Task.Run(() => Assert.True(!pubkey1.Verify(hashMsg, sign2C))));

                tasks.Add(Task.Run(() => Assert.True(!pubkey2.Verify(hashMsg, sign1))));
                tasks.Add(Task.Run(() => Assert.True(pubkey2.Verify(hashMsg, sign2))));
                tasks.Add(Task.Run(() => Assert.True(!pubkey2.Verify(hashMsg, sign1C))));
                tasks.Add(Task.Run(() => Assert.True(pubkey2.Verify(hashMsg, sign2C))));

                tasks.Add(Task.Run(() => Assert.True(pubkey1C.Verify(hashMsg, sign1))));
                tasks.Add(Task.Run(() => Assert.True(!pubkey1C.Verify(hashMsg, sign2))));
                tasks.Add(Task.Run(() => Assert.True(pubkey1C.Verify(hashMsg, sign1C))));
                tasks.Add(Task.Run(() => Assert.True(!pubkey1C.Verify(hashMsg, sign2C))));

                tasks.Add(Task.Run(() => Assert.True(!pubkey2C.Verify(hashMsg, sign1))));
                tasks.Add(Task.Run(() => Assert.True(pubkey2C.Verify(hashMsg, sign2))));
                tasks.Add(Task.Run(() => Assert.True(!pubkey2C.Verify(hashMsg, sign1C))));
                tasks.Add(Task.Run(() => Assert.True(pubkey2C.Verify(hashMsg, sign2C))));

                Task.WaitAll(tasks.ToArray());
                tasks.Clear();

                // compact signatures (with key recovery)

                byte[] csign1 = null, csign2 = null, csign1C = null, csign2C = null;

                tasks.Add(Task.Run(() => csign1  = key1.SignCompact(hashMsg)));
                tasks.Add(Task.Run(() => csign2  = key2.SignCompact(hashMsg)));
                tasks.Add(Task.Run(() => csign1C = key1C.SignCompact(hashMsg)));
                tasks.Add(Task.Run(() => csign2C = key2C.SignCompact(hashMsg)));
                Task.WaitAll(tasks.ToArray());
                tasks.Clear();

                PubKey rkey1 = null, rkey2 = null, rkey1C = null, rkey2C = null;
                tasks.Add(Task.Run(() => rkey1  = PubKey.RecoverCompact(hashMsg, csign1)));
                tasks.Add(Task.Run(() => rkey2  = PubKey.RecoverCompact(hashMsg, csign2)));
                tasks.Add(Task.Run(() => rkey1C = PubKey.RecoverCompact(hashMsg, csign1C)));
                tasks.Add(Task.Run(() => rkey2C = PubKey.RecoverCompact(hashMsg, csign2C)));
                Task.WaitAll(tasks.ToArray());
                tasks.Clear();

                Assert.True(rkey1.ToHex() == pubkey1.ToHex());
                Assert.True(rkey2.ToHex() == pubkey2.ToHex());
                Assert.True(rkey1C.ToHex() == pubkey1C.ToHex());
                Assert.True(rkey2C.ToHex() == pubkey2C.ToHex());
            }
        }
Example #5
0
        public void key_test1()
        {
            BitcoinSecret bsecret1  = Network.Main.CreateBitcoinSecret(strSecret1);
            BitcoinSecret bsecret2  = Network.Main.CreateBitcoinSecret(strSecret2);
            BitcoinSecret bsecret1C = Network.Main.CreateBitcoinSecret(strSecret1C);
            BitcoinSecret bsecret2C = Network.Main.CreateBitcoinSecret(strSecret2C);

            Assert.Throws <FormatException>(() => Network.Main.CreateBitcoinSecret(strAddressBad));

            Key key1 = bsecret1.PrivateKey;

            Assert.True(key1.IsCompressed == false);
            Assert.True(bsecret1.Copy(true).PrivateKey.IsCompressed == true);
            Assert.True(bsecret1.Copy(true).Copy(false).IsCompressed == false);
            Assert.True(bsecret1.Copy(true).Copy(false).ToString() == bsecret1.ToString());
            Key key2 = bsecret2.PrivateKey;

            Assert.True(key2.IsCompressed == false);
            Key key1C = bsecret1C.PrivateKey;

            Assert.True(key1C.IsCompressed == true);
            Key key2C = bsecret2C.PrivateKey;

            Assert.True(key1C.IsCompressed == true);

            PubKey pubkey1  = key1.PubKey;
            PubKey pubkey2  = key2.PubKey;
            PubKey pubkey1C = key1C.PubKey;
            PubKey pubkey2C = key2C.PubKey;

            Assert.True(addr1.Hash == pubkey1.Hash);
            Assert.True(addr2.Hash == pubkey2.Hash);
            Assert.True(addr1C.Hash == pubkey1C.Hash);
            Assert.True(addr2C.Hash == pubkey2C.Hash);


            for (int n = 0; n < 16; n++)
            {
                string strMsg = String.Format("Very secret message {0}: 11", n);
                if (n == 10)
                {
                    //Test one long message
                    strMsg = String.Join(",", Enumerable.Range(0, 2000).Select(i => i.ToString()).ToArray());
                }
                uint256 hashMsg = Hashes.DoubleSHA256(TestUtils.ToBytes(strMsg));

                // normal signatures

                ECDSASignature sign1 = null, sign2 = null, sign1C = null, sign2C = null;
                List <Task>    tasks = new List <Task>();
                sign1  = key1.Sign(hashMsg);
                sign2  = key2.Sign(hashMsg);
                sign1C = key1C.Sign(hashMsg);
                sign2C = key2C.Sign(hashMsg);

                for (int i = 0; i < 30; i++)
                {
                    Assert.True(pubkey1.Verify(hashMsg, sign1));
                    Assert.True(pubkey2.Verify(hashMsg, sign2));
                    Assert.True(pubkey1C.Verify(hashMsg, sign1C));
                    Assert.True(pubkey2C.Verify(hashMsg, sign2C));

                    Assert.True(pubkey1.Verify(hashMsg, sign1));
                    Assert.True(!pubkey1.Verify(hashMsg, sign2));
                    Assert.True(pubkey1.Verify(hashMsg, sign1C));
                    Assert.True(!pubkey1.Verify(hashMsg, sign2C));

                    Assert.True(!pubkey2.Verify(hashMsg, sign1));
                    Assert.True(pubkey2.Verify(hashMsg, sign2));
                    Assert.True(!pubkey2.Verify(hashMsg, sign1C));
                    Assert.True(pubkey2.Verify(hashMsg, sign2C));

                    Assert.True(pubkey1C.Verify(hashMsg, sign1));
                    Assert.True(!pubkey1C.Verify(hashMsg, sign2));
                    Assert.True(pubkey1C.Verify(hashMsg, sign1C));
                    Assert.True(!pubkey1C.Verify(hashMsg, sign2C));

                    Assert.True(!pubkey2C.Verify(hashMsg, sign1));
                    Assert.True(pubkey2C.Verify(hashMsg, sign2));
                    Assert.True(!pubkey2C.Verify(hashMsg, sign1C));
                    Assert.True(pubkey2C.Verify(hashMsg, sign2C));
                }
                // compact signatures (with key recovery)

                byte[] csign1 = null, csign2 = null, csign1C = null, csign2C = null;

                csign1  = key1.SignCompact(hashMsg);
                csign2  = key2.SignCompact(hashMsg);
                csign1C = key1C.SignCompact(hashMsg);
                csign2C = key2C.SignCompact(hashMsg);

                PubKey rkey1 = null, rkey2 = null, rkey1C = null, rkey2C = null;
                rkey1  = PubKey.RecoverCompact(hashMsg, csign1);
                rkey2  = PubKey.RecoverCompact(hashMsg, csign2);
                rkey1C = PubKey.RecoverCompact(hashMsg, csign1C);
                rkey2C = PubKey.RecoverCompact(hashMsg, csign2C);

                Assert.True(rkey1.ToHex() == pubkey1.ToHex());
                Assert.True(rkey2.ToHex() == pubkey2.ToHex());
                Assert.True(rkey1C.ToHex() == pubkey1C.ToHex());
                Assert.True(rkey2C.ToHex() == pubkey2C.ToHex());

                Assert.True(sign1.IsLowR && sign1.ToDER().Length <= 70);
                Assert.True(sign2.IsLowR && sign2.ToDER().Length <= 70);
                Assert.True(sign1C.IsLowR && sign1C.ToDER().Length <= 70);
                Assert.True(sign2C.IsLowR && sign2C.ToDER().Length <= 70);
            }
        }