// rng.h - originally written and placed in the public domain by Wei Dai /// \file rng.h /// \brief Miscellaneous classes for RNGs /// \details This file contains miscellaneous classes for RNGs, including LC_RNG(), /// X917RNG() and MaurerRandomnessTest() /// \sa osrng.h, randpool.h #ifndef CRYPTOPP_RNG_H #define CRYPTOPP_RNG_H #include "cryptlib.h" #include "filters.h" #include "smartptr.h" NAMESPACE_BEGIN(CryptoPP) /// \brief Linear Congruential Generator (LCG) /// \details Originally propsed by William S. England. /// \warning LC_RNG is suitable for simulations, where uniformaly distrubuted numbers are /// required quickly. It should not be used for cryptographic purposes. class LC_RNG : public RandomNumberGenerator { public: /// \brief Construct a Linear Congruential Generator (LCG) /// \param init_seed the initial value for the generator LC_RNG(word32 init_seed) : seed(init_seed) {} void GenerateBlock(byte *output, size_t size); word32 GetSeed() {return seed;} private: word32 seed; static const word32 m; static const word32 q; static const word16 a; static const word16 r; }; /// \brief ANSI X9.17 RNG /// \details X917RNG is from ANSI X9.17 Appendix C, and it uses a 64-bit block cipher, like TripleDES. /// If you use a 128-bit block cipher, like AES, then you are effectively using an ANSI X9.31 generator. /// \sa AutoSeededX917RNG, DefaultAutoSeededRNG class CRYPTOPP_DLL X917RNG : public RandomNumberGenerator, public NotCopyable { public: /// \brief Construct a X917RNG /// \param cipher the block cipher to use for the generator /// \param seed a byte buffer to use as a seed /// \param deterministicTimeVector additional entropy /// \details cipher will be deleted by the destructor. seed must be at least /// BlockSize() in length. deterministicTimeVector = 0 means obtain time vector /// from the system. /// \details When constructing a X917RNG, the generator must be keyed or an access /// violation will occur because the time vector is encrypted using the block cipher. /// To key the generator during constructions, perform the following: ///
/// SecByteBlock key(AES::DEFAULT_KEYLENGTH), seed(AES::BLOCKSIZE); /// OS_GenerateRandomBlock(false, key, key.size()); /// OS_GenerateRandomBlock(false, seed, seed.size()); /// X917RNG prng(new AES::Encryption(key, AES::DEFAULT_KEYLENGTH), seed, NULLPTR);/// \sa AutoSeededX917RNG X917RNG(BlockTransformation *cipher, const byte *seed, const byte *deterministicTimeVector = NULLPTR); void GenerateIntoBufferedTransformation(BufferedTransformation &target, const std::string &channel, lword size); private: member_ptr