#include #include #include #include #ifdef USE_CRYPTO_NATIVE # include #endif #ifdef USE_CRYPTO_GNUTLS # include #endif #ifdef USE_CRYPTO_OPENSSL # include #endif std::shared_ptr QPDFCryptoProvider::getImpl() { QPDFCryptoProvider& p = getInstance(); if (p.m->default_provider.empty()) { throw std::logic_error( "QPDFCryptoProvider::getImpl called with no default provider."); } return p.getImpl_internal(p.m->default_provider); } std::shared_ptr QPDFCryptoProvider::getImpl(std::string const& name) { return getInstance().getImpl_internal(name); } template void QPDFCryptoProvider::registerImpl(std::string const& name) { getInstance().registerImpl_internal(name); } void QPDFCryptoProvider::setDefaultProvider(std::string const& name) { getInstance().setDefaultProvider_internal(name); } QPDFCryptoProvider::QPDFCryptoProvider() : m(std::make_shared()) { #ifdef USE_CRYPTO_NATIVE registerImpl_internal("native"); #endif #ifdef USE_CRYPTO_GNUTLS registerImpl_internal("gnutls"); #endif #ifdef USE_CRYPTO_OPENSSL registerImpl_internal("openssl"); #endif std::string default_crypto; if (!QUtil::get_env("QPDF_CRYPTO_PROVIDER", &default_crypto)) { default_crypto = DEFAULT_CRYPTO; } setDefaultProvider_internal(default_crypto); } QPDFCryptoProvider& QPDFCryptoProvider::getInstance() { static QPDFCryptoProvider instance; return instance; } std::shared_ptr QPDFCryptoProvider::getImpl_internal(std::string const& name) const { auto iter = this->m->providers.find(name); if (iter == this->m->providers.end()) { throw std::logic_error( "QPDFCryptoProvider requested unknown implementation \"" + name + "\""); } return this->m->providers[name](); } template void QPDFCryptoProvider::registerImpl_internal(std::string const& name) { this->m->providers[name] = std::make_shared; } void QPDFCryptoProvider::setDefaultProvider_internal(std::string const& name) { if (!this->m->providers.count(name)) { throw std::logic_error( "QPDFCryptoProvider: request to set default" " provider to unknown implementation \"" + name + "\""); } this->m->default_provider = name; } std::set QPDFCryptoProvider::getRegisteredImpls() { std::set result; QPDFCryptoProvider& p = getInstance(); for (auto const& iter: p.m->providers) { result.insert(iter.first); } return result; } std::string QPDFCryptoProvider::getDefaultProvider() { return getInstance().m->default_provider; }