Properly detect TMDs from NUS/CDN

This commit is contained in:
d0k3 2017-02-06 02:53:12 +01:00
parent 058fd9f528
commit d9e9455be3
5 changed files with 7 additions and 2 deletions

View File

@ -45,7 +45,9 @@ u32 IdentifyFileType(const char* path) {
} else if (memcmp(header, romfs_magic, sizeof(romfs_magic)) == 0) {
return GAME_ROMFS; // RomFS file (check could be better)
} else if (strncmp(TMD_ISSUER, (char*) (header + 0x140), 0x40) == 0) {
if (fsize >= TMD_SIZE_N(getbe16(header + 0x1DE)))
if (fsize == TMD_SIZE_N(getbe16(header + 0x1DE)) + TMD_CDNCERT_SIZE)
return GAME_TMD | FLAG_NUSCDN; // TMD file from NUS/CDN
else if (fsize >= TMD_SIZE_N(getbe16(header + 0x1DE)))
return GAME_TMD; // TMD file
} else if (ValidateFirmHeader((FirmHeader*) data, fsize) == 0) {
return SYS_FIRM; // FIRM file

View File

@ -16,6 +16,7 @@
#define BIN_LAUNCH (1<<11)
#define TYPE_BASE 0x00FFFFFF // 24 bit reserved for base types
#define FLAG_NUSCDN (1<<30)
#define FLAG_CXI (1<<31)
#define FTYPE_MOUNTABLE(tp) (tp&(IMG_FAT|IMG_NAND|GAME_CIA|GAME_NCSD|GAME_NCCH|GAME_EXEFS|GAME_ROMFS|SYS_FIRM))

View File

@ -65,7 +65,7 @@ u32 GetTitleKey(u8* titlekey, Ticket* ticket) {
memcpy(tik.titlekey, ticket->titlekey, 16);
tik.commonkey_idx = ticket->commonkey_idx;
if (CryptTitleKey(&tik, false) != 0) return 0;
if (CryptTitleKey(&tik, false) != 0) return 1;
memcpy(titlekey, tik.titlekey, 16);
return 0;
}

View File

@ -3,6 +3,7 @@
#include "common.h"
#define TICKET_SIZE sizeof(Ticket)
#define TICKET_CDNCERT_SIZE 0x700
#define TICKET_ISSUER "Root-CA00000003-XS0000000c"
#define TICKET_ISSUER_DEV "Root-CA00000004-XS00000009"

View File

@ -7,6 +7,7 @@
#define TMD_SIZE_MIN sizeof(TitleMetaData)
#define TMD_SIZE_MAX (sizeof(TitleMetaData) + (TMD_MAX_CONTENTS*sizeof(TmdContentChunk)))
#define TMD_SIZE_N(n) (sizeof(TitleMetaData) + (n*sizeof(TmdContentChunk)))
#define TMD_CDNCERT_SIZE 0x700
#define TMD_ISSUER "Root-CA00000003-CP0000000b"
#define TMD_SIG_TYPE 0x00, 0x01, 0x00, 0x04 // RSA_2048 SHA256