2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-05-31 09:20:52 +00:00

Add random number functions to QUtil

This commit is contained in:
Jay Berkenbilt 2012-12-28 16:37:46 -05:00
parent 16a23368e7
commit 4eccb9d87b
3 changed files with 52 additions and 18 deletions

View File

@ -83,6 +83,18 @@ namespace QUtil
// encoding for the unicode value passed in.
QPDF_DLL
std::string toUTF8(unsigned long uval);
// Wrapper around random from stdlib. Calls srandom automatically
// the first time it is called.
QPDF_DLL
long random();
// Wrapper around srandom from stdlib.
QPDF_DLL
void srandom(unsigned int seed);
QPDF_DLL
void initializeWithRandomBytes(unsigned char* data, size_t len);
};
#endif // __QUTIL_HH__

View File

@ -6,11 +6,6 @@
#include <qpdf/rijndael.h>
#include <string>
#include <stdlib.h>
#include <qpdf/qpdf-config.h>
#ifndef HAVE_RANDOM
# define random rand
# define srandom srand
#endif
bool Pl_AES_PDF::use_static_iv = false;
@ -155,15 +150,6 @@ Pl_AES_PDF::finish()
void
Pl_AES_PDF::initializeVector()
{
static bool seeded_random = false;
if (! seeded_random)
{
// Seed the random number generator with something simple, but
// just to be interesting, don't use the unmodified current
// time....
srandom((int)QUtil::get_current_time() ^ 0xcccc);
seeded_random = true;
}
if (use_zero_iv)
{
for (unsigned int i = 0; i < this->buf_size; ++i)
@ -184,10 +170,7 @@ Pl_AES_PDF::initializeVector()
}
else
{
for (unsigned int i = 0; i < this->buf_size; ++i)
{
this->cbc_block[i] = (unsigned char)((random() & 0xff0) >> 4);
}
QUtil::initializeWithRandomBytes(this->cbc_block, this->buf_size);
}
}

View File

@ -333,3 +333,42 @@ QUtil::toUTF8(unsigned long uval)
return result;
}
long
QUtil::random()
{
static bool seeded_random = false;
if (! seeded_random)
{
// Seed the random number generator with something simple, but
// just to be interesting, don't use the unmodified current
// time....
QUtil::srandom((int)QUtil::get_current_time() ^ 0xcccc);
seeded_random = true;
}
#ifdef HAVE_RANDOM
return ::random();
#else
return rand();
#endif
}
void
QUtil::srandom(unsigned int seed)
{
#ifdef HAVE_RANDOM
::srandom(seed);
#else
srand(seed);
#endif
}
void
QUtil::initializeWithRandomBytes(unsigned char* data, size_t len)
{
for (size_t i = 0; i < len; ++i)
{
data[i] = (unsigned char)((QUtil::random() & 0xff0) >> 4);
}
}