Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <array>
#include <cstring>
#include <functional>
#include <memory>
#include <random>
#if defined(__APPLE__)
#include <TargetConditionals.h>
Expand Down Expand Up @@ -44,8 +45,9 @@ constexpr size_t RANDOM_BUFFER_SIZE = 1UL << 20;

#endif
struct RandomBufferWrapper {
// Buffer with randomness sampled from a CSPRNG
uint8_t buffer[RANDOM_BUFFER_SIZE];
// Buffer with randomness sampled from a CSPRNG (heap-allocated on first use to avoid
// bloating TLS — a 1 MiB inline array adds ~0.6 ms per thread creation)
std::unique_ptr<uint8_t[]> buffer;
// Offset into the unused part of the buffer
ssize_t offset = -1;
};
Expand All @@ -67,8 +69,11 @@ template <size_t size_in_unsigned_ints> std::array<unsigned int, size_in_unsigne
// We could preserve the leftover bytes, but it's a bit messy
if (random_buffer_wrapper.offset == -1 ||
(static_cast<size_t>(random_buffer_wrapper.offset) + random_data_buffer_size) > RANDOM_BUFFER_SIZE) {
if (!random_buffer_wrapper.buffer) {
random_buffer_wrapper.buffer = std::make_unique<uint8_t[]>(RANDOM_BUFFER_SIZE);
}
size_t bytes_left = RANDOM_BUFFER_SIZE;
uint8_t* current_offset = random_buffer_wrapper.buffer;
uint8_t* current_offset = random_buffer_wrapper.buffer.get();
// Sample until we fill the buffer
while (bytes_left != 0) {
#if defined(__wasm__) || defined(__APPLE__)
Expand Down Expand Up @@ -97,7 +102,7 @@ template <size_t size_in_unsigned_ints> std::array<unsigned int, size_in_unsigne
random_buffer_wrapper.offset = 0;
}

memcpy(&random_data, random_buffer_wrapper.buffer + random_buffer_wrapper.offset, random_data_buffer_size);
memcpy(&random_data, random_buffer_wrapper.buffer.get() + random_buffer_wrapper.offset, random_data_buffer_size);
random_buffer_wrapper.offset += static_cast<ssize_t>(random_data_buffer_size);
return random_data;
}
Expand Down
Loading