Skip to content

Commit f433092

Browse files
Add tests for HDWallet.BIP32.Ed25519
1 parent f13bcaa commit f433092

File tree

3 files changed

+294
-0
lines changed

3 files changed

+294
-0
lines changed

HDWallet.sln

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HDWallet.BIP32", "src\HDWal
8585
EndProject
8686
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HDWallet.BIP32.Ed25519", "src\HDWallet.BIP32.Ed25519\HDWallet.BIP32.Ed25519.csproj", "{083E0986-DF4A-4E86-9AB6-51C96F35D265}"
8787
EndProject
88+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HDWallet.BIP32.Ed25519.Tests", "test\HDWallet.BIP32.Ed25519.Tests\HDWallet.BIP32.Ed25519.Tests.csproj", "{7B1C5F91-3248-4837-8E82-617072C6A70E}"
89+
EndProject
8890
Global
8991
GlobalSection(SolutionConfigurationPlatforms) = preSolution
9092
Debug|Any CPU = Debug|Any CPU
@@ -563,6 +565,18 @@ Global
563565
{083E0986-DF4A-4E86-9AB6-51C96F35D265}.Release|x64.Build.0 = Release|Any CPU
564566
{083E0986-DF4A-4E86-9AB6-51C96F35D265}.Release|x86.ActiveCfg = Release|Any CPU
565567
{083E0986-DF4A-4E86-9AB6-51C96F35D265}.Release|x86.Build.0 = Release|Any CPU
568+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
569+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Debug|Any CPU.Build.0 = Debug|Any CPU
570+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Debug|x64.ActiveCfg = Debug|Any CPU
571+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Debug|x64.Build.0 = Debug|Any CPU
572+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Debug|x86.ActiveCfg = Debug|Any CPU
573+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Debug|x86.Build.0 = Debug|Any CPU
574+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Release|Any CPU.ActiveCfg = Release|Any CPU
575+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Release|Any CPU.Build.0 = Release|Any CPU
576+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Release|x64.ActiveCfg = Release|Any CPU
577+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Release|x64.Build.0 = Release|Any CPU
578+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Release|x86.ActiveCfg = Release|Any CPU
579+
{7B1C5F91-3248-4837-8E82-617072C6A70E}.Release|x86.Build.0 = Release|Any CPU
566580
EndGlobalSection
567581
GlobalSection(SolutionProperties) = preSolution
568582
HideSolutionNode = FALSE
@@ -607,6 +621,7 @@ Global
607621
{20DBFAAE-F823-48F6-A93A-E511667FFE80} = {73CF8F5A-07F9-477C-8F47-507158E4C68C}
608622
{DB944CE5-3658-4ACE-8482-FD525E122AC6} = {587DF704-BD3F-41FF-A468-289BB83BBEF7}
609623
{083E0986-DF4A-4E86-9AB6-51C96F35D265} = {587DF704-BD3F-41FF-A468-289BB83BBEF7}
624+
{7B1C5F91-3248-4837-8E82-617072C6A70E} = {73CF8F5A-07F9-477C-8F47-507158E4C68C}
610625
EndGlobalSection
611626
GlobalSection(ExtensibilityGlobals) = postSolution
612627
SolutionGuid = {A8055563-076B-434F-9578-B8CAA10E458E}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netcoreapp2.0</TargetFramework>
5+
<IsPackable>false</IsPackable>
6+
<LangVersion>7.2</LangVersion>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
11+
<PackageReference Include="MSTest.TestAdapter" Version="1.2.1" />
12+
<PackageReference Include="MSTest.TestFramework" Version="1.2.1" />
13+
</ItemGroup>
14+
15+
<ItemGroup>
16+
<ProjectReference Include="..\..\src\HDWallet.BIP32.Ed25519\HDWallet.BIP32.Ed25519.csproj" />
17+
</ItemGroup>
18+
19+
</Project>
Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
// Copyright 2017 elucidsoft
2+
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
using System;
16+
using System.IO;
17+
using System.Runtime.InteropServices;
18+
using HDWallet.BIP32.Ed25519;
19+
using Microsoft.VisualStudio.TestTools.UnitTesting;
20+
21+
namespace HDWallet.BIP32.Ed25519.Tests
22+
{
23+
[TestClass]
24+
public class VectorTests
25+
{
26+
private const string Vector1Seed = "000102030405060708090a0b0c0d0e0f";
27+
private const string Vector1KeyHexExpected = "2b4be7f19ee27bbf30c667b642d5f4aa69fd169872f8fc3059c08ebae2eb19e7";
28+
private const string Vector1ChainCodeExpected = "90046a93de5380a72b5e45010748567d5ea02bbf6522f979e05c0d8d8ca9fffb";
29+
30+
private const string Vector2Seed = "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542";
31+
private const string Vector2KeyHexExpected = "171cb88b1b3c1db25add599712e36245d75bc65a1a5c9e18d76f9f2b1eab4012";
32+
private const string Vector2ChainCodeExpected = "ef70a74db9c3a5af931b5fe73ed8e1a53464133654fd55e7a66f8570b8e33c3b";
33+
34+
private (byte[] Key, byte[] ChainCode) TestMasterKeyFromSeed(string seed)
35+
{
36+
var masterKeyFromSeed = new ExtKey(seed);
37+
38+
return (masterKeyFromSeed.Key.PrivateKey, masterKeyFromSeed.ChainCode);
39+
}
40+
41+
private (byte[] Key, byte[] ChainCode) TestDerivePath(string path, string seed)
42+
{
43+
ExtKey extKey = new ExtKey(seed);
44+
45+
var derivePath = extKey.DerivePath(path);
46+
47+
return (derivePath.Key.PrivateKey, derivePath.ChainCode);
48+
}
49+
50+
private byte[] TestGetPublicKey(byte[] privateKey)
51+
{
52+
Key key = new Key(privateKey);
53+
54+
var publicKey = key.PublicKey;
55+
56+
return publicKey;
57+
}
58+
59+
[TestMethod]
60+
public void TestVector1_Test1()
61+
{
62+
const string expectedPath = "m/0'";
63+
const string expectedChainCode = "8b59aa11380b624e81507a27fedda59fea6d0b779a778918a2fd3590e16e9c69";
64+
const string expectedKey = "68e0fe46dfb67e368c75379acec591dad19df3cde26e63b93a8e704f1dade7a3";
65+
const string expectedPublicKey = "008c8a13df77a28f3445213a0f432fde644acaa215fc72dcdf300d5efaa85d350c";
66+
67+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector1Seed);
68+
Assert.AreEqual(Vector1KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
69+
Assert.AreEqual(Vector1ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
70+
71+
var testDerivePath = TestDerivePath(expectedPath, Vector1Seed);
72+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
73+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
74+
75+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
76+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
77+
}
78+
79+
[TestMethod]
80+
public void TestVector1_Test2()
81+
{
82+
const string expectedPath = "m/0'/1'";
83+
const string expectedChainCode = "a320425f77d1b5c2505a6b1b27382b37368ee640e3557c315416801243552f14";
84+
const string expectedKey = "b1d0bad404bf35da785a64ca1ac54b2617211d2777696fbffaf208f746ae84f2";
85+
const string expectedPublicKey = "001932a5270f335bed617d5b935c80aedb1a35bd9fc1e31acafd5372c30f5c1187";
86+
87+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector1Seed);
88+
Assert.AreEqual(Vector1KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
89+
Assert.AreEqual(Vector1ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
90+
91+
var testDerivePath = TestDerivePath(expectedPath, Vector1Seed);
92+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
93+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
94+
95+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
96+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
97+
}
98+
99+
[TestMethod]
100+
public void TestVector1_Test3()
101+
{
102+
const string expectedPath = "m/0'/1'/2'";
103+
const string expectedChainCode = "2e69929e00b5ab250f49c3fb1c12f252de4fed2c1db88387094a0f8c4c9ccd6c";
104+
const string expectedKey = "92a5b23c0b8a99e37d07df3fb9966917f5d06e02ddbd909c7e184371463e9fc9";
105+
const string expectedPublicKey = "00ae98736566d30ed0e9d2f4486a64bc95740d89c7db33f52121f8ea8f76ff0fc1";
106+
107+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector1Seed);
108+
Assert.AreEqual(Vector1KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
109+
Assert.AreEqual(Vector1ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
110+
111+
var testDerivePath = TestDerivePath(expectedPath, Vector1Seed);
112+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
113+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
114+
115+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
116+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
117+
}
118+
119+
[TestMethod]
120+
public void TestVector1_Test4()
121+
{
122+
const string expectedPath = "m/0'/1'/2'/2'";
123+
const string expectedChainCode = "8f6d87f93d750e0efccda017d662a1b31a266e4a6f5993b15f5c1f07f74dd5cc";
124+
const string expectedKey = "30d1dc7e5fc04c31219ab25a27ae00b50f6fd66622f6e9c913253d6511d1e662";
125+
const string expectedPublicKey = "008abae2d66361c879b900d204ad2cc4984fa2aa344dd7ddc46007329ac76c429c";
126+
127+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector1Seed);
128+
Assert.AreEqual(Vector1KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
129+
Assert.AreEqual(Vector1ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
130+
131+
var testDerivePath = TestDerivePath(expectedPath, Vector1Seed);
132+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
133+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
134+
135+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
136+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
137+
}
138+
139+
[TestMethod]
140+
public void TestVector1_Test5()
141+
{
142+
const string expectedPath = "m/0'/1'/2'/2'/1000000000'";
143+
const string expectedChainCode = "68789923a0cac2cd5a29172a475fe9e0fb14cd6adb5ad98a3fa70333e7afa230";
144+
const string expectedKey = "8f94d394a8e8fd6b1bc2f3f49f5c47e385281d5c17e65324b0f62483e37e8793";
145+
const string expectedPublicKey = "003c24da049451555d51a7014a37337aa4e12d41e485abccfa46b47dfb2af54b7a";
146+
147+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector1Seed);
148+
Assert.AreEqual(Vector1KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
149+
Assert.AreEqual(Vector1ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
150+
151+
var testDerivePath = TestDerivePath(expectedPath, Vector1Seed);
152+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
153+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
154+
155+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
156+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
157+
}
158+
159+
[TestMethod]
160+
public void TestVector2_Test1()
161+
{
162+
const string expectedPath = "m/0'";
163+
const string expectedChainCode = "0b78a3226f915c082bf118f83618a618ab6dec793752624cbeb622acb562862d";
164+
const string expectedKey = "1559eb2bbec5790b0c65d8693e4d0875b1747f4970ae8b650486ed7470845635";
165+
const string expectedPublicKey = "0086fab68dcb57aa196c77c5f264f215a112c22a912c10d123b0d03c3c28ef1037";
166+
167+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector2Seed);
168+
Assert.AreEqual(Vector2KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
169+
Assert.AreEqual(Vector2ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
170+
171+
var testDerivePath = TestDerivePath(expectedPath, Vector2Seed);
172+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
173+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
174+
175+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
176+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
177+
}
178+
179+
[TestMethod]
180+
public void TestVector2_Test2()
181+
{
182+
const string expectedPath = "m/0'/2147483647'";
183+
const string expectedChainCode = "138f0b2551bcafeca6ff2aa88ba8ed0ed8de070841f0c4ef0165df8181eaad7f";
184+
const string expectedKey = "ea4f5bfe8694d8bb74b7b59404632fd5968b774ed545e810de9c32a4fb4192f4";
185+
const string expectedPublicKey = "005ba3b9ac6e90e83effcd25ac4e58a1365a9e35a3d3ae5eb07b9e4d90bcf7506d";
186+
187+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector2Seed);
188+
Assert.AreEqual(Vector2KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
189+
Assert.AreEqual(Vector2ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
190+
191+
var testDerivePath = TestDerivePath(expectedPath, Vector2Seed);
192+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
193+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
194+
195+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
196+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
197+
}
198+
199+
[TestMethod]
200+
public void TestVector2_Test3()
201+
{
202+
const string expectedPath = "m/0'/2147483647'/1'";
203+
const string expectedChainCode = "73bd9fff1cfbde33a1b846c27085f711c0fe2d66fd32e139d3ebc28e5a4a6b90";
204+
const string expectedKey = "3757c7577170179c7868353ada796c839135b3d30554bbb74a4b1e4a5a58505c";
205+
const string expectedPublicKey = "002e66aa57069c86cc18249aecf5cb5a9cebbfd6fadeab056254763874a9352b45";
206+
207+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector2Seed);
208+
Assert.AreEqual(Vector2KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
209+
Assert.AreEqual(Vector2ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
210+
211+
var testDerivePath = TestDerivePath(expectedPath, Vector2Seed);
212+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
213+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
214+
215+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
216+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
217+
}
218+
219+
[TestMethod]
220+
public void TestVector2_Test4()
221+
{
222+
const string expectedPath = "m/0'/2147483647'/1'/2147483646'";
223+
const string expectedChainCode = "0902fe8a29f9140480a00ef244bd183e8a13288e4412d8389d140aac1794825a";
224+
const string expectedKey = "5837736c89570de861ebc173b1086da4f505d4adb387c6a1b1342d5e4ac9ec72";
225+
const string expectedPublicKey = "00e33c0f7d81d843c572275f287498e8d408654fdf0d1e065b84e2e6f157aab09b";
226+
227+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector2Seed);
228+
Assert.AreEqual(Vector2KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
229+
Assert.AreEqual(Vector2ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
230+
231+
var testDerivePath = TestDerivePath(expectedPath, Vector2Seed);
232+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
233+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
234+
235+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
236+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
237+
}
238+
239+
240+
[TestMethod]
241+
public void TestVector2_Test5()
242+
{
243+
const string expectedPath = "m/0'/2147483647'/1'/2147483646'/2'";
244+
const string expectedChainCode = "5d70af781f3a37b829f0d060924d5e960bdc02e85423494afc0b1a41bbe196d4";
245+
const string expectedKey = "551d333177df541ad876a60ea71f00447931c0a9da16f227c11ea080d7391b8d";
246+
const string expectedPublicKey = "0047150c75db263559a70d5778bf36abbab30fb061ad69f69ece61a72b0cfa4fc0";
247+
248+
var testMasterKeyFromSeed = TestMasterKeyFromSeed(Vector2Seed);
249+
Assert.AreEqual(Vector2KeyHexExpected, testMasterKeyFromSeed.Key.ToStringHex());
250+
Assert.AreEqual(Vector2ChainCodeExpected, testMasterKeyFromSeed.ChainCode.ToStringHex());
251+
252+
var testDerivePath = TestDerivePath(expectedPath, Vector2Seed);
253+
Assert.AreEqual(expectedKey, testDerivePath.Key.ToStringHex());
254+
Assert.AreEqual(expectedChainCode, testDerivePath.ChainCode.ToStringHex());
255+
256+
var testPublicKey = TestGetPublicKey(testDerivePath.Key);
257+
Assert.AreEqual(expectedPublicKey, testPublicKey.ToStringHex());
258+
}
259+
}
260+
}

0 commit comments

Comments
 (0)