hd_public hd_public::derive_public(uint32_t index) const
{
if (index >= hd_first_hardened_key)
return {};
const auto data = splice(point_, to_big_endian(index));
const auto intermediate = split(hmac_sha512_hash(data, chain_));
// The returned child key Ki is point(parse256(IL)) + Kpar.
auto child = point_;
if (!ec_add(child, intermediate.left))
return {};
if (lineage_.depth == max_uint8)
return {};
const hd_lineage lineage
{
lineage_.prefixes,
static_cast<uint8_t>(lineage_.depth + 1),
fingerprint(),
index
};
return hd_public(child, intermediate.right, lineage);
}