frontend_common: Remove key rederivation and keep key check
This commit is contained in:
		@@ -368,4 +368,11 @@ inline GameVerificationResult VerifyGameContents(
 | 
				
			|||||||
    return GameVerificationResult::Success;
 | 
					    return GameVerificationResult::Success;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Checks if the keys required for decrypting firmware and games are available
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					inline bool AreKeysPresent() {
 | 
				
			||||||
 | 
					    return !Core::Crypto::KeyManager::Instance().BaseDeriveNecessary();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace ContentManager
 | 
					} // namespace ContentManager
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -423,7 +423,7 @@ GMainWindow::GMainWindow(std::unique_ptr<QtConfig> config_, bool has_broken_vulk
 | 
				
			|||||||
    RemoveCachedContents();
 | 
					    RemoveCachedContents();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Gen keys if necessary
 | 
					    // Gen keys if necessary
 | 
				
			||||||
    OnReinitializeKeys(ReinitializeKeyBehavior::NoWarning);
 | 
					    OnCheckFirmwareDecryption();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    game_list->LoadCompatibilityList();
 | 
					    game_list->LoadCompatibilityList();
 | 
				
			||||||
    game_list->PopulateAsync(UISettings::values.game_dirs);
 | 
					    game_list->PopulateAsync(UISettings::values.game_dirs);
 | 
				
			||||||
@@ -1574,8 +1574,6 @@ void GMainWindow::ConnectMenuEvents() {
 | 
				
			|||||||
    connect(multiplayer_state, &MultiplayerState::SaveConfig, this, &GMainWindow::OnSaveConfig);
 | 
					    connect(multiplayer_state, &MultiplayerState::SaveConfig, this, &GMainWindow::OnSaveConfig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Tools
 | 
					    // Tools
 | 
				
			||||||
    connect_menu(ui->action_Rederive, std::bind(&GMainWindow::OnReinitializeKeys, this,
 | 
					 | 
				
			||||||
                                                ReinitializeKeyBehavior::Warning));
 | 
					 | 
				
			||||||
    connect_menu(ui->action_Load_Album, &GMainWindow::OnAlbum);
 | 
					    connect_menu(ui->action_Load_Album, &GMainWindow::OnAlbum);
 | 
				
			||||||
    connect_menu(ui->action_Load_Cabinet_Nickname_Owner,
 | 
					    connect_menu(ui->action_Load_Cabinet_Nickname_Owner,
 | 
				
			||||||
                 [this]() { OnCabinet(Service::NFP::CabinetMode::StartNicknameAndOwnerSettings); });
 | 
					                 [this]() { OnCabinet(Service::NFP::CabinetMode::StartNicknameAndOwnerSettings); });
 | 
				
			||||||
@@ -4551,122 +4549,20 @@ void GMainWindow::OnMouseActivity() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {
 | 
					void GMainWindow::OnCheckFirmwareDecryption() {
 | 
				
			||||||
    if (behavior == ReinitializeKeyBehavior::Warning) {
 | 
					 | 
				
			||||||
        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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const auto keys_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::KeysDir);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Common::FS::RemoveFile(keys_dir / "prod.keys_autogenerated");
 | 
					 | 
				
			||||||
        Common::FS::RemoveFile(keys_dir / "console.keys_autogenerated");
 | 
					 | 
				
			||||||
        Common::FS::RemoveFile(keys_dir / "title.keys_autogenerated");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance();
 | 
					 | 
				
			||||||
    bool all_keys_present{true};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (keys.BaseDeriveNecessary()) {
 | 
					 | 
				
			||||||
        Core::Crypto::PartitionDataManager pdm{vfs->OpenDirectory("", FileSys::Mode::Read)};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const auto function = [this, &keys, &pdm] {
 | 
					 | 
				
			||||||
            keys.PopulateFromPartitionData(pdm);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    system->GetFileSystemController().CreateFactories(*vfs);
 | 
					    system->GetFileSystemController().CreateFactories(*vfs);
 | 
				
			||||||
            keys.DeriveETicket(pdm, system->GetContentProvider());
 | 
					    if (!ContentManager::AreKeysPresent()) {
 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        QString errors;
 | 
					 | 
				
			||||||
        if (!pdm.HasFuses()) {
 | 
					 | 
				
			||||||
            errors += tr("Missing fuses");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (!pdm.HasBoot0()) {
 | 
					 | 
				
			||||||
            errors += tr(" - Missing BOOT0");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (!pdm.HasPackage2()) {
 | 
					 | 
				
			||||||
            errors += tr(" - Missing BCPKG2-1-Normal-Main");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (!pdm.HasProdInfo()) {
 | 
					 | 
				
			||||||
            errors += tr(" - Missing PRODINFO");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (!errors.isEmpty()) {
 | 
					 | 
				
			||||||
            all_keys_present = false;
 | 
					 | 
				
			||||||
        QMessageBox::warning(
 | 
					        QMessageBox::warning(
 | 
				
			||||||
            this, tr("Derivation Components Missing"),
 | 
					            this, tr("Derivation Components Missing"),
 | 
				
			||||||
            tr("Encryption keys are missing. "
 | 
					            tr("Encryption keys are missing. "
 | 
				
			||||||
                   "<br>Please follow <a href='https://yuzu-emu.org/help/quickstart/'>the yuzu "
 | 
					 | 
				
			||||||
                   "quickstart guide</a> to get all your keys, firmware and "
 | 
					 | 
				
			||||||
                   "games.<br><br><small>(%1)</small>")
 | 
					 | 
				
			||||||
                    .arg(errors));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        QProgressDialog prog(this);
 | 
					 | 
				
			||||||
        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();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    system->GetFileSystemController().CreateFactories(*vfs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (all_keys_present && !this->CheckSystemArchiveDecryption()) {
 | 
					 | 
				
			||||||
        LOG_WARNING(Frontend, "Mii model decryption failed");
 | 
					 | 
				
			||||||
        QMessageBox::warning(
 | 
					 | 
				
			||||||
            this, tr("System Archive Decryption Failed"),
 | 
					 | 
				
			||||||
            tr("Encryption keys failed to decrypt firmware. "
 | 
					 | 
				
			||||||
               "<br>Please follow <a href='https://yuzu-emu.org/help/quickstart/'>the yuzu "
 | 
					               "<br>Please follow <a href='https://yuzu-emu.org/help/quickstart/'>the yuzu "
 | 
				
			||||||
               "quickstart guide</a> to get all your keys, firmware and "
 | 
					               "quickstart guide</a> to get all your keys, firmware and "
 | 
				
			||||||
               "games."));
 | 
					               "games."));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    SetFirmwareVersion();
 | 
					    SetFirmwareVersion();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (behavior == ReinitializeKeyBehavior::Warning) {
 | 
					 | 
				
			||||||
        game_list->PopulateAsync(UISettings::values.game_dirs);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    UpdateMenuState();
 | 
					    UpdateMenuState();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool GMainWindow::CheckSystemArchiveDecryption() {
 | 
					 | 
				
			||||||
    constexpr u64 MiiModelId = 0x0100000000000802;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    auto bis_system = system->GetFileSystemController().GetSystemNANDContents();
 | 
					 | 
				
			||||||
    if (!bis_system) {
 | 
					 | 
				
			||||||
        // Not having system BIS files is not an error.
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    auto mii_nca = bis_system->GetEntry(MiiModelId, FileSys::ContentRecordType::Data);
 | 
					 | 
				
			||||||
    if (!mii_nca) {
 | 
					 | 
				
			||||||
        // Not having the Mii model is not an error.
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Return whether we are able to decrypt the RomFS of the Mii model.
 | 
					 | 
				
			||||||
    return mii_nca->GetRomFS().get() != nullptr;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool GMainWindow::CheckFirmwarePresence() {
 | 
					bool GMainWindow::CheckFirmwarePresence() {
 | 
				
			||||||
    constexpr u64 MiiEditId = static_cast<u64>(Service::AM::Applets::AppletProgramId::MiiEdit);
 | 
					    constexpr u64 MiiEditId = static_cast<u64>(Service::AM::Applets::AppletProgramId::MiiEdit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -125,11 +125,6 @@ enum class EmulatedDirectoryTarget {
 | 
				
			|||||||
    SDMC,
 | 
					    SDMC,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum class ReinitializeKeyBehavior {
 | 
					 | 
				
			||||||
    NoWarning,
 | 
					 | 
				
			||||||
    Warning,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace VkDeviceInfo {
 | 
					namespace VkDeviceInfo {
 | 
				
			||||||
class Record;
 | 
					class Record;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -400,7 +395,7 @@ private slots:
 | 
				
			|||||||
    void OnMiiEdit();
 | 
					    void OnMiiEdit();
 | 
				
			||||||
    void OnOpenControllerMenu();
 | 
					    void OnOpenControllerMenu();
 | 
				
			||||||
    void OnCaptureScreenshot();
 | 
					    void OnCaptureScreenshot();
 | 
				
			||||||
    void OnReinitializeKeys(ReinitializeKeyBehavior behavior);
 | 
					    void OnCheckFirmwareDecryption();
 | 
				
			||||||
    void OnLanguageChanged(const QString& locale);
 | 
					    void OnLanguageChanged(const QString& locale);
 | 
				
			||||||
    void OnMouseActivity();
 | 
					    void OnMouseActivity();
 | 
				
			||||||
    bool OnShutdownBegin();
 | 
					    bool OnShutdownBegin();
 | 
				
			||||||
@@ -441,7 +436,6 @@ private:
 | 
				
			|||||||
    void LoadTranslation();
 | 
					    void LoadTranslation();
 | 
				
			||||||
    void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
 | 
					    void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
 | 
				
			||||||
    bool CheckDarkMode();
 | 
					    bool CheckDarkMode();
 | 
				
			||||||
    bool CheckSystemArchiveDecryption();
 | 
					 | 
				
			||||||
    bool CheckFirmwarePresence();
 | 
					    bool CheckFirmwarePresence();
 | 
				
			||||||
    void SetFirmwareVersion();
 | 
					    void SetFirmwareVersion();
 | 
				
			||||||
    void ConfigureFilesystemProvider(const std::string& filepath);
 | 
					    void ConfigureFilesystemProvider(const std::string& filepath);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -224,11 +224,6 @@
 | 
				
			|||||||
    <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_Verify_installed_contents">
 | 
					  <action name="action_Verify_installed_contents">
 | 
				
			||||||
   <property name="text">
 | 
					   <property name="text">
 | 
				
			||||||
    <string>&Verify Installed Contents</string>
 | 
					    <string>&Verify Installed Contents</string>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user