#include #include #include #include namespace { static vanetza::Factory backend_factory; template class BackendRegistrar { public: BackendRegistrar(const std::string& name) { auto f = []() { return std::unique_ptr { new T() }; }; bool success = backend_factory.add(name, f) && backend_factory.configure_default(name); assert(success); } }; } // namespace // order of VANETZA_REGISTER_CRYPTO_BACKEND invocation defines priority: last registered one will be default #define VANETZA_REGISTER_CRYPTO_BACKEND(clazz) \ namespace { \ using namespace vanetza::security; \ static const BackendRegistrar clazz##Factory(clazz::backend_name); \ } #include VANETZA_REGISTER_CRYPTO_BACKEND(BackendNull) #ifdef VANETZA_WITH_CRYPTOPP # include VANETZA_REGISTER_CRYPTO_BACKEND(BackendCryptoPP) #endif #ifdef VANETZA_WITH_OPENSSL # include VANETZA_REGISTER_CRYPTO_BACKEND(BackendOpenSsl) #endif namespace vanetza { namespace security { const Factory& builtin_backends() { return backend_factory; } std::unique_ptr create_backend(const std::string& name, const Factory& factory) { if (name == "default") { return factory.create(); } else { return factory.create(name); } } std::unique_ptr create_backend_or_throw(const std::string& name) { auto backend = create_backend(name); if (!backend) { throw std::runtime_error("security backend unavailable"); } return backend; } } // namespace security } // namespace vanetza