CCEngineServer/CMakeProject1/CryptoUtils.cpp
2021-08-29 23:21:55 +02:00

94 lines
2.3 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::optional<int> maxLineLength)
{
std::string encoded;
StringSource ss(source, true,
new Base64Encoder(
new StringSink(encoded),
maxLineLength.has_value() /* no line breaks */,
maxLineLength.value_or(64)
)
);
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;
}