Skip to content

Commit 104b3a5

Browse files
committed
Factor out checksum checking from descriptor parsing
1 parent e5fdda6 commit 104b3a5

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

src/script/descriptor.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -910,22 +910,29 @@ std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptCo
910910

911911
} // namespace
912912

913-
std::unique_ptr<Descriptor> Parse(const std::string& descriptor, FlatSigningProvider& out, bool require_checksum)
913+
/** Check a descriptor checksum, and update desc to be the checksum-less part. */
914+
bool CheckChecksum(Span<const char>& sp, bool require_checksum, std::string* out_checksum = nullptr)
914915
{
915-
Span<const char> sp(descriptor.data(), descriptor.size());
916-
917-
// Checksum checks
918916
auto check_split = Split(sp, '#');
919-
if (check_split.size() > 2) return nullptr; // Multiple '#' symbols
920-
if (check_split.size() == 1 && require_checksum) return nullptr; // Missing checksum
917+
if (check_split.size() > 2) return false; // Multiple '#' symbols
918+
if (check_split.size() == 1 && require_checksum) return false; // Missing checksum
919+
if (check_split.size() == 2) {
920+
if (check_split[1].size() != 8) return false; // Unexpected length for checksum
921+
}
922+
auto checksum = DescriptorChecksum(check_split[0]);
923+
if (checksum.empty()) return false; // Invalid characters in payload
921924
if (check_split.size() == 2) {
922-
if (check_split[1].size() != 8) return nullptr; // Unexpected length for checksum
923-
auto checksum = DescriptorChecksum(check_split[0]);
924-
if (checksum.empty()) return nullptr; // Invalid characters in payload
925-
if (!std::equal(checksum.begin(), checksum.end(), check_split[1].begin())) return nullptr; // Checksum mismatch
925+
if (!std::equal(checksum.begin(), checksum.end(), check_split[1].begin())) return false; // Checksum mismatch
926926
}
927+
if (out_checksum) *out_checksum = std::move(checksum);
927928
sp = check_split[0];
929+
return true;
930+
}
928931

932+
std::unique_ptr<Descriptor> Parse(const std::string& descriptor, FlatSigningProvider& out, bool require_checksum)
933+
{
934+
Span<const char> sp(descriptor.data(), descriptor.size());
935+
if (!CheckChecksum(sp, require_checksum)) return nullptr;
929936
auto ret = ParseScript(sp, ParseScriptContext::TOP, out);
930937
if (sp.size() == 0 && ret) return std::unique_ptr<Descriptor>(std::move(ret));
931938
return nullptr;

0 commit comments

Comments
 (0)