mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-26 19:23:26 -03:00
extended keys: fail to derive too large depth instead of wrapping around
This issue was reported to me by Marco Falke, and found with the descriptor_parse fuzz target.
This commit is contained in:
parent
8dc6670ce1
commit
fb9faffae3
3 changed files with 20 additions and 0 deletions
|
@ -333,6 +333,7 @@ bool CKey::Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CExtKey::Derive(CExtKey &out, unsigned int _nChild) const {
|
bool CExtKey::Derive(CExtKey &out, unsigned int _nChild) const {
|
||||||
|
if (nDepth == std::numeric_limits<unsigned char>::max()) return false;
|
||||||
out.nDepth = nDepth + 1;
|
out.nDepth = nDepth + 1;
|
||||||
CKeyID id = key.GetPubKey().GetID();
|
CKeyID id = key.GetPubKey().GetID();
|
||||||
memcpy(out.vchFingerprint, &id, 4);
|
memcpy(out.vchFingerprint, &id, 4);
|
||||||
|
|
|
@ -365,6 +365,7 @@ void CExtPubKey::DecodeWithVersion(const unsigned char code[BIP32_EXTKEY_WITH_VE
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CExtPubKey::Derive(CExtPubKey &out, unsigned int _nChild) const {
|
bool CExtPubKey::Derive(CExtPubKey &out, unsigned int _nChild) const {
|
||||||
|
if (nDepth == std::numeric_limits<unsigned char>::max()) return false;
|
||||||
out.nDepth = nDepth + 1;
|
out.nDepth = nDepth + 1;
|
||||||
CKeyID id = pubkey.GetID();
|
CKeyID id = pubkey.GetID();
|
||||||
memcpy(out.vchFingerprint, &id, 4);
|
memcpy(out.vchFingerprint, &id, 4);
|
||||||
|
|
|
@ -184,4 +184,22 @@ BOOST_AUTO_TEST_CASE(bip32_test5) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(bip32_max_depth) {
|
||||||
|
CExtKey key_parent{DecodeExtKey(test1.vDerive[0].prv)}, key_child;
|
||||||
|
CExtPubKey pubkey_parent{DecodeExtPubKey(test1.vDerive[0].pub)}, pubkey_child;
|
||||||
|
|
||||||
|
// We can derive up to the 255th depth..
|
||||||
|
for (auto i = 0; i++ < 255;) {
|
||||||
|
BOOST_CHECK(key_parent.Derive(key_child, 0));
|
||||||
|
std::swap(key_parent, key_child);
|
||||||
|
BOOST_CHECK(pubkey_parent.Derive(pubkey_child, 0));
|
||||||
|
std::swap(pubkey_parent, pubkey_child);
|
||||||
|
}
|
||||||
|
|
||||||
|
// But trying to derive a non-existent 256th depth will fail!
|
||||||
|
BOOST_CHECK(key_parent.nDepth == 255 && pubkey_parent.nDepth == 255);
|
||||||
|
BOOST_CHECK(!key_parent.Derive(key_child, 0));
|
||||||
|
BOOST_CHECK(!pubkey_parent.Derive(pubkey_child, 0));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
Loading…
Add table
Reference in a new issue