#ifndef CHAOS_CIPHER_BLOCK_BLOCKADAPTER_HPP #define CHAOS_CIPHER_BLOCK_BLOCKADAPTER_HPP #include #include namespace Chaos::Cipher::Block { template class BlockAdapter { public: class Key { friend class BlockAdapter; public: template Key(InputIt keyBegin, InputIt keyEnd) : Key_(keyBegin, keyEnd) { } template Key(const std::vector & key) : Key_(key.cbegin(), key.cend()) { } private: ModeT::Cipher::Key Key_; }; template static std::vector Encrypt(const Key & key, const std::vector & plaintext) { typename ModeT::Encryptor encryptor(key.Key_); std::vector result; const uint64_t maxResultSize = encryptor.PredictMaxUpdateOutput(plaintext.size()) + encryptor.PredictMaxFinishOutput(); result.resize(maxResultSize); uint64_t written = encryptor.Update(result.begin(), result.end(), plaintext.begin(), plaintext.end()); written += encryptor.Finish(result.begin() + written, result.end()); result.resize(written); return result; } }; } // namespace Chaos::Cipher::Block #endif // CHAOS_CIPHER_BLOCK_BLOCKADAPTER_HPP