summaryrefslogtreecommitdiff
path: root/Source/Core/Common/Random.h
blob: 789f62d9c17c3bde16d394f6b30156bc3ca53d30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Copyright 2018 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include <cstddef>
#include <memory>
#include <type_traits>

#include "Common/CommonTypes.h"

namespace Common::Random
{
/// Cryptographically secure pseudo-random number generator, with explicit seed.
class PRNG final
{
public:
  explicit PRNG(u64 seed) : PRNG(&seed, sizeof(u64)) {}
  PRNG(void* seed, std::size_t size);
  ~PRNG();

  void Generate(void* buffer, std::size_t size);

  template <typename T>
  T GenerateValue()
  {
    static_assert(std::is_arithmetic<T>(), "T must be an arithmetic type in GenerateValue.");
    T value;
    Generate(&value, sizeof(value));
    return value;
  }

private:
  struct Impl;
  std::unique_ptr<Impl> m_impl;
};

/// Fill `buffer` with random bytes using a cryptographically secure pseudo-random number generator.
void Generate(void* buffer, std::size_t size);

/// Generates a random value of arithmetic type `T`
template <typename T>
T GenerateValue()
{
  static_assert(std::is_arithmetic<T>(), "T must be an arithmetic type in GenerateValue.");
  T value;
  Generate(&value, sizeof(value));
  return value;
}
}  // namespace Common::Random