#include "./opensslrandomdevice.h" #include "../io/cryptoexception.h" #include #include #include #include using namespace std; namespace Util { /*! * \namespace QtGui * \brief Contains all miscellaneous utility functions. */ /*! * \class OpenSslRandomDevice * \brief Provides a random device using the OpenSSL function RAND_bytes(). */ /*! * \brief Constructs a new random device. */ OpenSslRandomDevice::OpenSslRandomDevice() { } /*! * \brief Generates a new random number. */ uint32 OpenSslRandomDevice::operator()() const { unsigned char buf[4]; if (RAND_bytes(buf, sizeof(buf))) { return ConversionUtilities::LE::toUInt32(reinterpret_cast(buf)); } else { string msg; unsigned long errorCode = ERR_get_error(); while (errorCode != 0) { if (!msg.empty()) { msg += '\n'; } msg += ERR_error_string(errorCode, 0); errorCode = ERR_get_error(); } throw Io::CryptoException(msg); } } /*! * \brief Returns the status. */ bool OpenSslRandomDevice::status() const { return RAND_status(); } }