diff options
author | MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> | 2023-05-23 13:14:17 +0200 |
---|---|---|
committer | fanquake <fanquake@gmail.com> | 2023-05-25 11:15:27 +0100 |
commit | 796e1145a93f4584936528aa27c4f6b2016263d9 (patch) | |
tree | 622053ca05035153a08342b8eef9c793ca2b91dc /src/key_io.cpp | |
parent | 8105bce5b384c72cf08b25b7c5343622754e7337 (diff) |
rpc: Fix invalid bech32 handling
Github-Pull: #27727
Rebased-From: eeee55f9288740747b6e8d806ce8177fd92635cf
Diffstat (limited to 'src/key_io.cpp')
-rw-r--r-- | src/key_io.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/key_io.cpp b/src/key_io.cpp index 4659a59544..33499b0d23 100644 --- a/src/key_io.cpp +++ b/src/key_io.cpp @@ -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 = strprintf("Invalid or unsupported prefix for Segwit (Bech32) address (expected %s, got %s).", params.Bech32HRP(), dec.hrp); @@ -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(); } } |