aboutsummaryrefslogtreecommitdiffstats
path: root/src/rng/auto_rng/auto_rng.h
diff options
context:
space:
mode:
authorlloyd <[email protected]>2010-03-19 15:59:45 +0000
committerlloyd <[email protected]>2010-03-19 15:59:45 +0000
commit1418ba24b73b8d9e4af67950fee38a02e7f1ac75 (patch)
treefeeb7add6cc5cd172579cb1326bfe3fcd6f4830e /src/rng/auto_rng/auto_rng.h
parent87cb43641ca7000b6d97dcb4d8a5e716a07fcf76 (diff)
There are some nasty API problems that are caused by having to pass a
PRNG everywhere. The removal of the global PRNG was generated by a desire to remove the global library state entirely. However the real point of this was to remove the use of globally visible _mutable_ state; of the mutable state, the PRNG is probably the least important, and the most useful to share. And it seems unlikely that thread contention would be a major issue in the PRNG. Add back a global PRNG to Library_State. Use lazy initialization, so apps that don't ever use a PRNG don't need a seeding step. Then have AutoSeeded_RNG call that global PRNG. Offer once again RandomNumberGenerator& Library_State::global_rng(); which returns a reference to the global PRNG. This RNG object serializes access to itself with a mutex. Remove the hack known as Blinding::choose_nonce, replace with using the global PRNG to choose a blinding nonce
Diffstat (limited to 'src/rng/auto_rng/auto_rng.h')
-rw-r--r--src/rng/auto_rng/auto_rng.h17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/rng/auto_rng/auto_rng.h b/src/rng/auto_rng/auto_rng.h
index a15b11b13..9a93fee8f 100644
--- a/src/rng/auto_rng/auto_rng.h
+++ b/src/rng/auto_rng/auto_rng.h
@@ -9,31 +9,32 @@
#define BOTAN_AUTO_SEEDING_RNG_H__
#include <botan/rng.h>
+#include <botan/libstate.h>
#include <string>
namespace Botan {
-/**
-* RNG that attempts to seed itself
-*/
class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator
{
public:
void randomize(byte out[], u32bit len)
{ rng->randomize(out, len); }
- bool is_seeded() const
- { return rng->is_seeded(); }
+
+ bool is_seeded() const { return rng->is_seeded(); }
+
void clear() { rng->clear(); }
- std::string name() const
- { return "AutoSeeded(" + rng->name() + ")"; }
+
+ std::string name() const { return rng->name(); }
void reseed(u32bit poll_bits = 256) { rng->reseed(poll_bits); }
+
void add_entropy_source(EntropySource* es)
{ rng->add_entropy_source(es); }
+
void add_entropy(const byte in[], u32bit len)
{ rng->add_entropy(in, len); }
- AutoSeeded_RNG(u32bit poll_bits = 256);
+ AutoSeeded_RNG() { rng = &global_state().global_rng(); }
~AutoSeeded_RNG() { delete rng; }
private:
RandomNumberGenerator* rng;