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"
60 while (!dest.empty()) {
61 uint64_t random = Regenerate();
62 size_t copy_size = std::min(dest.size_bytes(),
sizeof(state_));
63 std::memcpy(dest.data(), &random, copy_size);
64 dest = dest.subspan(copy_size);
76 }
else if (num_bits > 32) {
81 uint64_t untouched_state = state_ >> (kNumStateBits - num_bits);
82 state_ = untouched_state | (state_ << num_bits);
85 static_cast<uint32_t
>((
static_cast<uint64_t
>(1) << num_bits) - 1);
86 state_ ^= (data & mask);
91 uint64_t Regenerate() {
97 state_ ^= state_ >> 12;
98 state_ ^= state_ << 25;
99 state_ ^= state_ >> 27;
100 return state_ * kMultConst;
103 static constexpr uint8_t kNumStateBits =
sizeof(state_) * 8;
108 static constexpr uint64_t kMultConst = 0x2545F4914F6CDD1D;
Definition: xor_shift.h:51
void InjectEntropyBits(uint32_t data, uint_fast8_t num_bits) final
Definition: xor_shift.h:73
void Get(ByteSpan dest) final
Definition: xor_shift.h:59