Commit 235d8f28f8b7de0f1fea3f8fecc5af6c3917c650
1 parent
b8b273d1
Increase random data provider support
Add a method to get the current random data provider, and document and test the method for resetting it.
Showing
4 changed files
with
40 additions
and
1 deletions
ChangeLog
| 1 | +2013-12-16 Jay Berkenbilt <ejb@ql.org> | |
| 2 | + | |
| 3 | + * Document and make explicit that passing null to | |
| 4 | + QUtil::setRandomDataProvider() resets the random data provider. | |
| 5 | + | |
| 6 | + * Provide QUtil::getRandomDataProvider(). | |
| 7 | + | |
| 1 | 8 | 2013-12-14 Jay Berkenbilt <ejb@ql.org> |
| 2 | 9 | |
| 3 | 10 | * Allow anyspace rather than just newline to follow xref header. | ... | ... |
include/qpdf/QUtil.hh
| ... | ... | @@ -142,9 +142,20 @@ namespace QUtil |
| 142 | 142 | // memory for the RandomDataProvider. This method modifies a |
| 143 | 143 | // static variable. If you are providing your own random data |
| 144 | 144 | // provider, you should call this at the beginning of your program |
| 145 | - // before creating any QPDF objects. | |
| 145 | + // before creating any QPDF objects. Passing a null to this | |
| 146 | + // method will reset the library back to whichever of the built-in | |
| 147 | + // random data handlers is appropriate basedon how qpdf was | |
| 148 | + // compiled. | |
| 146 | 149 | QPDF_DLL |
| 147 | 150 | void setRandomDataProvider(RandomDataProvider*); |
| 151 | + | |
| 152 | + // This returns the random data provider that would be used the | |
| 153 | + // next time qpdf needs random data. It will never return null. | |
| 154 | + // If no random data provider has been provided and the library | |
| 155 | + // was not compiled with any random data provider available, an | |
| 156 | + // exception will be thrown. | |
| 157 | + QPDF_DLL | |
| 158 | + RandomDataProvider* getRandomDataProvider(); | |
| 148 | 159 | }; |
| 149 | 160 | |
| 150 | 161 | #endif // __QUTIL_HH__ | ... | ... |
libqpdf/QUtil.cc
| ... | ... | @@ -423,6 +423,8 @@ initialize_random_data_provider() |
| 423 | 423 | random_data_provider = insecure_random_data_provider; |
| 424 | 424 | } |
| 425 | 425 | } |
| 426 | + // QUtil.hh has comments indicating that getRandomDataProvider(), | |
| 427 | + // which calls this method, never returns null. | |
| 426 | 428 | if (random_data_provider == 0) |
| 427 | 429 | { |
| 428 | 430 | throw std::logic_error("QPDF has no random data provider"); |
| ... | ... | @@ -435,6 +437,13 @@ QUtil::setRandomDataProvider(RandomDataProvider* p) |
| 435 | 437 | random_data_provider = p; |
| 436 | 438 | } |
| 437 | 439 | |
| 440 | +RandomDataProvider* | |
| 441 | +QUtil::getRandomDataProvider() | |
| 442 | +{ | |
| 443 | + initialize_random_data_provider(); | |
| 444 | + return random_data_provider; | |
| 445 | +} | |
| 446 | + | |
| 438 | 447 | void |
| 439 | 448 | QUtil::initializeWithRandomBytes(unsigned char* data, size_t len) |
| 440 | 449 | { | ... | ... |
libtests/random.cc
| ... | ... | @@ -24,6 +24,7 @@ class BogusRandomDataProvider: public RandomDataProvider |
| 24 | 24 | |
| 25 | 25 | int main() |
| 26 | 26 | { |
| 27 | + RandomDataProvider* orig_rdp = QUtil::getRandomDataProvider(); | |
| 27 | 28 | long r1 = QUtil::random(); |
| 28 | 29 | long r2 = QUtil::random(); |
| 29 | 30 | if (r1 == r2) |
| ... | ... | @@ -48,6 +49,11 @@ int main() |
| 48 | 49 | #endif |
| 49 | 50 | BogusRandomDataProvider brdp; |
| 50 | 51 | QUtil::setRandomDataProvider(&brdp); |
| 52 | + if (QUtil::getRandomDataProvider() != &brdp) | |
| 53 | + { | |
| 54 | + std::cout << "fail: getRandomDataProvider didn't" | |
| 55 | + " return our provider\n"; | |
| 56 | + } | |
| 51 | 57 | r1 = QUtil::random(); |
| 52 | 58 | r2 = QUtil::random(); |
| 53 | 59 | if (r1 != r2) |
| ... | ... | @@ -63,6 +69,12 @@ int main() |
| 63 | 69 | { |
| 64 | 70 | std::cout << "fail: bogus random didn't provide correct bytes\n"; |
| 65 | 71 | } |
| 72 | + QUtil::setRandomDataProvider(0); | |
| 73 | + if (QUtil::getRandomDataProvider() != orig_rdp) | |
| 74 | + { | |
| 75 | + std::cout << "fail: passing null to setRandomDataProvider " | |
| 76 | + "didn't reset the random data provider\n"; | |
| 77 | + } | |
| 66 | 78 | std::cout << "random: end of tests\n"; |
| 67 | 79 | return 0; |
| 68 | 80 | } | ... | ... |