summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-11-14 11:52:27 -0800
committerGravatar GitHub2018-11-14 11:52:27 -0800
commite1ea8cc7214be591067959a3697ed53e95007ac2 (patch)
tree8f4fc978a5799fc729522377fd7a85ccf51b91c2 /src
parentMerge pull request #1662 from FreddyFunk/CopySurface-Optimization (diff)
parentsvc: Use proper random entropy generation algorithm (diff)
downloadyuzu-e1ea8cc7214be591067959a3697ed53e95007ac2.tar.gz
yuzu-e1ea8cc7214be591067959a3697ed53e95007ac2.tar.xz
yuzu-e1ea8cc7214be591067959a3697ed53e95007ac2.zip
Merge pull request #1679 from DarkLordZach/deterministic-rng-2
svc: Use proper random entropy generation algorithm
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/process.cpp6
-rw-r--r--src/core/hle/kernel/process.h11
-rw-r--r--src/core/hle/kernel/svc.cpp11
-rw-r--r--src/core/settings.h2
-rw-r--r--src/yuzu/configuration/configure_system.cpp7
-rw-r--r--src/yuzu/configuration/configure_system.ui4
6 files changed, 33 insertions, 8 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 @@
15#include "core/hle/kernel/thread.h" 15#include "core/hle/kernel/thread.h"
16#include "core/hle/kernel/vm_manager.h" 16#include "core/hle/kernel/vm_manager.h"
17#include "core/memory.h" 17#include "core/memory.h"
18#include "core/settings.h"
18 19
19namespace Kernel { 20namespace Kernel {
20 21
@@ -33,6 +34,11 @@ SharedPtr<Process> Process::Create(KernelCore& kernel, std::string&& name) {
33 process->process_id = kernel.CreateNewProcessID(); 34 process->process_id = kernel.CreateNewProcessID();
34 process->svc_access_mask.set(); 35 process->svc_access_mask.set();
35 36
37 std::mt19937 rng(Settings::values.rng_seed.value_or(0));
38 std::uniform_int_distribution<u64> distribution;
39 std::generate(process->random_entropy.begin(), process->random_entropy.end(),
40 [&] { return distribution(rng); });
41
36 kernel.AppendNewProcess(process); 42 kernel.AppendNewProcess(process);
37 return process; 43 return process;
38} 44}
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 @@
8#include <bitset> 8#include <bitset>
9#include <cstddef> 9#include <cstddef>
10#include <memory> 10#include <memory>
11#include <random>
11#include <string> 12#include <string>
12#include <vector> 13#include <vector>
13#include <boost/container/static_vector.hpp> 14#include <boost/container/static_vector.hpp>
@@ -119,6 +120,8 @@ struct CodeSet final {
119 120
120class Process final : public Object { 121class Process final : public Object {
121public: 122public:
123 static constexpr std::size_t RANDOM_ENTROPY_SIZE = 4;
124
122 static SharedPtr<Process> Create(KernelCore& kernel, std::string&& name); 125 static SharedPtr<Process> Create(KernelCore& kernel, std::string&& name);
123 126
124 std::string GetTypeName() const override { 127 std::string GetTypeName() const override {
@@ -212,6 +215,11 @@ public:
212 total_process_running_time_ticks += ticks; 215 total_process_running_time_ticks += ticks;
213 } 216 }
214 217
218 /// Gets 8 bytes of random data for svcGetInfo RandomEntropy
219 u64 GetRandomEntropy(std::size_t index) const {
220 return random_entropy.at(index);
221 }
222
215 /** 223 /**
216 * Loads process-specifics configuration info with metadata provided 224 * Loads process-specifics configuration info with metadata provided
217 * by an executable. 225 * by an executable.
@@ -310,6 +318,9 @@ private:
310 /// Per-process handle table for storing created object handles in. 318 /// Per-process handle table for storing created object handles in.
311 HandleTable handle_table; 319 HandleTable handle_table;
312 320
321 /// Random values for svcGetInfo RandomEntropy
322 std::array<u64, RANDOM_ENTROPY_SIZE> random_entropy;
323
313 std::string name; 324 std::string name;
314}; 325};
315 326
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)
559 *result = 0; 559 *result = 0;
560 break; 560 break;
561 case GetInfoType::RandomEntropy: 561 case GetInfoType::RandomEntropy:
562 *result = Settings::values.rng_seed.value_or(0); 562 if (handle != 0) {
563 return ERR_INVALID_HANDLE;
564 }
565
566 if (info_sub_id >= Process::RANDOM_ENTROPY_SIZE) {
567 return ERR_INVALID_COMBINATION_KERNEL;
568 }
569
570 *result = current_process->GetRandomEntropy(info_sub_id);
571 return RESULT_SUCCESS;
563 break; 572 break;
564 case GetInfoType::ASLRRegionBaseAddr: 573 case GetInfoType::ASLRRegionBaseAddr:
565 *result = vm_manager.GetASLRRegionBaseAddress(); 574 *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 {
115 // System 115 // System
116 bool use_docked_mode; 116 bool use_docked_mode;
117 bool enable_nfc; 117 bool enable_nfc;
118 std::optional<u64> rng_seed; 118 std::optional<u32> rng_seed;
119 s32 current_user; 119 s32 current_user;
120 s32 language_index; 120 s32 language_index;
121 121
diff --git a/src/yuzu/configuration/configure_system.cpp b/src/yuzu/configuration/configure_system.cpp
index 67f07ecb1..ab5d46492 100644
--- a/src/yuzu/configuration/configure_system.cpp
+++ b/src/yuzu/configuration/configure_system.cpp
@@ -140,7 +140,7 @@ ConfigureSystem::ConfigureSystem(QWidget* parent)
140 connect(ui->rng_seed_checkbox, &QCheckBox::stateChanged, this, [this](bool checked) { 140 connect(ui->rng_seed_checkbox, &QCheckBox::stateChanged, this, [this](bool checked) {
141 ui->rng_seed_edit->setEnabled(checked); 141 ui->rng_seed_edit->setEnabled(checked);
142 if (!checked) 142 if (!checked)
143 ui->rng_seed_edit->setText(QStringLiteral("0000000000000000")); 143 ui->rng_seed_edit->setText(QStringLiteral("00000000"));
144 }); 144 });
145 145
146 scene = new QGraphicsScene; 146 scene = new QGraphicsScene;
@@ -165,9 +165,8 @@ void ConfigureSystem::setConfiguration() {
165 ui->rng_seed_checkbox->setChecked(Settings::values.rng_seed.has_value()); 165 ui->rng_seed_checkbox->setChecked(Settings::values.rng_seed.has_value());
166 ui->rng_seed_edit->setEnabled(Settings::values.rng_seed.has_value()); 166 ui->rng_seed_edit->setEnabled(Settings::values.rng_seed.has_value());
167 167
168 const auto rng_seed = QString("%1") 168 const auto rng_seed =
169 .arg(Settings::values.rng_seed.value_or(0), 16, 16, QLatin1Char{'0'}) 169 QString("%1").arg(Settings::values.rng_seed.value_or(0), 8, 16, QLatin1Char{'0'}).toUpper();
170 .toUpper();
171 ui->rng_seed_edit->setText(rng_seed); 170 ui->rng_seed_edit->setText(rng_seed);
172} 171}
173 172
diff --git a/src/yuzu/configuration/configure_system.ui b/src/yuzu/configuration/configure_system.ui
index d0fcd0163..4ee233ed7 100644
--- a/src/yuzu/configuration/configure_system.ui
+++ b/src/yuzu/configuration/configure_system.ui
@@ -269,10 +269,10 @@
269 </font> 269 </font>
270 </property> 270 </property>
271 <property name="inputMask"> 271 <property name="inputMask">
272 <string>HHHHHHHHHHHHHHHH</string> 272 <string>HHHHHHHH</string>
273 </property> 273 </property>
274 <property name="maxLength"> 274 <property name="maxLength">
275 <number>16</number> 275 <number>8</number>
276 </property> 276 </property>
277 </widget> 277 </widget>
278 </item> 278 </item>