diff options
author | Jay Berkenbilt <ejb@ql.org> | 2013-11-30 18:02:56 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2013-12-14 21:17:35 +0100 |
commit | 5e3bad2f86665b35155095b91a2d672fc7335870 (patch) | |
tree | 984d4830ee0dd3b8e90bae913f411a84c8e876d4 /libqpdf/InsecureRandomDataProvider.cc | |
parent | e9a319fb9536347aeab076cdb18e1ff97eb66c07 (diff) | |
download | qpdf-5e3bad2f86665b35155095b91a2d672fc7335870.tar.zst |
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.
Diffstat (limited to 'libqpdf/InsecureRandomDataProvider.cc')
-rw-r--r-- | libqpdf/InsecureRandomDataProvider.cc | 49 |
1 files changed, 49 insertions, 0 deletions
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 <qpdf/InsecureRandomDataProvider.hh> + +#include <qpdf/qpdf-config.h> +#include <qpdf/QUtil.hh> +#include <stdlib.h> + +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<unsigned char>((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; +} |