Changeset View
Changeset View
Standalone View
Standalone View
src/script/descriptor.cpp
Show First 20 Lines • Show All 508 Lines • ▼ Show 20 Lines | |||||
/** | /** | ||||
* Parse a key path, being passed a split list of elements (the first element is | * Parse a key path, being passed a split list of elements (the first element is | ||||
* ignored). | * ignored). | ||||
*/ | */ | ||||
bool ParseKeyPath(const std::vector<Span<const char>> &split, KeyPath &out) { | bool ParseKeyPath(const std::vector<Span<const char>> &split, KeyPath &out) { | ||||
for (size_t i = 1; i < split.size(); ++i) { | for (size_t i = 1; i < split.size(); ++i) { | ||||
Span<const char> elem = split[i]; | Span<const char> elem = split[i]; | ||||
bool hardened = false; | bool hardened = false; | ||||
if (elem.size() > 0 && elem[elem.size() - 1] == '\'') { | if (elem.size() > 0 && | ||||
(elem[elem.size() - 1] == '\'' || elem[elem.size() - 1] == 'h')) { | |||||
elem = elem.first(elem.size() - 1); | elem = elem.first(elem.size() - 1); | ||||
hardened = true; | hardened = true; | ||||
} | } | ||||
uint32_t p; | uint32_t p; | ||||
if (!ParseUInt32(std::string(elem.begin(), elem.end()), &p) || | if (!ParseUInt32(std::string(elem.begin(), elem.end()), &p) || | ||||
p > 0x7FFFFFFFUL) { | p > 0x7FFFFFFFUL) { | ||||
return false; | return false; | ||||
} | } | ||||
Show All 26 Lines | std::unique_ptr<PubkeyProvider> ParsePubkey(const Span<const char> &sp, | ||||
if (!extkey.key.IsValid() && !extpubkey.pubkey.IsValid()) { | if (!extkey.key.IsValid() && !extpubkey.pubkey.IsValid()) { | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
KeyPath path; | KeyPath path; | ||||
DeriveType type = DeriveType::NO; | DeriveType type = DeriveType::NO; | ||||
if (split.back() == MakeSpan("*").first(1)) { | if (split.back() == MakeSpan("*").first(1)) { | ||||
split.pop_back(); | split.pop_back(); | ||||
type = DeriveType::UNHARDENED; | type = DeriveType::UNHARDENED; | ||||
} else if (split.back() == MakeSpan("*'").first(2)) { | } else if (split.back() == MakeSpan("*'").first(2) || | ||||
split.back() == MakeSpan("*h").first(2)) { | |||||
split.pop_back(); | split.pop_back(); | ||||
type = DeriveType::HARDENED; | type = DeriveType::HARDENED; | ||||
} | } | ||||
if (!ParseKeyPath(split, path)) { | if (!ParseKeyPath(split, path)) { | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
if (extkey.key.IsValid()) { | if (extkey.key.IsValid()) { | ||||
extpubkey = extkey.Neuter(); | extpubkey = extkey.Neuter(); | ||||
▲ Show 20 Lines • Show All 113 Lines • Show Last 20 Lines |