30 #ifndef DATA_PACKER_IMPLEMENTATION_GUARD
31 #define DATA_PACKER_IMPLEMENTATION_GUARD
43 template <
typename T_CryptoProv
ider>
45 cryptoProvider(cryptoProvider),
46 frontPaddingSize(frontPaddingSize),
48 backPaddingSize(backPaddingSize) {
58 template <
typename T_CryptoProv
ider>
63 BigInteger packedBuckets(0);
65 size_t packedBucketCounter = 0;
68 if (packedBucketCounter == this->bucketsPerEncryption) {
69 output.emplace_back(this->cryptoProvider.EncryptInteger(packedBuckets));
72 packedBuckets = BigInteger(0);
73 packedBucketCounter = 0;
79 if (this->frontPaddingSize > 0) {
80 packedBuckets += (*bucketIterator).frontPadding << (
static_cast<unsigned long>(packedBucketCounter * this->bucketSize));
84 packedBuckets += (*bucketIterator).data << (
static_cast<unsigned long>(packedBucketCounter * this->bucketSize + this->frontPaddingSize));
87 if (this->backPaddingSize > 0) {
88 packedBuckets += (*bucketIterator).backPadding << (
static_cast<unsigned long>(packedBucketCounter * this->bucketSize + this->frontPaddingSize + this->dataSize));
91 ++packedBucketCounter;
95 output.emplace_back(this->cryptoProvider.EncryptInteger(packedBuckets));
107 template <
typename T_CryptoProv
ider>
113 BigInteger packedBuckets = this->cryptoProvider.DecryptInteger(*packedDataIterator);
116 for (
size_t i = 0; i < this->bucketsPerEncryption; ++i) {
119 if (this->frontPaddingSize > 0) {
121 bucket.
frontPadding = packedBuckets % this->frontPaddingMessageSpace;
124 packedBuckets >>=
static_cast<unsigned long>(this->frontPaddingSize);
128 bucket.
data = packedBuckets % this->dataMessageSpace;
130 if (this->backPaddingSize > 0) {
132 packedBuckets >>=
static_cast<unsigned long>(this->dataSize);
135 bucket.
backPadding = packedBuckets % this->backPaddingMessageSpace;
138 packedBuckets >>=
static_cast<unsigned long>(this->backPaddingSize);
141 output.emplace_back(bucket);
144 if (output.size() == totalBucketCount) {
158 if (output.size() != totalBucketCount) {
160 throw std::runtime_error(
"Unexpected number of packed buckets.");
171 template <
typename T_CryptoProv
ider>
176 lhsIterator != lhs.end(), rhsIterator != rhs.end();
177 ++lhsIterator, ++rhsIterator) {
178 output.emplace_back(*lhsIterator + *rhsIterator);
189 template <
typename T_CryptoProv
ider>
194 output.emplace_back(*lhsIterator * rhs);
207 template <
typename T_CryptoProv
ider>
209 this->dataMessageSpace = BigInteger(1) <<
static_cast<unsigned long>(this->dataSize);
210 this->frontPaddingMessageSpace = BigInteger(1) <<
static_cast<unsigned long>(this->frontPaddingSize);
211 this->backPaddingMessageSpace = BigInteger(1) <<
static_cast<unsigned long>(this->backPaddingSize);
213 this->bucketSize = this->frontPaddingSize + this->dataSize + this->backPaddingSize;
215 this->bucketsPerEncryption = this->cryptoProvider.GetMessageSpaceSize() /
static_cast<unsigned long>(this->bucketSize);
221 #endif//DATA_PACKER_IMPLEMENTATION_GUARD
BigInteger backPadding
The back padding ( )
Container for data buckets.
PackedData Pack(const UnpackedData &input) const
Pack data.
BigInteger data
The data ( )
UnpackedData Unpack(const PackedData &input, const size_t totalBucketCount) const
Unpack data.
std::deque< typename DataPacker< T_CryptoProvider >::DataBucket > UnpackedData
Define a vector template specialization for vectors of unpacked data.
void initialize()
Initialize class members.
Template class which implements the data packing functionality.
BigInteger frontPadding
The front padding ( )
DataPacker(const T_CryptoProvider &cryptoProvider, const size_t dataSize, const size_t frontPaddingSize=0, const size_t backPaddingSize=0)
Constructor with custom data sizes.
PackedData HomomorphicAdd(const PackedData &lhs, const PackedData &rhs)
Add two vectors of packed data.
std::deque< typename T_CryptoProvider::Ciphertext > PackedData
Define a vector template specialization for vectors of packed data.
PackedData HomomorphicMultiply(const PackedData &lhs, const BigInteger &rhs)
Multiply a vector of packed data with a constant plaintext term.