93 lines
2.2 KiB
C++
93 lines
2.2 KiB
C++
#include "CryptoUtils.h"
|
|
|
|
#include <cryptopp/base64.h>
|
|
#include <cryptopp/base32.h>
|
|
|
|
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<uint8_t[]> base64Encode(const uint8_t* source, size_t sourceSize)
|
|
{
|
|
auto encoded = std::make_unique<uint8_t[]>((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;
|
|
}
|