Skip to content

Commit c8b9a22

Browse files
committed
Report encoding type in bech32 error message
1 parent 92f0caf commit c8b9a22

File tree

3 files changed

+16
-10
lines changed

3 files changed

+16
-10
lines changed

src/bech32.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <util/vector.h>
88

99
#include <assert.h>
10+
#include <optional>
1011

1112
namespace bech32
1213
{
@@ -539,6 +540,7 @@ std::string LocateErrors(const std::string& str, std::vector<int>& error_locatio
539540

540541
// We attempt error detection with both bech32 and bech32m, and choose the one with the fewest errors
541542
// We can't simply use the segwit version, because that may be one of the errors
543+
std::optional<Encoding> error_encoding;
542544
for (Encoding encoding : {Encoding::BECH32, Encoding::BECH32M}) {
543545
std::vector<int> possible_errors;
544546
// 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
657659

658660
if (error_locations.empty() || (!possible_errors.empty() && possible_errors.size() < error_locations.size())) {
659661
error_locations = std::move(possible_errors);
662+
if (!error_locations.empty()) error_encoding = encoding;
660663
}
661664
}
662-
return "Invalid checksum";
665+
return error_encoding == Encoding::BECH32M ? "Invalid Bech32m checksum"
666+
: error_encoding == Encoding::BECH32 ? "Invalid Bech32 checksum"
667+
: "Invalid checksum";
668+
663669
}
664670

665671
} // namespace bech32

src/test/bech32_tests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ BOOST_AUTO_TEST_CASE(bech32_testvectors_invalid)
8787
{"Invalid separator position", {0}},
8888
{"Invalid character or mixed case", {3, 4, 5, 7}},
8989
{"Invalid character or mixed case", {3}},
90-
{"Invalid checksum", {11}},
91-
{"Invalid checksum", {9, 16}},
90+
{"Invalid Bech32 checksum", {11}},
91+
{"Invalid Bech32 checksum", {9, 16}},
9292
};
9393
static_assert(std::size(CASES) == std::size(ERRORS), "Bech32 CASES and ERRORS should have the same length");
9494

@@ -140,8 +140,8 @@ BOOST_AUTO_TEST_CASE(bech32m_testvectors_invalid)
140140
{"Invalid checksum", {}},
141141
{"Invalid separator position", {0}},
142142
{"Invalid separator position", {0}},
143-
{"Invalid checksum", {21}},
144-
{"Invalid checksum", {13, 32}},
143+
{"Invalid Bech32m checksum", {21}},
144+
{"Invalid Bech32m checksum", {13, 32}},
145145
};
146146
static_assert(std::size(CASES) == std::size(ERRORS), "Bech32m CASES and ERRORS should have the same length");
147147

test/functional/rpc_invalid_address_message.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ def test_validateaddress(self):
6767
self.check_invalid(BECH32_INVALID_VERSION, 'Invalid Bech32 address witness version')
6868
self.check_invalid(BECH32_INVALID_V0_SIZE, 'Invalid Bech32 v0 address data size')
6969
self.check_invalid(BECH32_TOO_LONG, 'Bech32 string too long', list(range(90, 108)))
70-
self.check_invalid(BECH32_ONE_ERROR, 'Invalid checksum', [9])
71-
self.check_invalid(BECH32_TWO_ERRORS, 'Invalid checksum', [22, 43])
72-
self.check_invalid(BECH32_ONE_ERROR_CAPITALS, 'Invalid checksum', [38])
70+
self.check_invalid(BECH32_ONE_ERROR, 'Invalid Bech32 checksum', [9])
71+
self.check_invalid(BECH32_TWO_ERRORS, 'Invalid Bech32 checksum', [22, 43])
72+
self.check_invalid(BECH32_ONE_ERROR_CAPITALS, 'Invalid Bech32 checksum', [38])
7373
self.check_invalid(BECH32_NO_SEPARATOR, 'Missing separator')
7474
self.check_invalid(BECH32_INVALID_CHAR, 'Invalid Base 32 character', [8])
75-
self.check_invalid(BECH32_MULTISIG_TWO_ERRORS, 'Invalid checksum', [19, 30])
76-
self.check_invalid(BECH32_WRONG_VERSION, 'Invalid checksum', [5])
75+
self.check_invalid(BECH32_MULTISIG_TWO_ERRORS, 'Invalid Bech32 checksum', [19, 30])
76+
self.check_invalid(BECH32_WRONG_VERSION, 'Invalid Bech32 checksum', [5])
7777

7878
# Valid Bech32
7979
self.check_valid(BECH32_VALID)

0 commit comments

Comments
 (0)