From 5e3bad2f86665b35155095b91a2d672fc7335870 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 30 Nov 2013 12:02:56 -0500 Subject: Refactor random data generation Add new RandomDataProvider object and implement existing random number generation in terms of that. This enables end users to supply their own random data providers. --- libqpdf/InsecureRandomDataProvider.cc | 49 +++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 libqpdf/InsecureRandomDataProvider.cc (limited to 'libqpdf/InsecureRandomDataProvider.cc') diff --git a/libqpdf/InsecureRandomDataProvider.cc b/libqpdf/InsecureRandomDataProvider.cc new file mode 100644 index 00000000..5f637746 --- /dev/null +++ b/libqpdf/InsecureRandomDataProvider.cc @@ -0,0 +1,49 @@ +#include + +#include +#include +#include + +InsecureRandomDataProvider::InsecureRandomDataProvider() : + seeded_random(false) +{ +} + +InsecureRandomDataProvider::~InsecureRandomDataProvider() +{ +} + +void +InsecureRandomDataProvider::provideRandomData(unsigned char* data, size_t len) +{ + for (size_t i = 0; i < len; ++i) + { + data[i] = static_cast((this->random() & 0xff0) >> 4); + } +} + +long +InsecureRandomDataProvider::random() +{ + if (! this->seeded_random) + { + // Seed the random number generator with something simple, but + // just to be interesting, don't use the unmodified current + // time. It would be better if this were a more secure seed. + QUtil::srandom(QUtil::get_current_time() ^ 0xcccc); + this->seeded_random = true; + } + +# ifdef HAVE_RANDOM + return ::random(); +# else + return rand(); +# endif +} + +RandomDataProvider* +InsecureRandomDataProvider::getInstance() +{ + static InsecureRandomDataProvider instance; + return &instance; +} -- cgit v1.2.3-54-g00ecf