35 lines
1.1 KiB
C
35 lines
1.1 KiB
C
![]() |
#pragma once
|
||
|
#ifndef MESSMER_CPPUTILS_DATA_THREADSAFEPSEUDORANDOMPOOL_H
|
||
|
#define MESSMER_CPPUTILS_DATA_THREADSAFEPSEUDORANDOMPOOL_H
|
||
|
|
||
|
#include "../macros.h"
|
||
|
|
||
|
namespace cpputils {
|
||
|
|
||
|
//TODO Store a static CryptoPP::AutoSeededRandomPool (or multiple ones) and make constructor of
|
||
|
// ThreadsafeRandomPool() be lightweight (i.e. not do seeding), so it can be called on each callsite.
|
||
|
// Alternatively, use a singleton factory.
|
||
|
|
||
|
//TODO Test
|
||
|
class ThreadsafePseudoRandomPool {
|
||
|
public:
|
||
|
ThreadsafePseudoRandomPool() { }
|
||
|
|
||
|
void GenerateBlock(byte *data, size_t size) {
|
||
|
// TODO Provide multiple randomPools for parallelity instead of locking the only available one
|
||
|
std::unique_lock <std::mutex> lock(_mutex);
|
||
|
_pool.GenerateBlock(data, size);
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
//TODO Make seeding use blocking=true (aka /dev/random instead of /dev/urandom) or offer a configuration option?
|
||
|
CryptoPP::AutoSeededRandomPool _pool;
|
||
|
std::mutex _mutex;
|
||
|
|
||
|
DISALLOW_COPY_AND_ASSIGN(ThreadsafePseudoRandomPool);
|
||
|
};
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif
|