diff options
Diffstat (limited to 'src/key_io.cpp')
-rw-r--r-- | src/key_io.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/key_io.cpp b/src/key_io.cpp index 6dd6f82112..d77829e046 100644 --- a/src/key_io.cpp +++ b/src/key_io.cpp @@ -109,13 +109,13 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par std::equal(pubkey_prefix.begin(), pubkey_prefix.end(), data.begin()))) { error_str = "Invalid length for Base58 address"; } else { - error_str = "Invalid prefix for Base58-encoded address"; + error_str = "Invalid or unsupported Base58-encoded address."; } return CNoDestination(); } else if (!is_bech32) { // Try Base58 decoding without the checksum, using a much larger max length if (!DecodeBase58(str, data, 100)) { - error_str = "Not a valid Bech32 or Base58 encoding"; + error_str = "Invalid or unsupported Segwit (Bech32) or Base58 encoding."; } else { error_str = "Invalid checksum or length of Base58 address"; } @@ -124,7 +124,11 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par data.clear(); const auto dec = bech32::Decode(str); - if ((dec.encoding == bech32::Encoding::BECH32 || dec.encoding == bech32::Encoding::BECH32M) && dec.data.size() > 0) { + if (dec.encoding == bech32::Encoding::BECH32 || dec.encoding == bech32::Encoding::BECH32M) { + if (dec.data.empty()) { + error_str = "Empty Bech32 data section"; + return CNoDestination(); + } // Bech32 decoding if (dec.hrp != params.Bech32HRP()) { error_str = "Invalid prefix for Bech32 address"; @@ -158,7 +162,7 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par } } - error_str = "Invalid Bech32 v0 address data size"; + error_str = strprintf("Invalid Bech32 v0 address program size (%s byte), per BIP141", data.size()); return CNoDestination(); } @@ -175,7 +179,7 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par } if (data.size() < 2 || data.size() > BECH32_WITNESS_PROG_MAX_LEN) { - error_str = "Invalid Bech32 address data size"; + error_str = strprintf("Invalid Bech32 address program size (%s byte)", data.size()); return CNoDestination(); } @@ -184,6 +188,9 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par std::copy(data.begin(), data.end(), unk.program); unk.length = data.size(); return unk; + } else { + error_str = strprintf("Invalid padding in Bech32 data section"); + return CNoDestination(); } } |