aboutsummaryrefslogtreecommitdiff
path: root/src/crypto
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2019-06-06 09:50:56 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2019-08-22 11:12:57 +0000
commit1dc3b1a516332f12a4bd8fd8dd80695a003d1d98 (patch)
tree5a4eb58fefaebc19a2b22a80da46fbf9cb71b87b /src/crypto
parentMerge pull request #5635 (diff)
downloadmonero-1dc3b1a516332f12a4bd8fd8dd80695a003d1d98.tar.xz
wallet: add --extra-entropy command line flag
It lets the user add custom entropy to the PRNG. It does this by hashing the new data and xoring the resulting hash with the PRNG state.
Diffstat (limited to 'src/crypto')
-rw-r--r--src/crypto/crypto.cpp15
-rw-r--r--src/crypto/crypto.h1
-rw-r--r--src/crypto/random.c15
-rw-r--r--src/crypto/random.h1
4 files changed, 30 insertions, 2 deletions
diff --git a/src/crypto/crypto.cpp b/src/crypto/crypto.cpp
index 3f06c4f3f..6d3c4ed35 100644
--- a/src/crypto/crypto.cpp
+++ b/src/crypto/crypto.cpp
@@ -88,13 +88,24 @@ namespace crypto {
return &reinterpret_cast<const unsigned char &>(scalar);
}
- void generate_random_bytes_thread_safe(size_t N, uint8_t *bytes)
+ boost::mutex &get_random_lock()
{
static boost::mutex random_lock;
- boost::lock_guard<boost::mutex> lock(random_lock);
+ return random_lock;
+ }
+
+ void generate_random_bytes_thread_safe(size_t N, uint8_t *bytes)
+ {
+ boost::lock_guard<boost::mutex> lock(get_random_lock());
generate_random_bytes_not_thread_safe(N, bytes);
}
+ void add_extra_entropy_thread_safe(const void *ptr, size_t bytes)
+ {
+ boost::lock_guard<boost::mutex> lock(get_random_lock());
+ add_extra_entropy_not_thread_safe(ptr, bytes);
+ }
+
static inline bool less32(const unsigned char *k0, const unsigned char *k1)
{
for (int n = 31; n >= 0; --n)
diff --git a/src/crypto/crypto.h b/src/crypto/crypto.h
index bac456f60..8ce321f71 100644
--- a/src/crypto/crypto.h
+++ b/src/crypto/crypto.h
@@ -147,6 +147,7 @@ namespace crypto {
};
void generate_random_bytes_thread_safe(size_t N, uint8_t *bytes);
+ void add_extra_entropy_thread_safe(const void *ptr, size_t bytes);
/* Generate N random bytes
*/
diff --git a/src/crypto/random.c b/src/crypto/random.c
index 74b202661..766b5f558 100644
--- a/src/crypto/random.c
+++ b/src/crypto/random.c
@@ -146,3 +146,18 @@ void generate_random_bytes_not_thread_safe(size_t n, void *result) {
}
}
}
+
+void add_extra_entropy_not_thread_safe(const void *ptr, size_t bytes)
+{
+ size_t i;
+
+ while (bytes > 0)
+ {
+ hash_permutation(&state);
+ const size_t round_bytes = bytes > HASH_DATA_AREA ? HASH_DATA_AREA : bytes;
+ for (i = 0; i < round_bytes; ++i)
+ state.b[i] ^= ((const uint8_t*)ptr)[i];
+ bytes -= round_bytes;
+ ptr = cpadd(ptr, round_bytes);
+ }
+}
diff --git a/src/crypto/random.h b/src/crypto/random.h
index ccb9f4853..21a66d776 100644
--- a/src/crypto/random.h
+++ b/src/crypto/random.h
@@ -33,3 +33,4 @@
#include <stddef.h>
void generate_random_bytes_not_thread_safe(size_t n, void *result);
+void add_extra_entropy_not_thread_safe(const void *ptr, size_t bytes);