#include "CryptoUtils.h" #include #include using CryptoPP::Base64Decoder; using CryptoPP::Base64Encoder; using CryptoPP::Base32Decoder; using CryptoPP::Base32Encoder; using CryptoPP::StringSource; using CryptoPP::StringSink; using CryptoPP::byte; namespace { static const byte base32Alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; } std::string base64Decode(const std::string& encoded) { std::string decoded; StringSource ss(encoded, true, new Base64Decoder( new StringSink(decoded) ) ); return decoded; } std::string base64Encode(const std::string& source) { std::string encoded; StringSource ss(source, true, new Base64Encoder( new StringSink(encoded), false /* no line breaks */ ) ); return encoded; } std::unique_ptr base64Encode(const uint8_t* source, size_t sourceSize) { auto encoded = std::make_unique((sourceSize*4/3 + 3) & ~3); CryptoPP::ArraySource ss(source, sourceSize, true, new Base64Encoder( new CryptoPP::ArraySink(encoded.get(), sourceSize * 4 / 3), false /* no line breaks */ ) ); return encoded; } std::string base32Decode(const std::string& encoded) { // Decoder int lookup[256] = { 0 }; Base64Decoder::InitializeDecodingLookupArray(lookup, base32Alphabet, 32, true); Base32Decoder decoder; CryptoPP::AlgorithmParameters params = CryptoPP::MakeParameters(CryptoPP::Name::DecodingLookupArray(), (const int *)lookup); decoder.IsolatedInitialize(params); std::string decoded; decoder.Attach(new StringSink(decoded)); decoder.Put((const byte*)encoded.data(), encoded.size()); decoder.MessageEnd(); return decoded; } std::string base32Encode(const std::string& data) { // Encoder Base32Encoder encoder; CryptoPP::AlgorithmParameters params = CryptoPP::MakeParameters(CryptoPP::Name::EncodingLookupArray(), (const byte *)base32Alphabet); encoder.IsolatedInitialize(params); std::string encoded; encoder.Attach(new StringSink(encoded)); encoder.Put((const byte*)data.data(), data.size()); encoder.MessageEnd(); return encoded; }