diff --git a/src/common/settings.h b/src/common/settings.h index dd3cd14a02..1f6f47d9b2 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -771,6 +771,7 @@ struct Values { Setting reporting_services{ linkage, false, "reporting_services", Category::Debugging, Specialization::Default, false}; Setting quest_flag{linkage, false, "quest_flag", Category::Debugging}; + Setting use_dev_keys{linkage, false, "use_dev_keys", Category::Debugging}; Setting disable_macro_jit{linkage, false, "disable_macro_jit", Category::DebuggingGraphics}; Setting disable_macro_hle{linkage, false, "disable_macro_hle", diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp index 9a1b9d7a50..fc0ee064cc 100644 --- a/src/core/crypto/key_manager.cpp +++ b/src/core/crypto/key_manager.cpp @@ -21,6 +21,7 @@ #include "common/fs/path_util.h" #include "common/hex_util.h" #include "common/logging/log.h" +#include "common/settings.h" #include "common/string_util.h" #include "core/crypto/aes_util.h" #include "core/crypto/key_manager.h" @@ -642,8 +643,15 @@ void KeyManager::ReloadKeys() { const auto keys_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::KeysDir); if (!Common::FS::CreateDir(keys_dir)) LOG_ERROR(Core, "Failed to create the keys directory."); - LoadFromFile(keys_dir / "prod.keys_autogenerated", false); - LoadFromFile(keys_dir / "prod.keys", false); + if (Settings::values.use_dev_keys.GetValue()) { + dev_mode = true; + LoadFromFile(keys_dir / "dev.keys_autogenerated", false); + LoadFromFile(keys_dir / "dev.keys", false); + } else { + dev_mode = false; + LoadFromFile(keys_dir / "prod.keys_autogenerated", false); + LoadFromFile(keys_dir / "prod.keys", false); + } LoadFromFile(keys_dir / "title.keys_autogenerated", true); LoadFromFile(keys_dir / "title.keys", true); LoadFromFile(keys_dir / "console.keys_autogenerated", false); @@ -838,7 +846,7 @@ void KeyManager::WriteKeyToFile(KeyCategory category, std::string_view keyname, std::string filename = "title.keys_autogenerated"; if (category == KeyCategory::Standard) { - filename = "prod.keys_autogenerated"; + filename = dev_mode ? "dev.keys_autogenerated" : "prod.keys_autogenerated"; } else if (category == KeyCategory::Console) { filename = "console.keys_autogenerated"; } @@ -936,6 +944,8 @@ bool KeyManager::KeyFileExists(bool title) { const auto keys_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::KeysDir); if (title) return Common::FS::Exists(keys_dir / "title.keys"); + if (Settings::values.use_dev_keys.GetValue()) + return Common::FS::Exists(keys_dir / "dev.keys"); return Common::FS::Exists(keys_dir / "prod.keys"); } diff --git a/src/core/crypto/key_manager.h b/src/core/crypto/key_manager.h index 4d51b42677..7ef8375690 100644 --- a/src/core/crypto/key_manager.h +++ b/src/core/crypto/key_manager.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -314,6 +314,7 @@ private: std::array eticket_extended_kek{}; RSAKeyPair<2048> eticket_rsa_keypair{}; + bool dev_mode; void LoadFromFile(const std::filesystem::path& file_path, bool is_title_keys); template diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index bc835d35a2..e0bdbaeaa1 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -12,6 +12,7 @@ #include "common/logging/filter.h" #include "common/settings.h" #include "core/core.h" +#include "core/crypto/key_manager.h" #include "ui_configure_debug.h" #include "yuzu/configuration/configure_debug.h" #include "yuzu/debugger/console.h" @@ -45,6 +46,7 @@ void ConfigureDebug::SetConfiguration() { ui->reporting_services->setChecked(Settings::values.reporting_services.GetValue()); ui->dump_audio_commands->setChecked(Settings::values.dump_audio_commands.GetValue()); ui->quest_flag->setChecked(Settings::values.quest_flag.GetValue()); + ui->use_dev_keys->setChecked(Settings::values.use_dev_keys.GetValue()); ui->use_debug_asserts->setChecked(Settings::values.use_debug_asserts.GetValue()); ui->use_auto_stub->setChecked(Settings::values.use_auto_stub.GetValue()); ui->enable_all_controllers->setChecked(Settings::values.enable_all_controllers.GetValue()); @@ -105,6 +107,7 @@ void ConfigureDebug::ApplyConfiguration() { Settings::values.reporting_services = ui->reporting_services->isChecked(); Settings::values.dump_audio_commands = ui->dump_audio_commands->isChecked(); Settings::values.quest_flag = ui->quest_flag->isChecked(); + Settings::values.use_dev_keys = ui->use_dev_keys->isChecked(); Settings::values.use_debug_asserts = ui->use_debug_asserts->isChecked(); Settings::values.use_auto_stub = ui->use_auto_stub->isChecked(); Settings::values.enable_all_controllers = ui->enable_all_controllers->isChecked(); @@ -126,6 +129,7 @@ void ConfigureDebug::ApplyConfiguration() { Common::Log::Filter filter; filter.ParseFilterString(Settings::values.log_filter.GetValue()); Common::Log::SetGlobalFilter(filter); + Core::Crypto::KeyManager::Instance().ReloadKeys(); } void ConfigureDebug::changeEvent(QEvent* event) { diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui index 1b1423b62c..f76f3b012d 100644 --- a/src/yuzu/configuration/configure_debug.ui +++ b/src/yuzu/configuration/configure_debug.ui @@ -435,6 +435,13 @@ + + + + Use dev.keys + + + diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index e19f2def95..f84bb4782e 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -139,6 +139,8 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include "core/perf_stats.h" +#include "core/crypto/key_manager.h" + // Input // #include "hid_core/hid_core.h" #include "hid_core/frontend/emulated_controller.h" @@ -565,6 +567,9 @@ MainWindow::MainWindow(bool has_broken_vulkan) // Check for orphaned profiles and reset profile data if necessary QtCommon::Content::FixProfiles(); + if (Settings::values.use_dev_keys.GetValue()) { + Core::Crypto::KeyManager::Instance().ReloadKeys(); + } game_list->LoadCompatibilityList(); game_list->PopulateAsync(UISettings::values.game_dirs);