qt: Add rederive keyset menu option
This commit is contained in:
parent
3edafc6802
commit
8f958b89e7
|
@ -173,55 +173,7 @@ GMainWindow::GMainWindow()
|
||||||
show();
|
show();
|
||||||
|
|
||||||
// Gen keys if necessary
|
// Gen keys if necessary
|
||||||
Core::Crypto::KeyManager keys{};
|
OnReinitializeKeys(false);
|
||||||
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.
|
// Necessary to load titles from nand in gamelist.
|
||||||
Service::FileSystem::CreateFactories(vfs);
|
Service::FileSystem::CreateFactories(vfs);
|
||||||
|
@ -495,6 +447,8 @@ void GMainWindow::ConnectMenuEvents() {
|
||||||
connect(ui.action_Fullscreen, &QAction::triggered, this, &GMainWindow::ToggleFullscreen);
|
connect(ui.action_Fullscreen, &QAction::triggered, this, &GMainWindow::ToggleFullscreen);
|
||||||
|
|
||||||
// Help
|
// Help
|
||||||
|
connect(ui.action_Rederive, &QAction::triggered, this,
|
||||||
|
std::bind(&GMainWindow::OnReinitializeKeys, this, true));
|
||||||
connect(ui.action_About, &QAction::triggered, this, &GMainWindow::OnAbout);
|
connect(ui.action_About, &QAction::triggered, this, &GMainWindow::OnAbout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1427,6 +1381,85 @@ void GMainWindow::OnCoreError(Core::System::ResultStatus result, std::string det
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GMainWindow::OnReinitializeKeys(bool callouts) {
|
||||||
|
if (callouts) {
|
||||||
|
const auto res = QMessageBox::information(
|
||||||
|
this, tr("Confirm Key Rederivation"),
|
||||||
|
tr("You are about to force rederive all of your keys. \nIf you do not know what this "
|
||||||
|
"means or what you are doing, \nthis is a potentially destructive action. \nPlease "
|
||||||
|
"make "
|
||||||
|
"sure this is what you want \nand optionally make backups.\n\nThis will delete your "
|
||||||
|
"autogenerated key files and re-run the key derivation module."),
|
||||||
|
QMessageBox::StandardButtons{QMessageBox::Ok, QMessageBox::Cancel});
|
||||||
|
|
||||||
|
if (res == QMessageBox::Cancel)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FileUtil::Delete(FileUtil::GetUserPath(FileUtil::UserPath::KeysDir) +
|
||||||
|
"prod.keys_autogenerated");
|
||||||
|
FileUtil::Delete(FileUtil::GetUserPath(FileUtil::UserPath::KeysDir) +
|
||||||
|
"console.keys_autogenerated");
|
||||||
|
FileUtil::Delete(FileUtil::GetUserPath(FileUtil::UserPath::KeysDir) +
|
||||||
|
"title.keys_autogenerated");
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
Service::FileSystem::CreateFactories(vfs);
|
||||||
|
|
||||||
|
if (callouts) {
|
||||||
|
game_list->PopulateAsync(UISettings::values.gamedir, UISettings::values.gamedir_deepscan);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool GMainWindow::ConfirmClose() {
|
bool GMainWindow::ConfirmClose() {
|
||||||
if (emu_thread == nullptr || !UISettings::values.confirm_before_closing)
|
if (emu_thread == nullptr || !UISettings::values.confirm_before_closing)
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -167,6 +167,7 @@ private slots:
|
||||||
void HideFullscreen();
|
void HideFullscreen();
|
||||||
void ToggleWindowMode();
|
void ToggleWindowMode();
|
||||||
void OnCoreError(Core::System::ResultStatus, std::string);
|
void OnCoreError(Core::System::ResultStatus, std::string);
|
||||||
|
void OnReinitializeKeys(bool callouts);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void UpdateStatusBar();
|
void UpdateStatusBar();
|
||||||
|
|
|
@ -103,6 +103,7 @@
|
||||||
</property>
|
</property>
|
||||||
<addaction name="action_Report_Compatibility"/>
|
<addaction name="action_Report_Compatibility"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
|
<addaction name="action_Rederive"/>
|
||||||
<addaction name="action_About"/>
|
<addaction name="action_About"/>
|
||||||
</widget>
|
</widget>
|
||||||
<addaction name="menu_File"/>
|
<addaction name="menu_File"/>
|
||||||
|
@ -159,6 +160,11 @@
|
||||||
<string>&Stop</string>
|
<string>&Stop</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="action_Rederive">
|
||||||
|
<property name="text">
|
||||||
|
<string>Reinitialize keys...</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
<action name="action_About">
|
<action name="action_About">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>About yuzu</string>
|
<string>About yuzu</string>
|
||||||
|
|
Reference in New Issue