2017-12-03 20:01:41 +01:00
|
|
|
#include <cpp-utils/data/SerializationHelper.h>
|
2015-10-27 22:19:06 +01:00
|
|
|
#include "RandomPadding.h"
|
|
|
|
#include "../logging/logging.h"
|
|
|
|
#include "../random/Random.h"
|
|
|
|
|
|
|
|
using boost::optional;
|
|
|
|
using namespace cpputils::logging;
|
|
|
|
|
|
|
|
namespace cpputils {
|
|
|
|
Data RandomPadding::add(const Data &data, size_t targetSize) {
|
|
|
|
uint32_t size = data.size();
|
2015-11-11 20:00:24 +01:00
|
|
|
if (size >= targetSize - sizeof(size)) {
|
|
|
|
throw std::runtime_error("Data too large. We should increase padding target size.");
|
|
|
|
}
|
2015-10-27 22:19:06 +01:00
|
|
|
Data randomData = Random::PseudoRandom().get(targetSize-sizeof(size)-size);
|
|
|
|
ASSERT(sizeof(size) + size + randomData.size() == targetSize, "Calculated size of randomData incorrectly");
|
|
|
|
Data result(targetSize);
|
2017-12-03 20:01:41 +01:00
|
|
|
serialize<uint32_t>(result.data(), size);
|
|
|
|
std::memcpy(result.dataOffset(sizeof(size)), data.data(), size);
|
|
|
|
std::memcpy(result.dataOffset(sizeof(size)+size), randomData.data(), randomData.size());
|
2015-10-27 22:19:06 +01:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
optional<Data> RandomPadding::remove(const Data &data) {
|
2017-12-03 20:01:41 +01:00
|
|
|
uint32_t size = deserialize<uint32_t>(data.data());
|
2015-10-27 22:19:06 +01:00
|
|
|
if(sizeof(size) + size >= data.size()) {
|
2018-05-17 08:03:03 +02:00
|
|
|
LOG(ERR, "Config file is invalid: Invalid padding.");
|
2015-10-27 22:19:06 +01:00
|
|
|
return boost::none;
|
|
|
|
};
|
|
|
|
Data result(size);
|
2017-12-03 20:01:41 +01:00
|
|
|
std::memcpy(result.data(), data.dataOffset(sizeof(size)), size);
|
2019-06-08 22:06:17 +02:00
|
|
|
return result;
|
2015-10-27 22:19:06 +01:00
|
|
|
}
|
2015-11-11 20:00:24 +01:00
|
|
|
}
|