#include "CryCipher.h" #include #include #include "cryfs/impl/config/crypto/inner/ConcreteInnerEncryptor.h" using std::vector; using std::string; using cpputils::unique_ref; using cpputils::make_unique_ref; using blockstore::BlockStore2; using std::shared_ptr; using std::make_shared; using boost::optional; using boost::none; using blockstore::encrypted::EncryptedBlockStore2; using namespace cryfs; using namespace cpputils; constexpr size_t CryCiphers::MAX_KEY_SIZE; template class CryCipherInstance: public CryCipher { public: BOOST_CONCEPT_ASSERT((CipherConcept)); static_assert(Cipher::KEYSIZE <= CryCiphers::MAX_KEY_SIZE, "The key size for this cipher is too large. Please modify CryCiphers::MAX_KEY_SIZE"); CryCipherInstance(const optional warning = none): _warning(warning) { } string cipherName() const override { return Cipher::NAME; } const optional &warning() const override { return _warning; } unique_ref createEncryptedBlockstore(unique_ref baseBlockStore, const string &encKey) const override { return make_unique_ref>(std::move(baseBlockStore), Cipher::EncryptionKey::FromString(encKey)); } string createKey(cpputils::RandomGenerator &randomGenerator) const override { return Cipher::EncryptionKey::CreateKey(randomGenerator, Cipher::KEYSIZE).ToString(); } unique_ref createInnerConfigEncryptor(const EncryptionKey& key) const override { ASSERT(key.binaryLength() == CryCiphers::MAX_KEY_SIZE, "Wrong key size"); return make_unique_ref>(key.take(Cipher::KEYSIZE)); } private: optional _warning; }; const string CryCiphers::INTEGRITY_WARNING = "This cipher does not ensure integrity."; //We have to use shared_ptr instead of unique_ref, because c++ initializer_list needs copyable values const vector> CryCiphers::SUPPORTED_CIPHERS = { make_shared>(), make_shared>(), make_shared>(INTEGRITY_WARNING), make_shared>(), make_shared>(INTEGRITY_WARNING), make_shared>(), make_shared>(INTEGRITY_WARNING), make_shared>(), make_shared>(INTEGRITY_WARNING), make_shared>(), make_shared>(INTEGRITY_WARNING), make_shared>(), make_shared>(INTEGRITY_WARNING), make_shared>(), make_shared>(INTEGRITY_WARNING), make_shared>(), make_shared>(INTEGRITY_WARNING), make_shared>(), make_shared>(INTEGRITY_WARNING), make_shared>(), make_shared>(INTEGRITY_WARNING) }; const CryCipher& CryCiphers::find(const string &cipherName) { auto found = std::find_if(CryCiphers::SUPPORTED_CIPHERS.begin(), CryCiphers::SUPPORTED_CIPHERS.end(), [cipherName] (const std::shared_ptr& element) { return element->cipherName() == cipherName; }); ASSERT(found != CryCiphers::SUPPORTED_CIPHERS.end(), "Unknown Cipher: "+cipherName); return **found; } vector CryCiphers::_buildSupportedCipherNames() { vector result; for (const auto& cipher : CryCiphers::SUPPORTED_CIPHERS) { result.push_back(cipher->cipherName()); } return result; } const vector& CryCiphers::supportedCipherNames() { static vector supportedCipherNames = _buildSupportedCipherNames(); return supportedCipherNames; }