@@ -910,22 +910,29 @@ std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptCo
910
910
911
911
} // namespace
912
912
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 )
914
915
{
915
- Span<const char > sp (descriptor.data (), descriptor.size ());
916
-
917
- // Checksum checks
918
916
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
921
924
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
926
926
}
927
+ if (out_checksum) *out_checksum = std::move (checksum);
927
928
sp = check_split[0 ];
929
+ return true ;
930
+ }
928
931
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 ;
929
936
auto ret = ParseScript (sp, ParseScriptContext::TOP, out);
930
937
if (sp.size () == 0 && ret) return std::unique_ptr<Descriptor>(std::move (ret));
931
938
return nullptr ;
0 commit comments