mirror of
https://gitlab.com/Theopse/fbi-i18n-zh.git
synced 2025-06-12 10:09:16 +08:00
Clean up CIA/TMD/ticket parsing.
This commit is contained in:
parent
4eaacd7982
commit
4094fbcdfa
@ -277,28 +277,33 @@ Result util_import_seed(u64 titleId) {
|
||||
u8 region = CFG_REGION_USA;
|
||||
CFGU_GetSystemLanguage(®ion);
|
||||
|
||||
char url[128];
|
||||
snprintf(url, 128, "https://kagiya-ctr.cdn.nintendo.net/title/0x%016llX/ext_key?country=%s", titleId, regionStrings[region]);
|
||||
if(region <= CFG_REGION_TWN) {
|
||||
char url[128];
|
||||
snprintf(url, 128, "https://kagiya-ctr.cdn.nintendo.net/title/0x%016llX/ext_key?country=%s", titleId, regionStrings[region]);
|
||||
|
||||
httpcContext context;
|
||||
if(R_SUCCEEDED(res = httpcOpenContext(&context, HTTPC_METHOD_GET, url, 1))) {
|
||||
httpcSetSSLOpt(&context, SSLCOPT_DisableVerify);
|
||||
httpcContext context;
|
||||
if(R_SUCCEEDED(res = httpcOpenContext(&context, HTTPC_METHOD_GET, url, 1))) {
|
||||
httpcSetSSLOpt(&context, SSLCOPT_DisableVerify);
|
||||
|
||||
u32 responseCode = 0;
|
||||
if(R_SUCCEEDED(res = httpcBeginRequest(&context)) && R_SUCCEEDED(res = httpcGetResponseStatusCode(&context, &responseCode, 0))) {
|
||||
if(responseCode == 200) {
|
||||
u32 pos = 0;
|
||||
u32 bytesRead = 0;
|
||||
while(pos < sizeof(seed) && (R_SUCCEEDED(res = httpcDownloadData(&context, &seed[pos], sizeof(seed) - pos, &bytesRead)) || res == HTTPC_RESULTCODE_DOWNLOADPENDING)) {
|
||||
pos += bytesRead;
|
||||
u32 responseCode = 0;
|
||||
if(R_SUCCEEDED(res = httpcBeginRequest(&context)) && R_SUCCEEDED(res = httpcGetResponseStatusCode(&context, &responseCode, 0))) {
|
||||
if(responseCode == 200) {
|
||||
u32 pos = 0;
|
||||
u32 bytesRead = 0;
|
||||
while(pos < sizeof(seed) && (R_SUCCEEDED(res = httpcDownloadData(&context, &seed[pos], sizeof(seed) - pos, &bytesRead)) || res == HTTPC_RESULTCODE_DOWNLOADPENDING)) {
|
||||
pos += bytesRead;
|
||||
}
|
||||
} else {
|
||||
res = R_FBI_HTTP_RESPONSE_CODE;
|
||||
}
|
||||
} else {
|
||||
res = R_FBI_HTTP_RESPONSE_CODE;
|
||||
}
|
||||
}
|
||||
|
||||
httpcCloseContext(&context);
|
||||
httpcCloseContext(&context);
|
||||
}
|
||||
} else {
|
||||
res = R_FBI_OUT_OF_RANGE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(R_SUCCEEDED(res)) {
|
||||
@ -309,4 +314,32 @@ Result util_import_seed(u64 titleId) {
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static u32 sigSizes[6] = {0x240, 0x140, 0x80, 0x240, 0x140, 0x80};
|
||||
|
||||
u64 util_get_cia_title_id(u8* cia) {
|
||||
u32 headerSize = *(u32*) &cia[0x00];
|
||||
u32 certSize = *(u32*) &cia[0x08];
|
||||
u32 ticketSize = *(u32*) &cia[0x0C];
|
||||
|
||||
u8* tmd = &cia[((headerSize + 0x3F) & ~0x3F) + ((certSize + 0x3F) & ~0x3F) + ((ticketSize + 0x3F) & ~0x3F)];
|
||||
|
||||
return util_get_tmd_title_id(tmd);
|
||||
}
|
||||
|
||||
u64 util_get_ticket_title_id(u8* ticket) {
|
||||
return __builtin_bswap64(*(u64*) &ticket[sigSizes[ticket[0x03]] + 0x9C]);
|
||||
}
|
||||
|
||||
u64 util_get_tmd_title_id(u8* tmd) {
|
||||
return __builtin_bswap64(*(u64*) &tmd[sigSizes[tmd[0x03]] + 0x4C]);
|
||||
}
|
||||
|
||||
u16 util_get_tmd_content_count(u8* tmd) {
|
||||
return __builtin_bswap16(*(u16*) &tmd[sigSizes[tmd[0x03]] + 0x9E]);
|
||||
}
|
||||
|
||||
u8* util_get_tmd_content_chunk(u8* tmd, u32 index) {
|
||||
return &tmd[sigSizes[tmd[0x03]] + 0x9C4 + (index * 0x30)];
|
||||
}
|
@ -51,4 +51,10 @@ Result util_ensure_dir(FS_Archive archive, const char* path);
|
||||
void util_get_path_file(char* out, const char* path, u32 size);
|
||||
void util_get_parent_path(char* out, const char* path, u32 size);
|
||||
|
||||
Result util_import_seed(u64 titleId);
|
||||
Result util_import_seed(u64 titleId);
|
||||
|
||||
u64 util_get_cia_title_id(u8* cia);
|
||||
u64 util_get_ticket_title_id(u8* ticket);
|
||||
u64 util_get_tmd_title_id(u8* tmd);
|
||||
u16 util_get_tmd_content_count(u8* tmd);
|
||||
u8* util_get_tmd_content_chunk(u8* tmd, u32 index);
|
@ -8,6 +8,7 @@
|
||||
#define R_FBI_THREAD_CREATE_FAILED MAKERESULT(RL_PERMANENT, RS_INTERNAL, RM_APPLICATION, 6)
|
||||
|
||||
#define R_FBI_OUT_OF_MEMORY MAKERESULT(RL_FATAL, RS_OUTOFRESOURCE, RM_APPLICATION, RD_OUT_OF_MEMORY)
|
||||
#define R_FBI_OUT_OF_RANGE MAKERESULT(RL_PERMANENT, RS_INVALIDARG, RM_APPLICATION, RD_OUT_OF_RANGE)
|
||||
|
||||
typedef struct ui_view_s ui_view;
|
||||
|
||||
|
@ -99,18 +99,13 @@ static Result action_install_cdn_open_dst(void* data, u32 index, void* initialRe
|
||||
install_cdn_data* installData = (install_cdn_data*) data;
|
||||
|
||||
if(index == 0) {
|
||||
static u32 dataOffsets[6] = {0x240, 0x140, 0x80, 0x240, 0x140, 0x80};
|
||||
|
||||
u8* tmd = (u8*) initialReadBlock;
|
||||
u8 sigType = tmd[0x03];
|
||||
|
||||
installData->contentCount = __builtin_bswap16(*(u16*) &tmd[dataOffsets[sigType] + 0x9E]);
|
||||
installData->contentCount = util_get_tmd_content_count((u8*) initialReadBlock);
|
||||
if(installData->contentCount > CONTENTS_MAX) {
|
||||
return MAKERESULT(RL_PERMANENT, RS_INVALIDARG, RM_APPLICATION, RD_OUT_OF_RANGE);
|
||||
return R_FBI_OUT_OF_RANGE;
|
||||
}
|
||||
|
||||
for(u32 i = 0; i < installData->contentCount; i++) {
|
||||
u8* contentChunk = &tmd[dataOffsets[sigType] + 0x9C4 + (i * 0x30)];
|
||||
u8* contentChunk = util_get_tmd_content_chunk((u8*) initialReadBlock, i);
|
||||
|
||||
installData->contentIds[i] = __builtin_bswap32(*(u32*) &contentChunk[0x00]);
|
||||
installData->contentIndices[i] = __builtin_bswap16(*(u16*) &contentChunk[0x04]);
|
||||
|
@ -119,11 +119,7 @@ static Result action_install_cias_read_src(void* data, u32 handle, u32* bytesRea
|
||||
static Result action_install_cias_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
|
||||
install_cias_data* installData = (install_cias_data*) data;
|
||||
|
||||
u8* cia = (u8*) initialReadBlock;
|
||||
|
||||
u32 headerSize = *(u32*) &cia[0x00];
|
||||
u32 certSize = *(u32*) &cia[0x08];
|
||||
u64 titleId = __builtin_bswap64(*(u64*) &cia[((headerSize + 0x3F) & ~0x3F) + ((certSize + 0x3F) & ~0x3F) + 0x1DC]);
|
||||
u64 titleId = util_get_cia_title_id((u8*) initialReadBlock);
|
||||
|
||||
FS_MediaType dest = ((titleId >> 32) & 0x8010) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD;
|
||||
|
||||
|
@ -111,22 +111,11 @@ static Result networkinstall_open_dst(void* data, u32 index, void* initialReadBl
|
||||
Result res = 0;
|
||||
|
||||
if(networkInstallData->ticket) {
|
||||
u8* ticket = (u8*) initialReadBlock;
|
||||
|
||||
static u32 dataOffsets[6] = {0x240, 0x140, 0x80, 0x240, 0x140, 0x80};
|
||||
static u32 titleIdOffset = 0x9C;
|
||||
|
||||
u64 titleId = 0;
|
||||
memcpy(&titleId, &ticket[dataOffsets[ticket[0x03]] + titleIdOffset], sizeof(u64));
|
||||
networkInstallData->ticketInfo.titleId = __builtin_bswap64(titleId);
|
||||
networkInstallData->ticketInfo.titleId = util_get_ticket_title_id((u8*) initialReadBlock);
|
||||
|
||||
res = AM_InstallTicketBegin(handle);
|
||||
} else {
|
||||
u8* cia = (u8*) initialReadBlock;
|
||||
|
||||
u32 headerSize = *(u32*) &cia[0x00];
|
||||
u32 certSize = *(u32*) &cia[0x08];
|
||||
u64 titleId = __builtin_bswap64(*(u64*) &cia[((headerSize + 0x3F) & ~0x3F) + ((certSize + 0x3F) & ~0x3F) + 0x1DC]);
|
||||
u64 titleId = util_get_cia_title_id((u8*) initialReadBlock);
|
||||
|
||||
FS_MediaType dest = ((titleId >> 32) & 0x8010) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD;
|
||||
|
||||
|
@ -111,22 +111,11 @@ static Result qrinstall_open_dst(void* data, u32 index, void* initialReadBlock,
|
||||
Result res = 0;
|
||||
|
||||
if(qrInstallData->ticket) {
|
||||
u8* ticket = (u8*) initialReadBlock;
|
||||
|
||||
static u32 dataOffsets[6] = {0x240, 0x140, 0x80, 0x240, 0x140, 0x80};
|
||||
static u32 titleIdOffset = 0x9C;
|
||||
|
||||
u64 titleId = 0;
|
||||
memcpy(&titleId, &ticket[dataOffsets[ticket[0x03]] + titleIdOffset], sizeof(u64));
|
||||
qrInstallData->ticketInfo.titleId = __builtin_bswap64(titleId);
|
||||
qrInstallData->ticketInfo.titleId = util_get_ticket_title_id((u8*) initialReadBlock);
|
||||
|
||||
res = AM_InstallTicketBegin(handle);
|
||||
} else {
|
||||
u8* cia = (u8*) initialReadBlock;
|
||||
|
||||
u32 headerSize = *(u32*) &cia[0x00];
|
||||
u32 certSize = *(u32*) &cia[0x08];
|
||||
u64 titleId = __builtin_bswap64(*(u64*) &cia[((headerSize + 0x3F) & ~0x3F) + ((certSize + 0x3F) & ~0x3F) + 0x1DC]);
|
||||
u64 titleId = util_get_cia_title_id((u8*) initialReadBlock);
|
||||
|
||||
FS_MediaType dest = ((titleId >> 32) & 0x8010) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user