#include #include "AES256_CFB.h" using CryptoPP::CFB_Mode; using CryptoPP::AES; using cpputils::Data; using cpputils::FixedSizeData; namespace blockstore { namespace encrypted { constexpr unsigned int AES256_CFB::IV_SIZE; Data AES256_CFB::encrypt(const byte *plaintext, unsigned int plaintextSize, const EncryptionKey &encKey) { FixedSizeData iv = FixedSizeData::CreateRandom(); auto encryption = CFB_Mode::Encryption(encKey.data(), encKey.BINARY_LENGTH, iv.data()); Data ciphertext(ciphertextSize(plaintextSize)); std::memcpy(ciphertext.data(), iv.data(), IV_SIZE); encryption.ProcessData((byte*)ciphertext.data() + IV_SIZE, plaintext, plaintextSize); return ciphertext; } boost::optional AES256_CFB::decrypt(const byte *ciphertext, unsigned int ciphertextSize, const EncryptionKey &encKey) { if (ciphertextSize < IV_SIZE) { return boost::none; } const byte *ciphertextIV = ciphertext; const byte *ciphertextData = ciphertext + IV_SIZE; auto decryption = CFB_Mode::Decryption((byte*)encKey.data(), encKey.BINARY_LENGTH, ciphertextIV); Data plaintext(plaintextSize(ciphertextSize)); decryption.ProcessData((byte*)plaintext.data(), ciphertextData, plaintext.size()); return std::move(plaintext); } } }