diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2023-09-10 19:40:39 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-10 19:40:39 +0200 |
commit | 64130d9f01c15bc021d3802e484b5a480911e5cc (patch) | |
tree | 88a1905a2dce48c34c77fc258b47b4aea66107a9 /src/core/loader/nsp.cpp | |
parent | Merge pull request #11465 from Kelebek1/skip_remaining_reset (diff) | |
parent | core: implement basic integrity verification (diff) | |
download | yuzu-64130d9f01c15bc021d3802e484b5a480911e5cc.tar yuzu-64130d9f01c15bc021d3802e484b5a480911e5cc.tar.gz yuzu-64130d9f01c15bc021d3802e484b5a480911e5cc.tar.bz2 yuzu-64130d9f01c15bc021d3802e484b5a480911e5cc.tar.lz yuzu-64130d9f01c15bc021d3802e484b5a480911e5cc.tar.xz yuzu-64130d9f01c15bc021d3802e484b5a480911e5cc.tar.zst yuzu-64130d9f01c15bc021d3802e484b5a480911e5cc.zip |
Diffstat (limited to 'src/core/loader/nsp.cpp')
-rw-r--r-- | src/core/loader/nsp.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp index f9b2549a3..fe2af1ae6 100644 --- a/src/core/loader/nsp.cpp +++ b/src/core/loader/nsp.cpp @@ -117,6 +117,42 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::KProcess& process, Core::S return result; } +ResultStatus AppLoader_NSP::VerifyIntegrity(std::function<bool(size_t, size_t)> progress_callback) { + // Extracted-type NSPs can't be verified. + if (nsp->IsExtractedType()) { + return ResultStatus::ErrorIntegrityVerificationNotImplemented; + } + + // Get list of all NCAs. + const auto ncas = nsp->GetNCAsCollapsed(); + + size_t total_size = 0; + size_t processed_size = 0; + + // Loop over NCAs, collecting the total size to verify. + for (const auto& nca : ncas) { + total_size += nca->GetBaseFile()->GetSize(); + } + + // Loop over NCAs again, verifying each. + for (const auto& nca : ncas) { + AppLoader_NCA loader_nca(nca->GetBaseFile()); + + const auto NcaProgressCallback = [&](size_t nca_processed_size, size_t nca_total_size) { + return progress_callback(processed_size + nca_processed_size, total_size); + }; + + const auto verification_result = loader_nca.VerifyIntegrity(NcaProgressCallback); + if (verification_result != ResultStatus::Success) { + return verification_result; + } + + processed_size += nca->GetBaseFile()->GetSize(); + } + + return ResultStatus::Success; +} + ResultStatus AppLoader_NSP::ReadRomFS(FileSys::VirtualFile& out_file) { return secondary_loader->ReadRomFS(out_file); } |