diff options
author | Samuel Dobson <dobsonsa68@gmail.com> | 2021-11-23 12:17:34 +1300 |
---|---|---|
committer | Samuel Dobson <dobsonsa68@gmail.com> | 2021-11-23 15:48:59 +1300 |
commit | c8b9a224e70f70ccc638b2c4200a505cdf024efd (patch) | |
tree | 158d0c3d3b9342ca4e50a1cb9f95f3bfe20cd440 /src | |
parent | 92f0cafdca11a9463b6f04229c1c47805c97c1b5 (diff) |
Report encoding type in bech32 error message
Diffstat (limited to 'src')
-rw-r--r-- | src/bech32.cpp | 8 | ||||
-rw-r--r-- | src/test/bech32_tests.cpp | 8 |
2 files changed, 11 insertions, 5 deletions
diff --git a/src/bech32.cpp b/src/bech32.cpp index ec69965d07..7585ee944c 100644 --- a/src/bech32.cpp +++ b/src/bech32.cpp @@ -7,6 +7,7 @@ #include <util/vector.h> #include <assert.h> +#include <optional> namespace bech32 { @@ -539,6 +540,7 @@ std::string LocateErrors(const std::string& str, std::vector<int>& error_locatio // We attempt error detection with both bech32 and bech32m, and choose the one with the fewest errors // We can't simply use the segwit version, because that may be one of the errors + std::optional<Encoding> error_encoding; for (Encoding encoding : {Encoding::BECH32, Encoding::BECH32M}) { std::vector<int> possible_errors; // Recall that (ExpandHRP(hrp) ++ values) is interpreted as a list of coefficients of a polynomial @@ -657,9 +659,13 @@ std::string LocateErrors(const std::string& str, std::vector<int>& error_locatio if (error_locations.empty() || (!possible_errors.empty() && possible_errors.size() < error_locations.size())) { error_locations = std::move(possible_errors); + if (!error_locations.empty()) error_encoding = encoding; } } - return "Invalid checksum"; + return error_encoding == Encoding::BECH32M ? "Invalid Bech32m checksum" + : error_encoding == Encoding::BECH32 ? "Invalid Bech32 checksum" + : "Invalid checksum"; + } } // namespace bech32 diff --git a/src/test/bech32_tests.cpp b/src/test/bech32_tests.cpp index 7601ead5b8..5d851a9735 100644 --- a/src/test/bech32_tests.cpp +++ b/src/test/bech32_tests.cpp @@ -87,8 +87,8 @@ BOOST_AUTO_TEST_CASE(bech32_testvectors_invalid) {"Invalid separator position", {0}}, {"Invalid character or mixed case", {3, 4, 5, 7}}, {"Invalid character or mixed case", {3}}, - {"Invalid checksum", {11}}, - {"Invalid checksum", {9, 16}}, + {"Invalid Bech32 checksum", {11}}, + {"Invalid Bech32 checksum", {9, 16}}, }; static_assert(std::size(CASES) == std::size(ERRORS), "Bech32 CASES and ERRORS should have the same length"); @@ -140,8 +140,8 @@ BOOST_AUTO_TEST_CASE(bech32m_testvectors_invalid) {"Invalid checksum", {}}, {"Invalid separator position", {0}}, {"Invalid separator position", {0}}, - {"Invalid checksum", {21}}, - {"Invalid checksum", {13, 32}}, + {"Invalid Bech32m checksum", {21}}, + {"Invalid Bech32m checksum", {13, 32}}, }; static_assert(std::size(CASES) == std::size(ERRORS), "Bech32m CASES and ERRORS should have the same length"); |