Пример #1
0
        public void TestHDPathTryParse()
        {
            Assert.True(HDPath.TryParse("", out var p));
            Assert.Equal("m", p.ToString());

            Assert.True(HDPath.TryParse("m", out p));
            Assert.Equal("m", p.ToString());

            Assert.True(HDPath.TryParse("/", out p));
            Assert.Equal("m", p.ToString());

            Assert.True(HDPath.TryParse("m/", out p));
            Assert.Equal("m", p.ToString());

            Assert.True(HDPath.TryParse("1", out p));
            Assert.Equal("m/1", p.ToString());

            Assert.True(HDPath.TryParse("/1", out p));
            Assert.Equal("m/1", p.ToString());

            Assert.True(HDPath.TryParse("m/1", out p));
            Assert.Equal("m/1", p.ToString());

            Assert.True(HDPath.TryParse("m/1/2'/3h", out p));
            Assert.Equal("m/1/2'/3'", p.ToString());

            Assert.False(HDPath.TryParse(null, out _));
            Assert.False(HDPath.TryParse("m/1//2", out _));
            Assert.False(HDPath.TryParse("m/m", out _));
            Assert.False(HDPath.TryParse("m/-1", out _));
            Assert.False(HDPath.TryParse($"m/{0x80000000u}", out _));
        }
Пример #2
0
        public void TestHDKeyGenerationNist()
        {
            var path       = new HDPath("m/44/1729/0/0/1");
            var key        = new HDKey(ECKind.NistP256);
            var derived    = key.Derive(path);
            var pubDerived = key.HDPubKey.Derive(path);

            Assert.Equal(derived.Address, pubDerived.Address);
        }
Пример #3
0
        public void TestHdKeyGenerationSecp()
        {
            var path       = new HDPath("m/44/1729/0/0/0");
            var key        = new HDKey(ECKind.Secp256k1);
            var anotherKey = new HDKey(ECKind.Secp256k1);

            Assert.NotEqual(key.Address, anotherKey.Address);

            var derived    = key.Derive(path);
            var pubDerived = key.HDPubKey.Derive(path);

            Assert.Equal(derived.Address, pubDerived.Address);
        }
Пример #4
0
        public void TestHDPathParse()
        {
            Assert.Equal("m", HDPath.Parse("").ToString());
            Assert.Equal("m", HDPath.Parse("m").ToString());
            Assert.Equal("m", HDPath.Parse("/").ToString());
            Assert.Equal("m", HDPath.Parse("m/").ToString());
            Assert.Equal("m/1", HDPath.Parse("1").ToString());
            Assert.Equal("m/1", HDPath.Parse("/1").ToString());
            Assert.Equal("m/1", HDPath.Parse("m/1").ToString());
            Assert.Equal("m/1/2'/3'", HDPath.Parse("m/1/2'/3h").ToString());

            Assert.Throws <ArgumentNullException>(() => HDPath.Parse(null));
            Assert.Throws <FormatException>(() => HDPath.Parse("m/1//2"));
            Assert.Throws <FormatException>(() => HDPath.Parse("m/m"));
            Assert.Throws <FormatException>(() => HDPath.Parse("m/-1"));
            Assert.Throws <FormatException>(() => HDPath.Parse($"m/{0x80000000u}"));
        }
Пример #5
0
        static void TestPublicKeyDerivation(string path, string seed, ECKind kind = ECKind.Secp256k1)
        {
            var masterKey    = HDKey.FromSeed(Hex.Parse(seed), kind);
            var masterPubKey = masterKey.HDPubKey;

            foreach (var uind in HDPath.Parse(path))
            {
                var childKey    = masterKey.Derive((int)(uind & 0x7FFFFFFF), (uind & 0x80000000) != 0);
                var childPubKey = childKey.HDPubKey;

                if ((uind & 0x80000000) == 0)
                {
                    var derivedPubKey = masterPubKey.Derive((int)uind);
                    Assert.Equal(derivedPubKey.PubKey.GetBase58(), childPubKey.PubKey.GetBase58());
                    Assert.Equal(Hex.Convert(derivedPubKey.ChainCode), Hex.Convert(childPubKey.ChainCode));
                }

                masterKey    = childKey;
                masterPubKey = childPubKey;
            }
        }