42 lines
1.3 KiB
C++
42 lines
1.3 KiB
C++
|
#include <boost/archive/iterators/binary_from_base64.hpp>
|
||
|
#include <boost/archive/iterators/base64_from_binary.hpp>
|
||
|
#include <boost/archive/iterators/transform_width.hpp>
|
||
|
#include <openssl/rand.h>
|
||
|
|
||
|
#include "utils.h"
|
||
|
|
||
|
std::string utils::to_base64(const std::vector<unsigned char>& binary)
|
||
|
{
|
||
|
using namespace boost::archive::iterators;
|
||
|
using It = base64_from_binary<transform_width<std::vector<unsigned char>::const_iterator, 6, 8>>;
|
||
|
auto base64 = std::string(It(binary.begin()), It(binary.end()));
|
||
|
// Add padding.
|
||
|
return base64.append((3 - binary.size() % 3) % 3, '=');
|
||
|
}
|
||
|
|
||
|
std::vector<unsigned char> utils::from_base64(const std::string& base64)
|
||
|
{
|
||
|
using namespace boost::archive::iterators;
|
||
|
using It = transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>;
|
||
|
auto binary = std::vector<unsigned char>(It(base64.begin()), It(base64.end()));
|
||
|
// Remove padding.
|
||
|
auto length = base64.size();
|
||
|
if(binary.size() > 2 && base64[length - 1] == '=' && base64[length - 2] == '=')
|
||
|
{
|
||
|
binary.erase(binary.end() - 2, binary.end());
|
||
|
}
|
||
|
else if(binary.size() > 1 && base64[length - 1] == '=')
|
||
|
{
|
||
|
binary.erase(binary.end() - 1, binary.end());
|
||
|
}
|
||
|
return binary;
|
||
|
}
|
||
|
|
||
|
std::vector<unsigned char> utils::generate_random(const size_t size){
|
||
|
std::vector<unsigned char> res(size);
|
||
|
if(!RAND_bytes(res.data(), size)){
|
||
|
throw std::exception();
|
||
|
}
|
||
|
return res;
|
||
|
}
|