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