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