Make the fuzzer PRNG thread-safe.
We run some unit tests with multiple threads now. While that makes it no
longer deterministic, we should at least be thread-safe.
Change-Id: I5d75f2ff1ce76d0b7914cd6ea61bcf640aa085ab
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/41184
Commit-Queue: Steven Valdez <svaldez@google.com>
Reviewed-by: Steven Valdez <svaldez@google.com>
diff --git a/crypto/rand_extra/deterministic.c b/crypto/rand_extra/deterministic.c
index 17fa71e..38cfd11 100644
--- a/crypto/rand_extra/deterministic.c
+++ b/crypto/rand_extra/deterministic.c
@@ -30,19 +30,23 @@
// multi-threaded program, replace this with a thread-local. (A mutex would not
// be deterministic.)
static uint64_t g_num_calls = 0;
+static struct CRYPTO_STATIC_MUTEX g_num_calls_lock = CRYPTO_STATIC_MUTEX_INIT;
void RAND_reset_for_fuzzing(void) { g_num_calls = 0; }
void CRYPTO_sysrand(uint8_t *out, size_t requested) {
static const uint8_t kZeroKey[32];
+ CRYPTO_STATIC_MUTEX_lock_write(&g_num_calls_lock);
+ uint64_t num_calls = g_num_calls++;
+ CRYPTO_STATIC_MUTEX_unlock_write(&g_num_calls_lock);
+
uint8_t nonce[12];
OPENSSL_memset(nonce, 0, sizeof(nonce));
- OPENSSL_memcpy(nonce, &g_num_calls, sizeof(g_num_calls));
+ OPENSSL_memcpy(nonce, &num_calls, sizeof(num_calls));
OPENSSL_memset(out, 0, requested);
CRYPTO_chacha_20(out, out, requested, kZeroKey, nonce, 0);
- g_num_calls++;
}
#endif // BORINGSSL_UNSAFE_DETERMINISTIC_MODE