Browse Source
[fs] temporarely disable nca verification (#298)
[fs] temporarely disable nca verification (#298)
This adds a passthrough to basically disable nca verification for newer NCAs, this fixes (tested) Pokemon 4.0.0 update and other newer SDK games and updates (as reported on the discord) This is implemented as toggle that is default enabled, this needs proper implementation in the future. Co-authored-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/298 Reviewed-by: MaranBr <maranbr@eden-emu.dev> Reviewed-by: crueter <crueter@eden-emu.dev> Co-authored-by: Maufeat <sahyno1996@gmail.com> Co-committed-by: Maufeat <sahyno1996@gmail.com>remotes/1775983533824709160/release/0.0.3 v0.0.3
committed by
crueter
No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
61 changed files with 557 additions and 127 deletions
-
4src/android/app/build.gradle.kts
-
22src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
-
1src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
-
1src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt
-
8src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
-
1src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt
-
7src/android/app/src/main/java/org/yuzu/yuzu_emu/model/HomeViewModel.kt
-
34src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
-
2src/android/app/src/main/jni/native.cpp
-
2src/android/app/src/main/res/values-ar/strings.xml
-
2src/android/app/src/main/res/values-ckb/strings.xml
-
2src/android/app/src/main/res/values-cs/strings.xml
-
2src/android/app/src/main/res/values-de/strings.xml
-
2src/android/app/src/main/res/values-es/strings.xml
-
2src/android/app/src/main/res/values-fa/strings.xml
-
2src/android/app/src/main/res/values-fr/strings.xml
-
2src/android/app/src/main/res/values-he/strings.xml
-
2src/android/app/src/main/res/values-hu/strings.xml
-
2src/android/app/src/main/res/values-id/strings.xml
-
2src/android/app/src/main/res/values-it/strings.xml
-
2src/android/app/src/main/res/values-ja/strings.xml
-
2src/android/app/src/main/res/values-ko/strings.xml
-
2src/android/app/src/main/res/values-nb/strings.xml
-
2src/android/app/src/main/res/values-pl/strings.xml
-
2src/android/app/src/main/res/values-pt-rBR/strings.xml
-
2src/android/app/src/main/res/values-pt-rPT/strings.xml
-
2src/android/app/src/main/res/values-ru/strings.xml
-
2src/android/app/src/main/res/values-sr/strings.xml
-
2src/android/app/src/main/res/values-uk/strings.xml
-
2src/android/app/src/main/res/values-vi/strings.xml
-
2src/android/app/src/main/res/values-zh-rCN/strings.xml
-
2src/android/app/src/main/res/values-zh-rTW/strings.xml
-
5src/android/app/src/main/res/values/strings.xml
-
2src/audio_core/common/feature_support.h
-
9src/common/settings.h
-
3src/core/CMakeLists.txt
-
9src/core/file_sys/fssystem/fssystem_bucket_tree.cpp
-
20src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.cpp
-
57src/core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.cpp
-
44src/core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.h
-
217src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp
-
7src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h
-
9src/core/file_sys/fssystem/fssystem_nca_header.cpp
-
32src/core/file_sys/fssystem/fssystem_passthrough_storage.h
-
9src/core/hle/service/am/applet.cpp
-
4src/core/hle/service/am/applet.h
-
10src/core/hle/service/am/service/all_system_applet_proxies_service.cpp
-
1src/core/hle/service/am/service/all_system_applet_proxies_service.h
-
7src/core/hle/service/am/service/applet_common_functions.cpp
-
1src/core/hle/service/am/service/applet_common_functions.h
-
11src/core/hle/service/am/service/application_functions.cpp
-
4src/core/hle/service/am/service/application_functions.h
-
4src/core/hle/service/am/service/library_applet_creator.cpp
-
16src/core/hle/service/ns/application_manager_interface.cpp
-
2src/core/hle/service/ns/application_manager_interface.h
-
14src/core/hle/service/pctl/parental_control_service.cpp
-
2src/core/hle/service/pctl/parental_control_service.h
-
9src/yuzu/applets/qt_web_browser.cpp
-
6src/yuzu/configuration/shared_translation.cpp
-
41src/yuzu/main.cpp
-
3src/yuzu/main.h
@ -0,0 +1,57 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|||
|
|||
#include "common/alignment.h"
|
|||
#include "common/scope_exit.h"
|
|||
#include "core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.h"
|
|||
|
|||
#include <cmath>
|
|||
|
|||
namespace FileSys { |
|||
|
|||
Result HierarchicalSha3Storage::Initialize(VirtualFile* base_storages, s32 layer_count, size_t htbs, |
|||
void* hash_buf, size_t hash_buf_size) { |
|||
ASSERT(layer_count == LayerCount); |
|||
ASSERT(Common::IsPowerOfTwo(htbs)); |
|||
ASSERT(hash_buf != nullptr); |
|||
|
|||
m_hash_target_block_size = static_cast<s32>(htbs); |
|||
m_log_size_ratio = |
|||
static_cast<s32>(std::log2(static_cast<double>(m_hash_target_block_size) / HashSize)); |
|||
|
|||
m_base_storage_size = base_storages[2]->GetSize(); |
|||
{ |
|||
auto size_guard = SCOPE_GUARD { |
|||
m_base_storage_size = 0; |
|||
}; |
|||
R_UNLESS(m_base_storage_size <= static_cast<s64>(HashSize) |
|||
<< m_log_size_ratio << m_log_size_ratio, |
|||
ResultHierarchicalSha256BaseStorageTooLarge); |
|||
size_guard.Cancel(); |
|||
} |
|||
|
|||
m_base_storage = base_storages[2]; |
|||
m_hash_buffer = static_cast<char*>(hash_buf); |
|||
m_hash_buffer_size = hash_buf_size; |
|||
|
|||
std::array<u8, HashSize> master_hash{}; |
|||
base_storages[0]->ReadObject(std::addressof(master_hash)); |
|||
|
|||
s64 hash_storage_size = base_storages[1]->GetSize(); |
|||
ASSERT(Common::IsAligned(hash_storage_size, HashSize)); |
|||
ASSERT(hash_storage_size <= m_hash_target_block_size); |
|||
ASSERT(hash_storage_size <= static_cast<s64>(m_hash_buffer_size)); |
|||
|
|||
base_storages[1]->Read(reinterpret_cast<u8*>(m_hash_buffer), |
|||
static_cast<size_t>(hash_storage_size), 0); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
size_t HierarchicalSha3Storage::Read(u8* buffer, size_t size, size_t offset) const { |
|||
if (size == 0) |
|||
return size; |
|||
ASSERT(buffer != nullptr); |
|||
return m_base_storage->Read(buffer, size, offset); |
|||
} |
|||
|
|||
} // namespace FileSys
|
|||
@ -0,0 +1,44 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project |
|||
// SPDX-License-Identifier: GPL-3.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include <mutex> |
|||
|
|||
#include "core/file_sys/errors.h" |
|||
#include "core/file_sys/fssystem/fs_i_storage.h" |
|||
#include "core/file_sys/vfs/vfs.h" |
|||
|
|||
namespace FileSys { |
|||
|
|||
class HierarchicalSha3Storage : public IReadOnlyStorage { |
|||
YUZU_NON_COPYABLE(HierarchicalSha3Storage); |
|||
YUZU_NON_MOVEABLE(HierarchicalSha3Storage); |
|||
|
|||
public: |
|||
static constexpr s32 LayerCount = 3; |
|||
static constexpr size_t HashSize = 256 / 8; // SHA3-256 |
|||
|
|||
public: |
|||
HierarchicalSha3Storage() : m_mutex() {} |
|||
|
|||
Result Initialize(VirtualFile* base_storages, s32 layer_count, size_t htbs, void* hash_buf, |
|||
size_t hash_buf_size); |
|||
|
|||
virtual size_t GetSize() const override { |
|||
return m_base_storage->GetSize(); |
|||
} |
|||
|
|||
virtual size_t Read(u8* buffer, size_t length, size_t offset) const override; |
|||
|
|||
private: |
|||
VirtualFile m_base_storage; |
|||
s64 m_base_storage_size{}; |
|||
char* m_hash_buffer{}; |
|||
size_t m_hash_buffer_size{}; |
|||
s32 m_hash_target_block_size{}; |
|||
s32 m_log_size_ratio{}; |
|||
std::mutex m_mutex; |
|||
}; |
|||
|
|||
} // namespace FileSys |
|||
@ -0,0 +1,32 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project |
|||
// SPDX-License-Identifier: GPL-3.0-or-later |
|||
|
|||
#pragma once |
|||
#include "core/file_sys/fssystem/fs_i_storage.h" |
|||
#include "core/file_sys/vfs/vfs.h" |
|||
|
|||
namespace FileSys { |
|||
|
|||
//TODO: No integrity verification. |
|||
class PassthroughStorage final : public IReadOnlyStorage { |
|||
YUZU_NON_COPYABLE(PassthroughStorage); |
|||
YUZU_NON_MOVEABLE(PassthroughStorage); |
|||
|
|||
public: |
|||
explicit PassthroughStorage(VirtualFile base) : base_(std::move(base)) {} |
|||
~PassthroughStorage() override = default; |
|||
|
|||
size_t Read(u8* buffer, size_t size, size_t offset) const override { |
|||
if (!base_ || size == 0) |
|||
return 0; |
|||
return base_->Read(buffer, size, offset); |
|||
} |
|||
size_t GetSize() const override { |
|||
return base_ ? base_->GetSize() : 0; |
|||
} |
|||
|
|||
private: |
|||
VirtualFile base_{}; |
|||
}; |
|||
|
|||
} // namespace FileSys |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue