crypto: make clear generate_random_bytes is not thread safe

And add a thread safe version to encourage proper use
This commit is contained in:
moneromooo-monero 2016-05-14 22:08:10 +01:00
parent 8b0d22a2aa
commit d539be3359
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
4 changed files with 11 additions and 4 deletions

View file

@ -83,7 +83,7 @@ namespace crypto {
/* generate a random 32-byte (256-bit) integer and copy it to res */ /* generate a random 32-byte (256-bit) integer and copy it to res */
static inline void random_scalar(ec_scalar &res) { static inline void random_scalar(ec_scalar &res) {
unsigned char tmp[64]; unsigned char tmp[64];
generate_random_bytes(64, tmp); generate_random_bytes_not_thread_safe(64, tmp);
sc_reduce(tmp); sc_reduce(tmp);
memcpy(&res, tmp, 32); memcpy(&res, tmp, 32);
} }

View file

@ -117,13 +117,20 @@ namespace crypto {
const public_key *const *, std::size_t, const signature *); const public_key *const *, std::size_t, const signature *);
}; };
/* Generate N random bytes
*/
inline void rand(size_t N, uint8_t *bytes) {
boost::lock_guard<boost::mutex> lock(random_lock);
generate_random_bytes_not_thread_safe(N, bytes);
}
/* Generate a value filled with random bytes. /* Generate a value filled with random bytes.
*/ */
template<typename T> template<typename T>
typename std::enable_if<std::is_pod<T>::value, T>::type rand() { typename std::enable_if<std::is_pod<T>::value, T>::type rand() {
typename std::remove_cv<T>::type res; typename std::remove_cv<T>::type res;
boost::lock_guard<boost::mutex> lock(random_lock); boost::lock_guard<boost::mutex> lock(random_lock);
generate_random_bytes(sizeof(T), &res); generate_random_bytes_not_thread_safe(sizeof(T), &res);
return res; return res;
} }

View file

@ -113,7 +113,7 @@ INITIALIZER(init_random) {
#endif #endif
} }
void generate_random_bytes(size_t n, void *result) { void generate_random_bytes_not_thread_safe(size_t n, void *result) {
#if !defined(NDEBUG) #if !defined(NDEBUG)
assert(curstate == 1); assert(curstate == 1);
curstate = 2; curstate = 2;

View file

@ -32,4 +32,4 @@
#include <stddef.h> #include <stddef.h>
void generate_random_bytes(size_t n, void *result); void generate_random_bytes_not_thread_safe(size_t n, void *result);