Vanetza
Loading...
Searching...
No Matches
backend.cpp
1#include <vanetza/common/factory.hpp>
2#include <vanetza/security/backend.hpp>
3#include <cassert>
4#include <stdexcept>
5
6namespace
7{
8
9static vanetza::Factory<vanetza::security::Backend> backend_factory;
10
11template<typename T>
12class BackendRegistrar
13{
14public:
15 BackendRegistrar(const std::string& name)
16 {
17 auto f = []() { return std::unique_ptr<vanetza::security::Backend> { new T() }; };
18 bool success = backend_factory.add(name, f) && backend_factory.configure_default(name);
19 assert(success);
20 }
21};
22
23} // namespace
24
25// order of VANETZA_REGISTER_CRYPTO_BACKEND invocation defines priority: last registered one will be default
26#define VANETZA_REGISTER_CRYPTO_BACKEND(clazz)
27 namespace {
28 using namespace vanetza::security;
29 static const BackendRegistrar<clazz> clazz##Factory(clazz::backend_name);
30 }
31
32#include <vanetza/security/backend_null.hpp>
34
35#ifdef VANETZA_WITH_CRYPTOPP
36# include <vanetza/security/backend_cryptopp.hpp>
37 VANETZA_REGISTER_CRYPTO_BACKEND(BackendCryptoPP)
38#endif
39
40#ifdef VANETZA_WITH_OPENSSL
41# include <vanetza/security/backend_openssl.hpp>
43#endif
44
45namespace vanetza
46{
47namespace security
48{
49
50const Factory<Backend>& builtin_backends()
51{
52 return backend_factory;
53}
54
55std::unique_ptr<Backend> create_backend(const std::string& name, const Factory<Backend>& factory)
56{
57 if (name == "default") {
58 return factory.create();
59 } else {
60 return factory.create(name);
61 }
62}
63
64std::unique_ptr<Backend> create_backend_or_throw(const std::string& name)
65{
66 auto backend = create_backend(name);
67 if (!backend) {
68 throw std::runtime_error("security backend unavailable");
69 }
70 return backend;
71}
72
73} // namespace security
74} // namespace vanetza
#define VANETZA_REGISTER_CRYPTO_BACKEND(clazz)
Definition backend.cpp:26