//======================================================================== // // CryptoSignBackend.cc // // This file is licensed under the GPLv2 or later // // Copyright 2023 g10 Code GmbH, Author: Sune Stolborg Vuorela //======================================================================== #include "CryptoSignBackend.h" #include "config.h" #ifdef ENABLE_GPGME # include "GPGMECryptoSignBackend.h" #endif #ifdef ENABLE_NSS3 # include "NSSCryptoSignBackend.h" #endif namespace CryptoSign { void Factory::setPreferredBackend(CryptoSign::Backend::Type backend) { preferredBackend = backend; } static std::string_view toStringView(const char *str) { if (str) { return std::string_view(str); } return {}; } std::optional Factory::typeFromString(std::string_view string) { if (string.empty()) { return std::nullopt; } if ("GPG" == string) { return Backend::Type::GPGME; } if ("NSS" == string) { return Backend::Type::NSS3; } return std::nullopt; } std::optional Factory::getActive() { if (preferredBackend) { return *preferredBackend; } static auto backendFromEnvironment = typeFromString(toStringView(getenv("POPPLER_SIGNATURE_BACKEND"))); if (backendFromEnvironment) { return *backendFromEnvironment; } static auto backendFromCompiledDefault = typeFromString(toStringView(DEFAULT_SIGNATURE_BACKEND)); if (backendFromCompiledDefault) { return *backendFromCompiledDefault; } return std::nullopt; } static std::vector createAvailableBackends() { std::vector backends; #ifdef ENABLE_NSS3 backends.push_back(Backend::Type::NSS3); #endif #ifdef ENABLE_GPGME if (GpgSignatureBackend::hasSufficientVersion()) { backends.push_back(Backend::Type::GPGME); } #endif return backends; } std::vector Factory::getAvailable() { static std::vector availableBackends = createAvailableBackends(); return availableBackends; } std::unique_ptr Factory::createActive() { auto active = getActive(); if (active) { return create(active.value()); } return nullptr; } std::unique_ptr CryptoSign::Factory::create(Backend::Type backend) { switch (backend) { case Backend::Type::NSS3: #ifdef ENABLE_NSS3 return std::make_unique(); #else return nullptr; #endif case Backend::Type::GPGME: { #ifdef ENABLE_GPGME return std::make_unique(); #else return nullptr; #endif } } return nullptr; } /// backend specific settings // Android build wants some methods out of line in the interfaces Backend::~Backend() = default; SigningInterface::~SigningInterface() = default; VerificationInterface::~VerificationInterface() = default; std::optional Factory::preferredBackend = std::nullopt; } // namespace Signature;