diff options
| author | 2015-10-20 10:17:31 -0400 | |
|---|---|---|
| committer | 2015-10-20 10:17:31 -0400 | |
| commit | c717d1551da213c9ad2a80dcf198ebe5a1345627 (patch) | |
| tree | f89e6c7f0b19a370a69710c0e3327fb337f643cc /src/core/loader | |
| parent | Merge pull request #1194 from linkmauve/no-newline (diff) | |
| parent | Loader: Change NCCH header types to be explicitly little-endian (diff) | |
| download | yuzu-c717d1551da213c9ad2a80dcf198ebe5a1345627.tar.gz yuzu-c717d1551da213c9ad2a80dcf198ebe5a1345627.tar.xz yuzu-c717d1551da213c9ad2a80dcf198ebe5a1345627.zip | |
Merge pull request #1199 from Gareth422/encryption-check
Loader: Implement NCCH 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 | 8 | ||||
| -rw-r--r-- | src/core/loader/ncch.h | 36 |
3 files changed, 25 insertions, 20 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..68b3f546e 100644 --- a/src/core/loader/ncch.cpp +++ b/src/core/loader/ncch.cpp | |||
| @@ -128,9 +128,8 @@ ResultStatus AppLoader_NCCH::LoadExec() { | |||
| 128 | if (ResultStatus::Success == ReadCode(code)) { | 128 | if (ResultStatus::Success == ReadCode(code)) { |
| 129 | std::string process_name = Common::StringFromFixedZeroTerminatedBuffer( | 129 | std::string process_name = Common::StringFromFixedZeroTerminatedBuffer( |
| 130 | (const char*)exheader_header.codeset_info.name, 8); | 130 | (const char*)exheader_header.codeset_info.name, 8); |
| 131 | u64 program_id = *reinterpret_cast<u64_le const*>(&ncch_header.program_id[0]); | ||
| 132 | 131 | ||
| 133 | SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, program_id); | 132 | SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, ncch_header.program_id); |
| 134 | 133 | ||
| 135 | codeset->code.offset = 0; | 134 | codeset->code.offset = 0; |
| 136 | codeset->code.addr = exheader_header.codeset_info.text.address; | 135 | codeset->code.addr = exheader_header.codeset_info.text.address; |
| @@ -266,6 +265,11 @@ ResultStatus AppLoader_NCCH::Load() { | |||
| 266 | LOG_DEBUG(Loader, "Thread priority: 0x%X" , priority); | 265 | LOG_DEBUG(Loader, "Thread priority: 0x%X" , priority); |
| 267 | LOG_DEBUG(Loader, "Resource limit category: %d" , resource_limit_category); | 266 | LOG_DEBUG(Loader, "Resource limit category: %d" , resource_limit_category); |
| 268 | 267 | ||
| 268 | if (exheader_header.arm11_system_local_caps.program_id != ncch_header.program_id) { | ||
| 269 | LOG_ERROR(Loader, "ExHeader Program ID mismatch: the ROM is probably encrypted."); | ||
| 270 | return ResultStatus::ErrorEncrypted; | ||
| 271 | } | ||
| 272 | |||
| 269 | // Read ExeFS... | 273 | // Read ExeFS... |
| 270 | 274 | ||
| 271 | exefs_offset = ncch_header.exefs_offset * kBlockSize; | 275 | exefs_offset = ncch_header.exefs_offset * kBlockSize; |
diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h index d875e4cf3..ca6772a78 100644 --- a/src/core/loader/ncch.h +++ b/src/core/loader/ncch.h | |||
| @@ -17,31 +17,31 @@ | |||
| 17 | 17 | ||
| 18 | struct NCCH_Header { | 18 | struct NCCH_Header { |
| 19 | u8 signature[0x100]; | 19 | u8 signature[0x100]; |
| 20 | u32 magic; | 20 | u32_le magic; |
| 21 | u32 content_size; | 21 | u32_le content_size; |
| 22 | u8 partition_id[8]; | 22 | u8 partition_id[8]; |
| 23 | u16 maker_code; | 23 | u16_le maker_code; |
| 24 | u16 version; | 24 | u16_le 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]; |
| 30 | u8 extended_header_hash[0x20]; | 30 | u8 extended_header_hash[0x20]; |
| 31 | u32 extended_header_size; | 31 | u32_le extended_header_size; |
| 32 | u8 reserved_2[4]; | 32 | u8 reserved_2[4]; |
| 33 | u8 flags[8]; | 33 | u8 flags[8]; |
| 34 | u32 plain_region_offset; | 34 | u32_le plain_region_offset; |
| 35 | u32 plain_region_size; | 35 | u32_le plain_region_size; |
| 36 | u32 logo_region_offset; | 36 | u32_le logo_region_offset; |
| 37 | u32 logo_region_size; | 37 | u32_le logo_region_size; |
| 38 | u32 exefs_offset; | 38 | u32_le exefs_offset; |
| 39 | u32 exefs_size; | 39 | u32_le exefs_size; |
| 40 | u32 exefs_hash_region_size; | 40 | u32_le exefs_hash_region_size; |
| 41 | u8 reserved_3[4]; | 41 | u8 reserved_3[4]; |
| 42 | u32 romfs_offset; | 42 | u32_le romfs_offset; |
| 43 | u32 romfs_size; | 43 | u32_le romfs_size; |
| 44 | u32 romfs_hash_region_size; | 44 | u32_le romfs_hash_region_size; |
| 45 | u8 reserved_4[4]; | 45 | u8 reserved_4[4]; |
| 46 | u8 exefs_super_block_hash[0x20]; | 46 | u8 exefs_super_block_hash[0x20]; |
| 47 | u8 romfs_super_block_hash[0x20]; | 47 | u8 romfs_super_block_hash[0x20]; |
| @@ -109,8 +109,8 @@ 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_le core_version; |
| 114 | u8 reserved_flags[2]; | 114 | u8 reserved_flags[2]; |
| 115 | union { | 115 | union { |
| 116 | u8 flags0; | 116 | u8 flags0; |