@@ -128,4 +128,112 @@ BOOST_AUTO_TEST_CASE(hd_private__derive_public__long_seed__expected)
128128 BOOST_REQUIRE_EQUAL (m0xH1yH2_pub.encoded (), " xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt" );
129129}
130130
131+ BOOST_AUTO_TEST_CASE (hd_private__constructor__null_key_decodes_to_invalid__expected)
132+ {
133+ // the 11...14rcJhr is a serialization of a null key;
134+ static const auto null_encoded = " 1111111111111111111111111111111111111111111111111111111111111111111111111111114rcJhr" ;
135+ const hd_private xprv_null (null_encoded);
136+
137+ BOOST_REQUIRE (!xprv_null);
138+ }
139+
140+ BOOST_AUTO_TEST_CASE (hd_private__to_public__fails_from_invalid_private__expected)
141+ {
142+ // the 11...14rcJhr is a serialization of a null key;
143+ static const auto xprv_invalid_encoded = " 1111111111111111111111111111111111111111111111111111111111111111111111111111114rcJhr" ;
144+ const hd_private xprv_invalid (xprv_invalid_encoded);
145+
146+ BOOST_REQUIRE (!xprv_invalid);
147+ BOOST_REQUIRE (!xprv_invalid.to_public ());
148+ }
149+
150+ BOOST_AUTO_TEST_CASE (hd_private__derive_private__must_not_overflow_depth__expected)
151+ {
152+ // xprv_254_depth was created from "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi"
153+ // by manually setting the depth to 254
154+ static const auto xprv_254_encoded = " xprvJ6xRbBsatSpgzr9c3hYbM2RohnAcHiiN74vQWqdRPx914xeq41t3u4rPXTsNxd5kvLSnqpsMx1cMx8cytMM5RbS7G54nwC5p5P5MQFSjf36" ;
155+ const hd_private xprv_254 (xprv_254_encoded);
156+
157+
158+ const auto xprv_255 = xprv_254.derive_private (14 );
159+ const auto xprv_256 = xprv_255.derive_private (70 );
160+
161+ BOOST_REQUIRE_EQUAL (xprv_254.lineage ().depth , 254 );
162+ BOOST_REQUIRE (xprv_254);
163+ // the maximal valid depth is 255
164+ BOOST_REQUIRE_EQUAL (xprv_255.lineage ().depth , 255 );
165+ BOOST_REQUIRE (xprv_255);
166+
167+ // depth overflows uint from 255 to 0
168+ BOOST_REQUIRE_EQUAL (xprv_256.lineage ().depth , 0 );
169+ // which creates invalid keys
170+ BOOST_REQUIRE (!xprv_256);
171+ }
172+
173+ BOOST_AUTO_TEST_CASE (hd_private__derive_private__hardened_must_not_overflow_depth__expected)
174+ {
175+ // xprv_254_depth was created from "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi"
176+ // by manually setting the depth to 254
177+ static const auto xprv254_encoded = " xprvJ6xRbBsatSpgzr9c3hYbM2RohnAcHiiN74vQWqdRPx914xeq41t3u4rPXTsNxd5kvLSnqpsMx1cMx8cytMM5RbS7G54nwC5p5P5MQFSjf36" ;
178+ const hd_private xprv_254 (xprv254_encoded);
179+
180+ const auto xprv_255 = xprv_254.derive_private (1337 + hd_first_hardened_key);
181+ const auto xprv_256 = xprv_255.derive_private (8887 + hd_first_hardened_key);
182+
183+ BOOST_REQUIRE_EQUAL (xprv_254.lineage ().depth , 254 );
184+ BOOST_REQUIRE (xprv_254);
185+ // the maximal valid depth is 255
186+ BOOST_REQUIRE_EQUAL (xprv_255.lineage ().depth , 255 );
187+ BOOST_REQUIRE (xprv_255);
188+
189+ // depth overflows uint from 255 to 0
190+ BOOST_REQUIRE_EQUAL (xprv_256.lineage ().depth , 0 );
191+ // which creates invalid keys
192+ BOOST_REQUIRE (!xprv_256);
193+ }
194+
195+ BOOST_AUTO_TEST_CASE (hd_private__derive_public__must_not_overflow_depth__expected)
196+ {
197+ // xprv_254_depth was created from "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi"
198+ // by manually setting the depth to 254
199+ static const auto xprv_254_encoded = " xprvJ6xRbBsatSpgzr9c3hYbM2RohnAcHiiN74vQWqdRPx914xeq41t3u4rPXTsNxd5kvLSnqpsMx1cMx8cytMM5RbS7G54nwC5p5P5MQFSjf36" ;
200+ const hd_private xprv_254 (xprv_254_encoded);
201+
202+ const auto xprv_255 = xprv_254.derive_private (14 );
203+ const auto xpub_256 = xprv_255.derive_public (70 );
204+
205+ BOOST_REQUIRE_EQUAL (xprv_254.lineage ().depth , 254 );
206+ BOOST_REQUIRE (xprv_254);
207+ // the maximal valid depth is 255
208+ BOOST_REQUIRE_EQUAL (xprv_255.lineage ().depth , 255 );
209+ BOOST_REQUIRE (xprv_255);
210+
211+ // depth overflows uint from 255 to 0
212+ BOOST_REQUIRE_EQUAL (xpub_256.lineage ().depth , 0 );
213+ // which creates invalid keys
214+ BOOST_REQUIRE (!xpub_256);
215+ }
216+
217+ BOOST_AUTO_TEST_CASE (hd_private__derive_public__hardened_must_not_overflow_depth__expected)
218+ {
219+ // xprv_254_depth was created from "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi"
220+ // by manually setting the depth to 254
221+ static const auto xprv_254_encoded = " xprvJ6xRbBsatSpgzr9c3hYbM2RohnAcHiiN74vQWqdRPx914xeq41t3u4rPXTsNxd5kvLSnqpsMx1cMx8cytMM5RbS7G54nwC5p5P5MQFSjf36" ;
222+ const hd_private xprv_254 (xprv_254_encoded);
223+
224+ const auto xprv_255 = xprv_254.derive_private (141 );
225+ const auto xpub_256 = xprv_255.derive_public (19287 + hd_first_hardened_key);
226+
227+ BOOST_REQUIRE_EQUAL (xprv_254.lineage ().depth , 254 );
228+ BOOST_REQUIRE (xprv_254);
229+ // the maximal valid depth is 255
230+ BOOST_REQUIRE_EQUAL (xprv_255.lineage ().depth , 255 );
231+ BOOST_REQUIRE (xprv_255);
232+
233+ // depth overflows uint from 255 to 0
234+ BOOST_REQUIRE_EQUAL (xpub_256.lineage ().depth , 0 );
235+ // which creates invalid keys
236+ BOOST_REQUIRE (!xpub_256);
237+ }
238+
131239BOOST_AUTO_TEST_SUITE_END ()
0 commit comments