/ src / test / base32_tests.cpp
base32_tests.cpp
 1  // Copyright (c) 2012-present The Bitcoin Core developers
 2  // Distributed under the MIT software license, see the accompanying
 3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 4  
 5  #include <util/strencodings.h>
 6  
 7  #include <boost/test/unit_test.hpp>
 8  
 9  #include <algorithm>
10  #include <string>
11  
12  using namespace std::literals;
13  
14  BOOST_AUTO_TEST_SUITE(base32_tests)
15  
16  BOOST_AUTO_TEST_CASE(base32_testvectors)
17  {
18      static const std::string vstrIn[]  = {"","f","fo","foo","foob","fooba","foobar"};
19      static const std::string vstrOut[] = {"","my======","mzxq====","mzxw6===","mzxw6yq=","mzxw6ytb","mzxw6ytboi======"};
20      static const std::string vstrOutNoPadding[] = {"","my","mzxq","mzxw6","mzxw6yq","mzxw6ytb","mzxw6ytboi"};
21      for (unsigned int i=0; i<std::size(vstrIn); i++)
22      {
23          std::string strEnc = EncodeBase32(vstrIn[i]);
24          BOOST_CHECK_EQUAL(strEnc, vstrOut[i]);
25          strEnc = EncodeBase32(vstrIn[i], false);
26          BOOST_CHECK_EQUAL(strEnc, vstrOutNoPadding[i]);
27          auto dec = DecodeBase32(vstrOut[i]);
28          BOOST_REQUIRE(dec);
29          BOOST_CHECK_MESSAGE(std::ranges::equal(*dec, vstrIn[i]), vstrOut[i]);
30      }
31  
32      BOOST_CHECK(!DecodeBase32("AWSX3VPPinvalid")); // invalid size
33      BOOST_CHECK( DecodeBase32("AWSX3VPP")); // valid
34  
35      // Decoding strings with embedded NUL characters should fail
36      BOOST_CHECK(!DecodeBase32("invalid\0"sv)); // correct size, invalid due to \0
37      BOOST_CHECK(!DecodeBase32("AWSX3VPP\0invalid"sv)); // correct size, invalid due to \0
38  }
39  
40  BOOST_AUTO_TEST_CASE(base32_padding)
41  {
42      // Is valid without padding
43      BOOST_CHECK_EQUAL(EncodeBase32("fooba"), "mzxw6ytb");
44  
45      // Valid size
46      BOOST_CHECK(!DecodeBase32("========"));
47      BOOST_CHECK(!DecodeBase32("a======="));
48      BOOST_CHECK( DecodeBase32("aa======"));
49      BOOST_CHECK(!DecodeBase32("aaa====="));
50      BOOST_CHECK( DecodeBase32("aaaa===="));
51      BOOST_CHECK( DecodeBase32("aaaaa==="));
52      BOOST_CHECK(!DecodeBase32("aaaaaa=="));
53      BOOST_CHECK( DecodeBase32("aaaaaaa="));
54  }
55  
56  BOOST_AUTO_TEST_SUITE_END()