|
|
|
@ -173,55 +173,7 @@ GMainWindow::GMainWindow() |
|
|
|
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(); |
|
|
|
} |
|
|
|
OnReinitializeKeys(false); |
|
|
|
|
|
|
|
// Necessary to load titles from nand in gamelist.
|
|
|
|
Service::FileSystem::CreateFactories(vfs); |
|
|
|
@ -495,6 +447,8 @@ void GMainWindow::ConnectMenuEvents() { |
|
|
|
connect(ui.action_Fullscreen, &QAction::triggered, this, &GMainWindow::ToggleFullscreen); |
|
|
|
|
|
|
|
// Help
|
|
|
|
connect(ui.action_Rederive, &QAction::triggered, this, |
|
|
|
std::bind(&GMainWindow::OnReinitializeKeys, this, true)); |
|
|
|
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() { |
|
|
|
if (emu_thread == nullptr || !UISettings::values.confirm_before_closing) |
|
|
|
return true; |
|
|
|
|