diff options
| author | bunnei <bunneidev@gmail.com> | 2018-11-14 11:52:27 -0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-11-14 11:52:27 -0800 | 
| commit | e1ea8cc7214be591067959a3697ed53e95007ac2 (patch) | |
| tree | 8f4fc978a5799fc729522377fd7a85ccf51b91c2 /src/core | |
| parent | 3bd503d59c971035ebfdb1077206aeb0a4e26fe1 (diff) | |
| parent | ab552e4a252b66ca02c04724a1773edbefec6837 (diff) | |
Merge pull request #1679 from DarkLordZach/deterministic-rng-2
svc: Use proper random entropy generation algorithm
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.h | 11 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 11 | ||||
| -rw-r--r-- | src/core/settings.h | 2 | 
4 files changed, 28 insertions, 2 deletions
| diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index e78e3a950..f06b6bb55 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -15,6 +15,7 @@  #include "core/hle/kernel/thread.h"  #include "core/hle/kernel/vm_manager.h"  #include "core/memory.h" +#include "core/settings.h"  namespace Kernel { @@ -33,6 +34,11 @@ SharedPtr<Process> Process::Create(KernelCore& kernel, std::string&& name) {      process->process_id = kernel.CreateNewProcessID();      process->svc_access_mask.set(); +    std::mt19937 rng(Settings::values.rng_seed.value_or(0)); +    std::uniform_int_distribution<u64> distribution; +    std::generate(process->random_entropy.begin(), process->random_entropy.end(), +                  [&] { return distribution(rng); }); +      kernel.AppendNewProcess(process);      return process;  } diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h index f79f6d7a5..cf48787ce 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h @@ -8,6 +8,7 @@  #include <bitset>  #include <cstddef>  #include <memory> +#include <random>  #include <string>  #include <vector>  #include <boost/container/static_vector.hpp> @@ -119,6 +120,8 @@ struct CodeSet final {  class Process final : public Object {  public: +    static constexpr std::size_t RANDOM_ENTROPY_SIZE = 4; +      static SharedPtr<Process> Create(KernelCore& kernel, std::string&& name);      std::string GetTypeName() const override { @@ -212,6 +215,11 @@ public:          total_process_running_time_ticks += ticks;      } +    /// Gets 8 bytes of random data for svcGetInfo RandomEntropy +    u64 GetRandomEntropy(std::size_t index) const { +        return random_entropy.at(index); +    } +      /**       * Loads process-specifics configuration info with metadata provided       * by an executable. @@ -310,6 +318,9 @@ private:      /// Per-process handle table for storing created object handles in.      HandleTable handle_table; +    /// Random values for svcGetInfo RandomEntropy +    std::array<u64, RANDOM_ENTROPY_SIZE> random_entropy; +      std::string name;  }; diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 0bfe1e3be..b0b6508d9 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -559,7 +559,16 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)          *result = 0;          break;      case GetInfoType::RandomEntropy: -        *result = Settings::values.rng_seed.value_or(0); +        if (handle != 0) { +            return ERR_INVALID_HANDLE; +        } + +        if (info_sub_id >= Process::RANDOM_ENTROPY_SIZE) { +            return ERR_INVALID_COMBINATION_KERNEL; +        } + +        *result = current_process->GetRandomEntropy(info_sub_id); +        return RESULT_SUCCESS;          break;      case GetInfoType::ASLRRegionBaseAddr:          *result = vm_manager.GetASLRRegionBaseAddress(); diff --git a/src/core/settings.h b/src/core/settings.h index 83a1a7069..84dc5050b 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -115,7 +115,7 @@ struct Values {      // System      bool use_docked_mode;      bool enable_nfc; -    std::optional<u64> rng_seed; +    std::optional<u32> rng_seed;      s32 current_user;      s32 language_index; | 
