mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 13:42:47 +00:00
Improved verification for TMD
This commit is contained in:
parent
a05cc1ff56
commit
619242ef96
@ -33,6 +33,29 @@ u32 ValidateTmdSignature(TitleMetaData* tmd) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 VerifyTmd(TitleMetaData* tmd) {
|
||||
TmdContentChunk* content_list = (TmdContentChunk*) (tmd + 1);
|
||||
u32 content_count = getbe16(tmd->content_count);
|
||||
|
||||
// TMD validation
|
||||
if (ValidateTmd(tmd) != 0) return 1;
|
||||
|
||||
// check content info hash
|
||||
if (sha_cmp(tmd->contentinfo_hash, (u8*)tmd->contentinfo, 64 * sizeof(TmdContentInfo), SHA256_MODE) != 0)
|
||||
return 1;
|
||||
|
||||
// check hashes in content info
|
||||
for (u32 i = 0, kc = 0; i < 64 && kc < content_count; i++) {
|
||||
TmdContentInfo* info = tmd->contentinfo + i;
|
||||
u32 k = getbe16(info->cmd_count);
|
||||
if (sha_cmp(info->hash, content_list + kc, k * sizeof(TmdContentChunk), SHA256_MODE) != 0)
|
||||
return 1;
|
||||
kc += k;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 GetTmdCtr(u8* ctr, TmdContentChunk* chunk) {
|
||||
memset(ctr, 0, 16);
|
||||
memcpy(ctr, chunk->index, 2);
|
||||
|
@ -59,6 +59,7 @@ typedef struct {
|
||||
|
||||
u32 ValidateTmd(TitleMetaData* tmd);
|
||||
u32 ValidateTmdSignature(TitleMetaData* tmd);
|
||||
u32 VerifyTmd(TitleMetaData* tmd);
|
||||
u32 GetTmdCtr(u8* ctr, TmdContentChunk* chunk);
|
||||
u32 FixTmdHashes(TitleMetaData* tmd);
|
||||
u32 BuildFakeTmd(TitleMetaData* tmd, u8* title_id, u32 n_contents, u32 save_size);
|
||||
|
@ -445,6 +445,13 @@ u32 VerifyCiaFile(const char* path) {
|
||||
free(cia);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// verify TMD
|
||||
if (VerifyTmd(&(cia->tmd)) != 0) {
|
||||
ShowPrompt(false, "%s\nError: TMD probably corrupted", pathstr);
|
||||
free(cia);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// verify contents
|
||||
u32 content_count = getbe16(cia->tmd.content_count);
|
||||
@ -486,7 +493,7 @@ u32 VerifyTmdFile(const char* path, bool cdn) {
|
||||
// load TMD file
|
||||
TitleMetaData* tmd = (TitleMetaData*) malloc(TMD_SIZE_MAX);
|
||||
TmdContentChunk* content_list = (TmdContentChunk*) (tmd + 1);
|
||||
if (LoadTmdFile(tmd, path) != 0) {
|
||||
if ((LoadTmdFile(tmd, path) != 0) || (VerifyTmd(tmd) != 0)) {
|
||||
ShowPrompt(false, "%s\nError: TMD probably corrupted", pathstr);
|
||||
free(tmd);
|
||||
return 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user