aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFCrypto_native.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2020-04-06 16:19:37 +0200
committerJay Berkenbilt <ejb@ql.org>2020-04-06 17:23:02 +0200
commit77198d5310d961ba3605db74fe1d213bb5d19f34 (patch)
treea92ae4e8056d6a8a5bf284c78460a6112710424e /libqpdf/QPDFCrypto_native.cc
parent52749b85df2e25c5ca35d5e0d07fbe4248b6f99b (diff)
downloadqpdf-77198d5310d961ba3605db74fe1d213bb5d19f34.tar.zst
Delegate random number generation to crypto provider (fixes #418)
Diffstat (limited to 'libqpdf/QPDFCrypto_native.cc')
-rw-r--r--libqpdf/QPDFCrypto_native.cc35
1 files changed, 35 insertions, 0 deletions
diff --git a/libqpdf/QPDFCrypto_native.cc b/libqpdf/QPDFCrypto_native.cc
index d078ba77..389b5708 100644
--- a/libqpdf/QPDFCrypto_native.cc
+++ b/libqpdf/QPDFCrypto_native.cc
@@ -1,6 +1,41 @@
#include <qpdf/QPDFCrypto_native.hh>
#include <qpdf/QUtil.hh>
+#ifdef USE_INSECURE_RANDOM
+# include <qpdf/InsecureRandomDataProvider.hh>
+#endif
+#include <qpdf/SecureRandomDataProvider.hh>
+
+static RandomDataProvider* getRandomProvider()
+{
+#ifdef USE_INSECURE_RANDOM
+ static RandomDataProvider* insecure_random_data_provider =
+ InsecureRandomDataProvider::getInstance();
+#else
+ static RandomDataProvider* insecure_random_data_provider = 0;
+#endif
+ static RandomDataProvider* secure_random_data_provider =
+ SecureRandomDataProvider::getInstance();
+
+ static RandomDataProvider* provider = (
+ secure_random_data_provider ? secure_random_data_provider
+ : insecure_random_data_provider ? insecure_random_data_provider
+ : 0);
+
+ if (provider == 0)
+ {
+ throw std::logic_error("QPDFCrypto_native has no random data provider");
+ }
+
+ return provider;
+}
+
+void
+QPDFCrypto_native::provideRandomData(unsigned char* data, size_t len)
+{
+ getRandomProvider()->provideRandomData(data, len);
+}
+
void
QPDFCrypto_native::MD5_init()
{