aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-11-04 02:36:53 +0100
committerJay Berkenbilt <ejb@ql.org>2019-11-09 14:18:02 +0100
commit2de41856a0fe2181c0adb7ac1d7cf06037113775 (patch)
tree2768dc66dddd7a81b8911abf4387a74c4544b0c1 /include
parent34c0a880222916e324a0c383ec463f73922b3864 (diff)
downloadqpdf-2de41856a0fe2181c0adb7ac1d7cf06037113775.tar.zst
QPDFCryptoProvider: initial implementation
Diffstat (limited to 'include')
-rw-r--r--include/qpdf/QPDFCryptoImpl.hh44
-rw-r--r--include/qpdf/QPDFCryptoProvider.hh102
2 files changed, 146 insertions, 0 deletions
diff --git a/include/qpdf/QPDFCryptoImpl.hh b/include/qpdf/QPDFCryptoImpl.hh
new file mode 100644
index 00000000..4da299aa
--- /dev/null
+++ b/include/qpdf/QPDFCryptoImpl.hh
@@ -0,0 +1,44 @@
+// Copyright (c) 2005-2019 Jay Berkenbilt
+//
+// This file is part of qpdf.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Versions of qpdf prior to version 7 were released under the terms
+// of version 2.0 of the Artistic License. At your option, you may
+// continue to consider qpdf to be licensed under those terms. Please
+// see the manual for additional information.
+
+#ifndef QPDFCRYPTOIMPL_HH
+#define QPDFCRYPTOIMPL_HH
+
+#include <qpdf/DLL.h>
+
+// This class is part of qpdf's pluggable crypto provider support.
+// Most users won't need to know or care about this class, but you can
+// use it if you want to supply your own crypto implementation. To do
+// so, provide an implementation of QPDFCryptoImpl, ensure that you
+// register it by calling QPDFCryptoProvider::registerImpl, and make
+// it the default by calling QPDFCryptoProvider::setDefaultProvider.
+
+class QPDF_DLL_CLASS QPDFCryptoImpl
+{
+ public:
+ QPDF_DLL
+ QPDFCryptoImpl() = default;
+
+ QPDF_DLL
+ virtual ~QPDFCryptoImpl() = default;
+};
+
+#endif // QPDFCRYPTOIMPL_HH
diff --git a/include/qpdf/QPDFCryptoProvider.hh b/include/qpdf/QPDFCryptoProvider.hh
new file mode 100644
index 00000000..4243fcfd
--- /dev/null
+++ b/include/qpdf/QPDFCryptoProvider.hh
@@ -0,0 +1,102 @@
+// Copyright (c) 2005-2019 Jay Berkenbilt
+//
+// This file is part of qpdf.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Versions of qpdf prior to version 7 were released under the terms
+// of version 2.0 of the Artistic License. At your option, you may
+// continue to consider qpdf to be licensed under those terms. Please
+// see the manual for additional information.
+
+#ifndef QPDFCRYPTOPROVIDER_HH
+#define QPDFCRYPTOPROVIDER_HH
+
+#include <qpdf/DLL.h>
+#include <qpdf/QPDFCryptoImpl.hh>
+#include <string>
+#include <map>
+#include <memory>
+#include <functional>
+
+// This class is part of qpdf's pluggable crypto provider support.
+// Most users won't need to know or care about this class, but you can
+// use it if you want to supply your own crypto implementation. See
+// also comments in QPDFCryptoImpl.hh.
+
+class QPDFCryptoProvider
+{
+ public:
+
+ // Methods for getting and registering crypto implementations.
+ // These methods are not thread-safe.
+
+ // Return an instance of a crypto provider using the default
+ // implementation.
+ QPDF_DLL
+ static std::shared_ptr<QPDFCryptoImpl> getImpl();
+
+ // Return an instance of the crypto provider registered using the
+ // given name.
+ QPDF_DLL
+ static std::shared_ptr<QPDFCryptoImpl>
+ getImpl(std::string const& name);
+
+ // Register the given type (T) as a crypto implementation. T must
+ // be derived from QPDFCryptoImpl and must have a constructor that
+ // takes no arguments.
+ template<typename T>
+ QPDF_DLL
+ static void registerImpl(std::string const& name);
+
+ // Set the crypto provider registered with the given name as the
+ // default crypto implementation.
+ QPDF_DLL
+ static void setDefaultProvider(std::string const& name);
+
+ private:
+ QPDFCryptoProvider();
+ ~QPDFCryptoProvider() = default;
+ QPDFCryptoProvider(QPDFCryptoProvider const&) = delete;
+ QPDFCryptoProvider& operator=(QPDFCryptoProvider const&) = delete;
+
+ static QPDFCryptoProvider& getInstance();
+
+ std::shared_ptr<QPDFCryptoImpl>
+ getImpl_internal(std::string const& name) const;
+ template<typename T>
+ void registerImpl_internal(std::string const& name);
+ void setDefaultProvider_internal(std::string const& name);
+
+ class Members
+ {
+ friend class QPDFCryptoProvider;
+
+ public:
+ Members() = default;
+ QPDF_DLL
+ ~Members() = default;
+
+ private:
+ Members(Members const&) = delete;
+ Members& operator=(Members const&) = delete;
+
+ typedef std::function<std::shared_ptr<QPDFCryptoImpl> ()> provider_fn;
+ std::string default_provider;
+ std::map<std::string, provider_fn> providers;
+ };
+
+ std::shared_ptr<Members> m;
+};
+
+#endif // QPDFCRYPTOPROVIDER_HH