diff options
| author | 2015-10-10 21:50:10 -0400 | |
|---|---|---|
| committer | 2015-10-10 22:34:17 -0400 | |
| commit | 2706394384afea55069848d5b337e60fbe81c336 (patch) | |
| tree | 4bc9ebb08be7da995a3a16a6de84976b08377383 /src/core/loader | |
| parent | Merge pull request #1195 from Gareth422/secondary (diff) | |
| download | yuzu-2706394384afea55069848d5b337e60fbe81c336.tar.gz yuzu-2706394384afea55069848d5b337e60fbe81c336.tar.xz yuzu-2706394384afea55069848d5b337e60fbe81c336.zip | |
Loader: Implement encryption check
Diffstat (limited to 'src/core/loader')
| -rw-r--r-- | src/core/loader/loader.h | 1 | ||||
| -rw-r--r-- | src/core/loader/ncch.cpp | 5 | ||||
| -rw-r--r-- | src/core/loader/ncch.h | 4 |
3 files changed, 8 insertions, 2 deletions
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index 8de95dacf..a7f2715ba 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h | |||
| @@ -71,6 +71,7 @@ enum class ResultStatus { | |||
| 71 | ErrorNotUsed, | 71 | ErrorNotUsed, |
| 72 | ErrorAlreadyLoaded, | 72 | ErrorAlreadyLoaded, |
| 73 | ErrorMemoryAllocationFailed, | 73 | ErrorMemoryAllocationFailed, |
| 74 | ErrorEncrypted, | ||
| 74 | }; | 75 | }; |
| 75 | 76 | ||
| 76 | static inline u32 MakeMagic(char a, char b, char c, char d) { | 77 | static inline u32 MakeMagic(char a, char b, char c, char d) { |
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp index 094d74100..c67d25b55 100644 --- a/src/core/loader/ncch.cpp +++ b/src/core/loader/ncch.cpp | |||
| @@ -266,6 +266,11 @@ ResultStatus AppLoader_NCCH::Load() { | |||
| 266 | LOG_DEBUG(Loader, "Thread priority: 0x%X" , priority); | 266 | LOG_DEBUG(Loader, "Thread priority: 0x%X" , priority); |
| 267 | LOG_DEBUG(Loader, "Resource limit category: %d" , resource_limit_category); | 267 | LOG_DEBUG(Loader, "Resource limit category: %d" , resource_limit_category); |
| 268 | 268 | ||
| 269 | if (exheader_header.arm11_system_local_caps.program_id != ncch_header.program_id) { | ||
| 270 | LOG_ERROR(Loader, "ExHeader Program ID mismatch: the ROM is probably encrypted."); | ||
| 271 | return ResultStatus::ErrorEncrypted; | ||
| 272 | } | ||
| 273 | |||
| 269 | // Read ExeFS... | 274 | // Read ExeFS... |
| 270 | 275 | ||
| 271 | exefs_offset = ncch_header.exefs_offset * kBlockSize; | 276 | exefs_offset = ncch_header.exefs_offset * kBlockSize; |
diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h index d875e4cf3..fd7c65814 100644 --- a/src/core/loader/ncch.h +++ b/src/core/loader/ncch.h | |||
| @@ -23,7 +23,7 @@ struct NCCH_Header { | |||
| 23 | u16 maker_code; | 23 | u16 maker_code; |
| 24 | u16 version; | 24 | u16 version; |
| 25 | u8 reserved_0[4]; | 25 | u8 reserved_0[4]; |
| 26 | u8 program_id[8]; | 26 | u64_le program_id; |
| 27 | u8 reserved_1[0x10]; | 27 | u8 reserved_1[0x10]; |
| 28 | u8 logo_region_hash[0x20]; | 28 | u8 logo_region_hash[0x20]; |
| 29 | u8 product_code[0x10]; | 29 | u8 product_code[0x10]; |
| @@ -109,7 +109,7 @@ struct ExHeader_StorageInfo { | |||
| 109 | }; | 109 | }; |
| 110 | 110 | ||
| 111 | struct ExHeader_ARM11_SystemLocalCaps { | 111 | struct ExHeader_ARM11_SystemLocalCaps { |
| 112 | u8 program_id[8]; | 112 | u64_le program_id; |
| 113 | u32 core_version; | 113 | u32 core_version; |
| 114 | u8 reserved_flags[2]; | 114 | u8 reserved_flags[2]; |
| 115 | union { | 115 | union { |