#pragma once #ifndef MESSMER_CPPUTILS_CRYPTO_SYMMETRIC_CIPHER_H_ #define MESSMER_CPPUTILS_CRYPTO_SYMMETRIC_CIPHER_H_ #include #include #include "../../data/Data.h" #include "../../random/Random.h" using std::string; namespace cpputils { template struct CipherConcept { public: BOOST_CONCEPT_USAGE(CipherConcept) { same_type(UINT32_C(0), X::ciphertextSize(UINT32_C(5))); same_type(UINT32_C(0), X::plaintextSize(UINT32_C(5))); typename X::EncryptionKey key = X::CreateKey(Random::OSRandom()); same_type(Data(0), X::encrypt((uint8_t*)nullptr, UINT32_C(0), key)); same_type(boost::optional(Data(0)), X::decrypt((uint8_t*)nullptr, UINT32_C(0), key)); string name = X::NAME; } private: // Type deduction will fail unless the arguments have the same type. template void same_type(T const&, T const&); }; } #endif