base32_tests.cpp raw

   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()
  57