summaryrefslogtreecommitdiffstats
path: root/libtests
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2013-11-30 18:02:56 +0100
committerJay Berkenbilt <ejb@ql.org>2013-12-14 21:17:35 +0100
commit5e3bad2f86665b35155095b91a2d672fc7335870 (patch)
tree984d4830ee0dd3b8e90bae913f411a84c8e876d4 /libtests
parente9a319fb9536347aeab076cdb18e1ff97eb66c07 (diff)
downloadqpdf-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 'libtests')
-rw-r--r--libtests/build.mk1
-rw-r--r--libtests/qtest/random.test16
-rw-r--r--libtests/random.cc65
3 files changed, 82 insertions, 0 deletions
diff --git a/libtests/build.mk b/libtests/build.mk
index 7a535953..22d9299e 100644
--- a/libtests/build.mk
+++ b/libtests/build.mk
@@ -12,6 +12,7 @@ BINS_libtests = \
png_filter \
pointer_holder \
qutil \
+ random \
rc4 \
sha2
diff --git a/libtests/qtest/random.test b/libtests/qtest/random.test
new file mode 100644
index 00000000..c3b4b9d7
--- /dev/null
+++ b/libtests/qtest/random.test
@@ -0,0 +1,16 @@
+#!/usr/bin/env perl
+require 5.008;
+BEGIN { $^W = 1; }
+use strict;
+
+require TestDriver;
+
+my $td = new TestDriver('random');
+
+$td->runtest("Random Data Providers",
+ {$td->COMMAND => "random"},
+ {$td->STRING => "random: end of tests\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+$td->report(1);
diff --git a/libtests/random.cc b/libtests/random.cc
new file mode 100644
index 00000000..644fdd91
--- /dev/null
+++ b/libtests/random.cc
@@ -0,0 +1,65 @@
+#include <qpdf/QUtil.hh>
+#include <qpdf/InsecureRandomDataProvider.hh>
+#include <qpdf/SecureRandomDataProvider.hh>
+#include <iostream>
+
+class BogusRandomDataProvider: public RandomDataProvider
+{
+ public:
+ virtual ~BogusRandomDataProvider()
+ {
+ }
+ BogusRandomDataProvider()
+ {
+ }
+ virtual void provideRandomData(unsigned char* data, size_t len)
+ {
+ for (size_t i = 0; i < len; ++i)
+ {
+ data[i] = static_cast<unsigned char>(i & 0xff);
+ }
+ }
+};
+
+int main()
+{
+ long r1 = QUtil::random();
+ long r2 = QUtil::random();
+ if (r1 == r2)
+ {
+ std::cout << "fail: two randoms were the same\n";
+ }
+ InsecureRandomDataProvider irdp;
+ irdp.provideRandomData(reinterpret_cast<unsigned char*>(&r1), 4);
+ irdp.provideRandomData(reinterpret_cast<unsigned char*>(&r2), 4);
+ if (r1 == r2)
+ {
+ std::cout << "fail: two insecure randoms were the same\n";
+ }
+ SecureRandomDataProvider srdp;
+ srdp.provideRandomData(reinterpret_cast<unsigned char*>(&r1), 4);
+ srdp.provideRandomData(reinterpret_cast<unsigned char*>(&r2), 4);
+ if (r1 == r2)
+ {
+ std::cout << "fail: two secure randoms were the same\n";
+ }
+ BogusRandomDataProvider brdp;
+ QUtil::setRandomDataProvider(&brdp);
+ r1 = QUtil::random();
+ r2 = QUtil::random();
+ if (r1 != r2)
+ {
+ std::cout << "fail: two bogus randoms were different\n";
+ }
+ unsigned char buf[4];
+ QUtil::initializeWithRandomBytes(buf, 4);
+ if (! ((buf[0] == 0) &&
+ (buf[1] == 1) &&
+ (buf[2] == 2) &&
+ (buf[3] == 3)))
+ {
+ std::cout << "fail: bogus random didn't provide correct bytes\n";
+ }
+ std::cout << "random: end of tests\n";
+ return 0;
+}