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