20#include "pw_assert/check.h"
21#include "pw_bytes/span.h"
22#include "pw_random/random.h"
23#include "pw_span/span.h"
24#include "pw_status/status_with_size.h"
57 void Get(ByteSpan dest)
final {
58 while (!dest.empty()) {
59 uint64_t random = Regenerate();
60 size_t copy_size = std::min(dest.size_bytes(),
sizeof(state_));
61 std::memcpy(dest.data(), &random, copy_size);
62 dest = dest.subspan(copy_size);
74 }
else if (num_bits > 32) {
79 uint64_t untouched_state = state_ >> (kNumStateBits - num_bits);
80 state_ = untouched_state | (state_ << num_bits);
83 static_cast<uint32_t
>((
static_cast<uint64_t
>(1) << num_bits) - 1);
84 state_ ^= (data & mask);
89 uint64_t Regenerate() {
95 state_ ^= state_ >> 12;
96 state_ ^= state_ << 25;
97 state_ ^= state_ >> 27;
98 return state_ * kMultConst;
101 static constexpr uint8_t kNumStateBits =
sizeof(state_) * 8;
106 static constexpr uint64_t kMultConst = 0x2545F4914F6CDD1D;
Definition: xor_shift.h:49
void InjectEntropyBits(uint32_t data, uint_fast8_t num_bits) final
Definition: xor_shift.h:71
void Get(ByteSpan dest) final
Definition: xor_shift.h:57