crypto: fix initialization order issue with random mutex

This commit is contained in:
moneromooo-monero 2018-04-10 12:20:31 +01:00
parent 8361d60aef
commit 90a16b119f
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
2 changed files with 15 additions and 10 deletions

View file

@ -70,8 +70,6 @@ namespace crypto {
#include "random.h" #include "random.h"
} }
boost::mutex random_lock;
static inline unsigned char *operator &(ec_point &point) { static inline unsigned char *operator &(ec_point &point) {
return &reinterpret_cast<unsigned char &>(point); return &reinterpret_cast<unsigned char &>(point);
} }
@ -88,6 +86,13 @@ namespace crypto {
return &reinterpret_cast<const unsigned char &>(scalar); return &reinterpret_cast<const unsigned char &>(scalar);
} }
void generate_random_bytes_thread_safe(size_t N, uint8_t *bytes)
{
static boost::mutex random_lock;
boost::lock_guard<boost::mutex> lock(random_lock);
generate_random_bytes_not_thread_safe(N, bytes);
}
/* 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_not_thread_safe(ec_scalar &res) { static inline void random_scalar_not_thread_safe(ec_scalar &res) {
unsigned char tmp[64]; unsigned char tmp[64];
@ -96,8 +101,10 @@ namespace crypto {
memcpy(&res, tmp, 32); memcpy(&res, tmp, 32);
} }
static inline void random_scalar(ec_scalar &res) { static inline void random_scalar(ec_scalar &res) {
boost::lock_guard<boost::mutex> lock(random_lock); unsigned char tmp[64];
random_scalar_not_thread_safe(res); generate_random_bytes_thread_safe(64, tmp);
sc_reduce(tmp);
memcpy(&res, tmp, 32);
} }
void hash_to_scalar(const void *data, size_t length, ec_scalar &res) { void hash_to_scalar(const void *data, size_t length, ec_scalar &res) {

View file

@ -53,8 +53,6 @@ namespace crypto {
#include "random.h" #include "random.h"
} }
extern boost::mutex random_lock;
#pragma pack(push, 1) #pragma pack(push, 1)
POD_CLASS ec_point { POD_CLASS ec_point {
char data[32]; char data[32];
@ -149,11 +147,12 @@ namespace crypto {
const public_key *const *, std::size_t, const signature *); const public_key *const *, std::size_t, const signature *);
}; };
void generate_random_bytes_thread_safe(size_t N, uint8_t *bytes);
/* Generate N random bytes /* Generate N random bytes
*/ */
inline void rand(size_t N, uint8_t *bytes) { inline void rand(size_t N, uint8_t *bytes) {
boost::lock_guard<boost::mutex> lock(random_lock); generate_random_bytes_thread_safe(N, bytes);
generate_random_bytes_not_thread_safe(N, bytes);
} }
/* Generate a value filled with random bytes. /* Generate a value filled with random bytes.
@ -161,8 +160,7 @@ namespace crypto {
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); generate_random_bytes_thread_safe(sizeof(T), (uint8_t*)&res);
generate_random_bytes_not_thread_safe(sizeof(T), &res);
return res; return res;
} }