From 2de41856a0fe2181c0adb7ac1d7cf06037113775 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 3 Nov 2019 20:36:53 -0500 Subject: QPDFCryptoProvider: initial implementation --- libqpdf/QPDFCryptoProvider.cc | 76 +++++++++++++++++++++++++++++++++++++++ libqpdf/QPDFCrypto_native.cc | 1 + libqpdf/build.mk | 2 ++ libqpdf/qpdf/QPDFCrypto_native.hh | 16 +++++++++ 4 files changed, 95 insertions(+) create mode 100644 libqpdf/QPDFCryptoProvider.cc create mode 100644 libqpdf/QPDFCrypto_native.cc create mode 100644 libqpdf/qpdf/QPDFCrypto_native.hh (limited to 'libqpdf') diff --git a/libqpdf/QPDFCryptoProvider.cc b/libqpdf/QPDFCryptoProvider.cc new file mode 100644 index 00000000..8d795534 --- /dev/null +++ b/libqpdf/QPDFCryptoProvider.cc @@ -0,0 +1,76 @@ +#include +#include + +#include + +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()) +{ + registerImpl_internal("native"); + setDefaultProvider_internal("native"); +} + +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) +{ + this->m->default_provider = name; +} diff --git a/libqpdf/QPDFCrypto_native.cc b/libqpdf/QPDFCrypto_native.cc new file mode 100644 index 00000000..ab9fd3a2 --- /dev/null +++ b/libqpdf/QPDFCrypto_native.cc @@ -0,0 +1 @@ +#include diff --git a/libqpdf/build.mk b/libqpdf/build.mk index 1da6c1a1..d2bcd8c5 100644 --- a/libqpdf/build.mk +++ b/libqpdf/build.mk @@ -39,6 +39,8 @@ SRCS_libqpdf = \ libqpdf/QPDF.cc \ libqpdf/QPDFAcroFormDocumentHelper.cc \ libqpdf/QPDFAnnotationObjectHelper.cc \ + libqpdf/QPDFCryptoProvider.cc \ + libqpdf/QPDFCrypto_native.cc \ libqpdf/QPDFExc.cc \ libqpdf/QPDFFormFieldObjectHelper.cc \ libqpdf/QPDFMatrix.cc \ diff --git a/libqpdf/qpdf/QPDFCrypto_native.hh b/libqpdf/qpdf/QPDFCrypto_native.hh new file mode 100644 index 00000000..785d6c6f --- /dev/null +++ b/libqpdf/qpdf/QPDFCrypto_native.hh @@ -0,0 +1,16 @@ +#ifndef QPDFCRYPTO_NATIVE_HH +#define QPDFCRYPTO_NATIVE_HH + +#include +#include + +class QPDFCrypto_native: public QPDFCryptoImpl +{ + public: + QPDFCrypto_native() = default; + + QPDF_DLL + virtual ~QPDFCrypto_native() = default; +}; + +#endif // QPDFCRYPTO_NATIVE_HH -- cgit v1.2.3-70-g09d2