Compare commits

...

1 Commits

Author SHA1 Message Date
PavelBARABANOV fbfe0c95fa [fyle_sys] Fall back to RightsId as TitleKey for direct dumps 2026-11-01 07:40:26 +03:00
+9 -12
View File
@@ -60,20 +60,17 @@ NCA::NCA(VirtualFile file_, const NCA* base_nca, bool allow_missing_base)
auto titlekey = auto titlekey =
keys.GetKey(Core::Crypto::S128KeyType::Titlekey, rights_id_u128[1], rights_id_u128[0]); keys.GetKey(Core::Crypto::S128KeyType::Titlekey, rights_id_u128[1], rights_id_u128[0]);
if (titlekey == Core::Crypto::Key128{}) { if (titlekey == Core::Crypto::Key128{}) {
status = Loader::ResultStatus::ErrorMissingTitlekey; // Fallback: use rights_id as TitleKey for direct dumps without tickets/keys.
return; std::memcpy(titlekey.data(), rights_id.data(), rights_id.size());
LOG_DEBUG(Loader, "TitleKey not found for {}, falling back to RightsId.",
file->GetName());
} else if (keys.HasKey(Core::Crypto::S128KeyType::Titlekek, master_key_id)) {
auto titlekek = keys.GetKey(Core::Crypto::S128KeyType::Titlekek, master_key_id);
Core::Crypto::AESCipher<Core::Crypto::Key128> cipher(titlekek, Core::Crypto::Mode::ECB);
cipher.Transcode(titlekey.data(), titlekey.size(), titlekey.data(),
Core::Crypto::Op::Decrypt);
} }
if (!keys.HasKey(Core::Crypto::S128KeyType::Titlekek, master_key_id)) {
status = Loader::ResultStatus::ErrorMissingTitlekek;
return;
}
auto titlekek = keys.GetKey(Core::Crypto::S128KeyType::Titlekek, master_key_id);
Core::Crypto::AESCipher<Core::Crypto::Key128> cipher(titlekek, Core::Crypto::Mode::ECB);
cipher.Transcode(titlekey.data(), titlekey.size(), titlekey.data(),
Core::Crypto::Op::Decrypt);
reader->SetExternalDecryptionKey(titlekey.data(), titlekey.size()); reader->SetExternalDecryptionKey(titlekey.data(), titlekey.size());
} }