diff --git a/src/test/fuzz/CMakeLists.txt b/src/test/fuzz/CMakeLists.txt --- a/src/test/fuzz/CMakeLists.txt +++ b/src/test/fuzz/CMakeLists.txt @@ -70,12 +70,14 @@ add_regular_fuzz_targets( addrdb + base_encode_decode block bloom_filter rolling_bloom_filter cashaddr descriptor_parse eval_script + hex integer net_permissions parse_hd_keypath diff --git a/src/test/fuzz/base_encode_decode.cpp b/src/test/fuzz/base_encode_decode.cpp new file mode 100644 --- /dev/null +++ b/src/test/fuzz/base_encode_decode.cpp @@ -0,0 +1,51 @@ +// Copyright (c) 2019 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include +#include +#include + +#include + +#include +#include +#include +#include + +void test_one_input(const std::vector &buffer) { + const std::string random_encoded_string(buffer.begin(), buffer.end()); + + std::vector decoded; + if (DecodeBase58(random_encoded_string, decoded, 100)) { + const std::string encoded_string = EncodeBase58(decoded); + assert(encoded_string == TrimString(encoded_string)); + assert(ToLower(encoded_string) == + ToLower(TrimString(random_encoded_string))); + } + + if (DecodeBase58Check(random_encoded_string, decoded, 100)) { + const std::string encoded_string = EncodeBase58Check(decoded); + assert(encoded_string == TrimString(encoded_string)); + assert(ToLower(encoded_string) == + ToLower(TrimString(random_encoded_string))); + } + + bool pf_invalid; + std::string decoded_string = + DecodeBase32(random_encoded_string, &pf_invalid); + if (!pf_invalid) { + const std::string encoded_string = EncodeBase32(decoded_string); + assert(encoded_string == TrimString(encoded_string)); + assert(ToLower(encoded_string) == + ToLower(TrimString(random_encoded_string))); + } + + decoded_string = DecodeBase64(random_encoded_string, &pf_invalid); + if (!pf_invalid) { + const std::string encoded_string = EncodeBase64(decoded_string); + assert(encoded_string == TrimString(encoded_string)); + assert(ToLower(encoded_string) == + ToLower(TrimString(random_encoded_string))); + } +} diff --git a/src/test/fuzz/hex.cpp b/src/test/fuzz/hex.cpp new file mode 100644 --- /dev/null +++ b/src/test/fuzz/hex.cpp @@ -0,0 +1,21 @@ +// Copyright (c) 2019 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include + +#include + +#include +#include +#include +#include + +void test_one_input(const std::vector &buffer) { + const std::string random_hex_string(buffer.begin(), buffer.end()); + const std::vector data = ParseHex(random_hex_string); + const std::string hex_data = HexStr(data); + if (IsHex(random_hex_string)) { + assert(ToLower(random_hex_string) == hex_data); + } +} diff --git a/src/util/string.h b/src/util/string.h --- a/src/util/string.h +++ b/src/util/string.h @@ -11,6 +11,16 @@ #include #include +NODISCARD inline std::string +TrimString(const std::string &str, const std::string &pattern = " \f\n\r\t\v") { + std::string::size_type front = str.find_first_not_of(pattern); + if (front == std::string::npos) { + return std::string(); + } + std::string::size_type end = str.find_last_not_of(pattern); + return str.substr(front, end - front + 1); +} + /** * Join a list of items * diff --git a/src/util/system.cpp b/src/util/system.cpp --- a/src/util/system.cpp +++ b/src/util/system.cpp @@ -812,16 +812,6 @@ return AbsPathForConfigVal(fs::path(confPath), false); } -static std::string TrimString(const std::string &str, - const std::string &pattern) { - std::string::size_type front = str.find_first_not_of(pattern); - if (front == std::string::npos) { - return std::string(); - } - std::string::size_type end = str.find_last_not_of(pattern); - return str.substr(front, end - front + 1); -} - static bool GetConfigOptions(std::istream &stream, const std::string &filepath, std::string &error,