summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/yuzu/main.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index e11833c5a..48d7833b2 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -31,6 +31,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include <QDialogButtonBox>
#include <QFileDialog>
#include <QMessageBox>
+#include <QtConcurrent/QtConcurrent>
#include <QtGui>
#include <QtWidgets>
#include <fmt/format.h>
@@ -171,6 +172,57 @@ GMainWindow::GMainWindow()
.arg(Common::g_build_fullname, Common::g_scm_branch, Common::g_scm_desc));
show();
+ // Gen keys if necessary
+ Core::Crypto::KeyManager keys{};
+ if (keys.BaseDeriveNecessary()) {
+ Core::Crypto::PartitionDataManager pdm{vfs->OpenDirectory(
+ FileUtil::GetUserPath(FileUtil::UserPath::SysDataDir), FileSys::Mode::Read)};
+
+ const auto function = [this, &keys, &pdm]() {
+ keys.PopulateFromPartitionData(pdm);
+ Service::FileSystem::CreateFactories(vfs);
+ keys.DeriveETicket(pdm);
+ };
+
+ std::vector<std::string> errors;
+
+ if (!pdm.HasFuses())
+ errors.push_back("Missing fuses - Cannot derive SBK");
+ if (!pdm.HasBoot0())
+ errors.push_back("Missing BOOT0 - Cannot derive master keys");
+ if (!pdm.HasPackage2())
+ errors.push_back("Missing BCPKG2-1-Normal-Main - Cannot derive general keys");
+ if (!pdm.HasProdInfo())
+ errors.push_back("Missing PRODINFO - Cannot derive title keys");
+
+ if (!errors.empty()) {
+ std::string error_str;
+ for (const auto& error : errors)
+ error_str += " - " + error + "\n";
+
+ QMessageBox::warning(
+ this, tr("Warning Missing Derivation Components"),
+ tr("The following are missing from your configuration that may hinder key "
+ "derivation. It will be attempted but may not complete.\n\n") +
+ QString::fromStdString(error_str));
+ }
+
+ QProgressDialog prog;
+ prog.setRange(0, 0);
+ prog.setLabelText(tr("Deriving keys...\nThis may take up to a minute depending \non your "
+ "system's performance."));
+ prog.setWindowTitle(tr("Deriving Keys"));
+
+ prog.show();
+
+ auto future = QtConcurrent::run(function);
+ while (!future.isFinished()) {
+ QCoreApplication::processEvents();
+ }
+
+ prog.close();
+ }
+
// Necessary to load titles from nand in gamelist.
Service::FileSystem::CreateFactories(vfs);
game_list->LoadCompatibilityList();