diff --git a/ctrtool/exheader.c b/ctrtool/exheader.c index afb1927..6f064d9 100644 --- a/ctrtool/exheader.c +++ b/ctrtool/exheader.c @@ -42,6 +42,11 @@ void exheader_set_programid(exheader_context* ctx, u8 programid[8]) memcpy(ctx->programid, programid, 8); } +void exheader_set_hash(exheader_context* ctx, u8 hash[32]) +{ + memcpy(ctx->hash, hash, 32); +} + void exheader_set_counter(exheader_context* ctx, u8 counter[16]) { memcpy(ctx->counter, counter, 16); @@ -94,6 +99,19 @@ void exheader_read(exheader_context* ctx, u32 actions) } } +int exheader_hash_valid(exheader_context* ctx) +{ + u8 hash[32]; + ctr_sha_256((u8*)&ctx->header, 0x400, hash); + + if(memcmp(ctx->hash,hash,0x20)){ + fprintf(stderr, "Error, exheader hash mismatch. Wrong key?\n"); + return 0; + } + + return 1; +} + int exheader_programid_valid(exheader_context* ctx) { if (!settings_get_ignore_programid(ctx->usersettings)) diff --git a/ctrtool/exheader.h b/ctrtool/exheader.h index 6cebdeb..436a8d7 100644 --- a/ctrtool/exheader.h +++ b/ctrtool/exheader.h @@ -109,6 +109,7 @@ typedef struct settings* usersettings; u8 partitionid[8]; u8 programid[8]; + u8 hash[32]; u8 counter[16]; u8 key[16]; u32 offset; @@ -134,6 +135,7 @@ void exheader_set_size(exheader_context* ctx, u32 size); void exheader_set_partitionid(exheader_context* ctx, u8 partitionid[8]); void exheader_set_counter(exheader_context* ctx, u8 counter[16]); void exheader_set_programid(exheader_context* ctx, u8 programid[8]); +void exheader_set_hash(exheader_context* ctx, u8 hash[32]); void exheader_set_encrypted(exheader_context* ctx, u32 encrypted); void exheader_set_key(exheader_context* ctx, u8 key[16]); void exheader_set_usersettings(exheader_context* ctx, settings* usersettings); @@ -143,6 +145,7 @@ int exheader_process(exheader_context* ctx, u32 actions); const char* exheader_getvalidstring(int valid); void exheader_print(exheader_context* ctx); void exheader_verify(exheader_context* ctx); +int exheader_hash_valid(exheader_context* ctx); int exheader_programid_valid(exheader_context* ctx); void exheader_determine_key(exheader_context* ctx, u32 actions); diff --git a/ctrtool/ncch.c b/ctrtool/ncch.c index de2328d..f8e8dc2 100644 --- a/ctrtool/ncch.c +++ b/ctrtool/ncch.c @@ -328,6 +328,7 @@ void ncch_process(ncch_context* ctx, u32 actions) exheader_set_usersettings(&ctx->exheader, ctx->usersettings); exheader_set_partitionid(&ctx->exheader, ctx->header.partitionid); exheader_set_programid(&ctx->exheader, ctx->header.programid); + exheader_set_hash(&ctx->exheader, ctx->header.extendedheaderhash); exheader_set_counter(&ctx->exheader, exheadercounter); exheader_set_key(&ctx->exheader, ctx->key); exheader_set_encrypted(&ctx->exheader, ctx->encrypted); @@ -361,7 +362,7 @@ void ncch_process(ncch_context* ctx, u32 actions) if (result && ncch_get_exheader_size(ctx)) { - if (!exheader_programid_valid(&ctx->exheader)) + if (!exheader_hash_valid(&ctx->exheader)) return; result = exheader_process(&ctx->exheader, actions); diff --git a/ctrtool/tmd.c b/ctrtool/tmd.c index e6a2b15..8ba2dd2 100644 --- a/ctrtool/tmd.c +++ b/ctrtool/tmd.c @@ -86,6 +86,7 @@ void tmd_print(tmd_context* ctx) ctr_tmd_header_2048* header2048 = 0; ctr_tmd_body* body = 0; unsigned int contentcount = 0; + unsigned int savesize = 0; unsigned int i; if (type == TMD_RSA_2048_SHA256 || type == TMD_RSA_2048_SHA1) @@ -104,7 +105,8 @@ void tmd_print(tmd_context* ctx) body = tmd_get_body(ctx); contentcount = getbe16(body->contentcount); - + savesize = getle32(body->savedatasize); + fprintf(stdout, "\nTMD header:\n"); fprintf(stdout, "Signature type: %s\n", tmd_get_type_string(type)); fprintf(stdout, "Issuer: %s\n", body->issuer); @@ -115,6 +117,12 @@ void tmd_print(tmd_context* ctx) memdump(stdout, "Title id: ", body->titleid, 8); fprintf(stdout, "Title type: %08x\n", getbe32(body->titletype)); fprintf(stdout, "Group id: %04x\n", getbe16(body->groupid)); + if(savesize < sizeKB) + fprintf(stdout, "Save Size: %08x\n", savesize); + else if(savesize < sizeMB) + fprintf(stdout, "Save Size: %dKB (%08x)\n", savesize/sizeKB, savesize); + else + fprintf(stdout, "Save Size: %dMB (%08x)\n", savesize/sizeMB, savesize); fprintf(stdout, "Access rights: %08x\n", getbe32(body->accessrights)); fprintf(stdout, "Title version: %04x\n", getbe16(body->titleversion)); fprintf(stdout, "Content count: %04x\n", getbe16(body->contentcount)); diff --git a/ctrtool/tmd.h b/ctrtool/tmd.h index 5d9f475..6272429 100644 --- a/ctrtool/tmd.h +++ b/ctrtool/tmd.h @@ -27,12 +27,16 @@ typedef struct unsigned char titleid[8]; unsigned char titletype[4]; unsigned char groupid[2]; - unsigned char padding3[62]; + unsigned char savedatasize[4]; + unsigned char privsavedatasize[4]; + unsigned char padding3[4]; + unsigned char twlflag; + unsigned char padding4[0x31]; unsigned char accessrights[4]; unsigned char titleversion[2]; unsigned char contentcount[2]; unsigned char bootcontent[2]; - unsigned char padding4[2]; + unsigned char padding5[2]; unsigned char hash[32]; unsigned char contentinfo[36*64]; } ctr_tmd_body; diff --git a/makerom/Makefile b/makerom/Makefile index 4cf0a1c..669476a 100644 --- a/makerom/Makefile +++ b/makerom/Makefile @@ -21,7 +21,7 @@ CC = gcc # MAKEROM Build Settings MAKEROM_BUILD_FLAGS = #-DDEBUG VER_MAJOR = 0 -VER_MINOR = 12 +VER_MINOR = 13 OUTPUT = makerom main: build diff --git a/makerom/accessdesc.c b/makerom/accessdesc.c index f02d9f1..f3b1056 100644 --- a/makerom/accessdesc.c +++ b/makerom/accessdesc.c @@ -307,6 +307,11 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, *cxiPubk = (u8*)app_fw1D_prod_hdrpub; *cxiPvtk = NULL; } + if(keys->keyset == pki_GATEWAY3DS){ + *accessDescSig = (u8*)app_fw1D_prod_acexsig; + *cxiPubk = (u8*)app_fw1D_prod_hdrpub; + *cxiPvtk = (u8*)app_fw1D_prod_hdrpub; + } break; case 0x1E: if(keys->keyset == pki_PRODUCTION){ @@ -314,6 +319,11 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, *cxiPubk = (u8*)app_fw1E_prod_hdrpub; *cxiPvtk = NULL; } + if(keys->keyset == pki_GATEWAY3DS){ + *accessDescSig = (u8*)app_fw1E_prod_acexsig; + *cxiPubk = (u8*)app_fw1E_prod_hdrpub; + *cxiPvtk = (u8*)app_fw1E_prod_hdrpub; + } break; case 0x20: if(keys->keyset == pki_DEVELOPMENT){ @@ -321,11 +331,16 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, *cxiPubk = (u8*)app_fw20_dev_hdrpub; *cxiPvtk = NULL; } - else if(keys->keyset == pki_PRODUCTION){ + if(keys->keyset == pki_PRODUCTION){ *accessDescSig = (u8*)app_fw20_prod_acexsig; *cxiPubk = (u8*)app_fw20_prod_hdrpub; *cxiPvtk = NULL; } + if(keys->keyset == pki_GATEWAY3DS){ + *accessDescSig = (u8*)app_fw20_prod_acexsig; + *cxiPubk = (u8*)app_fw20_prod_hdrpub; + *cxiPvtk = (u8*)app_fw20_prod_hdrpub; + } break; case 0x21: if(keys->keyset == pki_DEVELOPMENT){ @@ -338,6 +353,11 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, *cxiPubk = (u8*)app_fw21_prod_hdrpub; *cxiPvtk = NULL; } + if(keys->keyset == pki_GATEWAY3DS){ + *accessDescSig = (u8*)app_fw21_prod_acexsig; + *cxiPubk = (u8*)app_fw21_prod_hdrpub; + *cxiPvtk = (u8*)app_fw21_prod_hdrpub; + } break; case 0x23: if(keys->keyset == pki_DEVELOPMENT){ @@ -350,6 +370,11 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, *cxiPubk = (u8*)app_fw23_prod_hdrpub; *cxiPvtk = NULL; } + if(keys->keyset == pki_GATEWAY3DS){ + *accessDescSig = (u8*)app_fw23_prod_acexsig; + *cxiPubk = (u8*)app_fw23_prod_hdrpub; + *cxiPvtk = (u8*)app_fw23_prod_hdrpub; + } break; case 0x27: if(keys->keyset == pki_PRODUCTION){ @@ -357,6 +382,11 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, *cxiPubk = (u8*)app_fw27_prod_hdrpub; *cxiPvtk = NULL; } + if(keys->keyset == pki_GATEWAY3DS){ + *accessDescSig = (u8*)app_fw27_prod_acexsig; + *cxiPubk = (u8*)app_fw27_prod_hdrpub; + *cxiPvtk = (u8*)app_fw27_prod_hdrpub; + } break; } @@ -369,6 +399,11 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, *cxiPubk = (u8*)ecapp_fw20_prod_hdrpub; *cxiPvtk = NULL; } + if(keys->keyset == pki_GATEWAY3DS){ + *accessDescSig = (u8*)ecapp_fw20_prod_acexsig; + *cxiPubk = (u8*)ecapp_fw20_prod_hdrpub; + *cxiPvtk = (u8*)ecapp_fw20_prod_hdrpub; + } break; case 0x23: if(keys->keyset == pki_PRODUCTION){ @@ -376,6 +411,11 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, *cxiPubk = (u8*)ecapp_fw23_prod_hdrpub; *cxiPvtk = NULL; } + if(keys->keyset == pki_GATEWAY3DS){ + *accessDescSig = (u8*)ecapp_fw23_prod_acexsig; + *cxiPubk = (u8*)ecapp_fw23_prod_hdrpub; + *cxiPvtk = (u8*)ecapp_fw23_prod_hdrpub; + } break; } } diff --git a/makerom/cardinfo.c b/makerom/cardinfo.c index f2ac692..e9b80a4 100644 --- a/makerom/cardinfo.c +++ b/makerom/cardinfo.c @@ -139,8 +139,12 @@ int SetCardInfoBitmask(cardinfo_hdr *hdr, cci_settings *set) } str = set->rsf->CardInfo.CryptoType; - if(!str) - bitmask |= 0;//(3*0x40); + if(!str) { + if(set->options.useExternalSdkCardInfo) + bitmask |= (3*0x40); + else + bitmask |= 0; + } else{ int val = strtol(str,NULL,10); if(val < 0 || val > 3) { diff --git a/makerom/crypto.c b/makerom/crypto.c index 9fd99ee..e83b9f7 100644 --- a/makerom/crypto.c +++ b/makerom/crypto.c @@ -153,17 +153,13 @@ u32 GetSigHashLen(u32 sig_type) { switch(sig_type){ case RSA_4096_SHA1: - return 0x14; - case RSA_4096_SHA256: - return 0x20; case RSA_2048_SHA1: - return 0x14; - case RSA_2048_SHA256: - return 0x20; case ECC_SHA1: - return 0x14; + return SHA_1_LEN; + case RSA_4096_SHA256: + case RSA_2048_SHA256: case ECC_SHA256: - return 0x20; + return SHA_256_LEN; } return 0; } diff --git a/makerom/crypto.h b/makerom/crypto.h index 617fdc8..95b1ea5 100644 --- a/makerom/crypto.h +++ b/makerom/crypto.h @@ -36,6 +36,12 @@ typedef enum CTR_SHA_256, } ctr_sha_modes; +typedef enum +{ + SHA_1_LEN = 0x14, + SHA_256_LEN = 0x20, +} sha_hash_len; + typedef enum { RSA_4096_PUBK = 0, diff --git a/makerom/dir.h b/makerom/dir.h index 8dcb2c5..c6e16f6 100644 --- a/makerom/dir.h +++ b/makerom/dir.h @@ -41,7 +41,7 @@ typedef struct typedef struct { - u16 *name; + fs_romfs_char *name; u32 name_len; void *dir; // treated as type 'fs_dir'. This officially type 'void' to prevent self referencing problems diff --git a/makerom/exheader.c b/makerom/exheader.c index ac90276..87d78f7 100644 --- a/makerom/exheader.c +++ b/makerom/exheader.c @@ -11,23 +11,25 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings * int get_ExHeaderSettingsFromRsf(exheader_settings *exhdrset); int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *rsf); -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *rsf); -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *rsf); -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf, bool useAccessDescPreset); +int get_ExHeaderDependencyList(u8 *depList, rsf_settings *rsf); +int get_ExHeaderSystemInfo(exhdr_SystemInfo *systemInfo, rsf_settings *rsf); +int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int get_ExHeaderARM11SystemLocalInfoLimited(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); -int GetAppType(int *AppType, rsf_settings *rsf); +int GetAppType(rsf_settings *rsf); int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +void SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int SetARM11StorageInfoFsAccessInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +void SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +void SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *rsf); -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +void SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *rsf); int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); -void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); +void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int sysCall); void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); @@ -37,17 +39,17 @@ int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); bool IsEndAddress(u32 Address); bool IsStartAddress(u32 Address); -u32 GetIOMappingDesc(u32 Address); -u32 GetStaticMappingDesc(u32 Address, bool IsReadOnly); -u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO); +u32 GetIOMappingDesc(u32 address); +u32 GetStaticMappingDesc(u32 address, bool IsReadOnly); +u32 GetMappingDesc(u32 address, u32 prefixVal, s32 numPrefixBits, bool IsRO); int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); -void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 Index, u32 Value); -void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 Bitmask); -void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Num); +void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 index, u32 value); +void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 bitmask); +void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 num); u32 GetDescPrefixMask(int numPrefixBits); -u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal); +u32 GetDescPrefixBits(int numPrefixBits, u32 prefixVal); int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *rsf); /* ExHeader Signature Functions */ @@ -146,7 +148,7 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings * exhdrset->exHdr->codeSetInfo.flag |= infoflag_COMPRESS_EXEFS_0; if(ncchset->options.UseOnSD) exhdrset->exHdr->codeSetInfo.flag |= infoflag_SD_APPLICATION; - if(!ncchset->options.UseRomFS) // Move this later + if(!ncchset->options.UseRomFS) exhdrset->exHdr->arm11SystemLocalCapabilities.storageInfo.otherAttributes |= attribute_NOT_USE_ROMFS; return 0; @@ -155,26 +157,30 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings * int get_ExHeaderSettingsFromRsf(exheader_settings *exhdrset) { int result = 0; - result = get_ExHeaderCodeSetInfo(&exhdrset->exHdr->codeSetInfo, exhdrset->rsf); - if(result) goto finish; - if(!exhdrset->useAccessDescPreset){ - result = get_ExHeaderDependencyList((u8*)&exhdrset->exHdr->dependencyList[0], exhdrset->rsf); - if(result) goto finish; + if((result = get_ExHeaderCodeSetInfo(&exhdrset->exHdr->codeSetInfo, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderDependencyList((u8*)exhdrset->exHdr->dependencyList, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderSystemInfo(&exhdrset->exHdr->systemInfo, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM11SystemLocalInfo(&exhdrset->exHdr->arm11SystemLocalCapabilities, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM11KernelInfo(&exhdrset->exHdr->arm11KernelCapabilities, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM9AccessControlInfo(&exhdrset->exHdr->arm9AccessControlInfo, exhdrset->rsf))) + goto finish; } - - result = get_ExHeaderSystemInfo(&exhdrset->exHdr->systemInfo, exhdrset->rsf); - if(result) goto finish; - - result = get_ExHeaderARM11SystemLocalInfo(&exhdrset->exHdr->arm11SystemLocalCapabilities, exhdrset->rsf, exhdrset->useAccessDescPreset); - if(result) goto finish; - - if(!exhdrset->useAccessDescPreset){ - result = get_ExHeaderARM11KernelInfo(&exhdrset->exHdr->arm11KernelCapabilities, exhdrset->rsf); - if(result) goto finish; + else{ + if((result = get_ExHeaderCodeSetInfo(&exhdrset->exHdr->codeSetInfo, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderSystemInfo(&exhdrset->exHdr->systemInfo, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM11SystemLocalInfoLimited(&exhdrset->exHdr->arm11SystemLocalCapabilities, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM9AccessControlInfo(&exhdrset->exHdr->arm9AccessControlInfo, exhdrset->rsf))) + goto finish; } - result = get_ExHeaderARM9AccessControlInfo(&exhdrset->exHdr->arm9AccessControlInfo, exhdrset->rsf); - if(result) goto finish; finish: return result; @@ -186,109 +192,117 @@ int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *rsf) if(rsf->BasicInfo.Title){ //if(strlen(rsf->BasicInfo.Title) > 8){ // fprintf(stderr,"[EXHEADER ERROR] Parameter Too Long \"BasicInfo/Title\"\n"); - // return EXHDR_BAD_YAML_OPT; + // return EXHDR_BAD_RSF_OPT; //} strncpy((char*)CodeSetInfo->name,rsf->BasicInfo.Title,8); } else{ ErrorParamNotFound("BasicInfo/Title"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } + /* Stack Size */ - if(rsf->SystemControlInfo.StackSize){ - u32 StackSize = strtoul(rsf->SystemControlInfo.StackSize,NULL,0); - u32_to_u8(CodeSetInfo->stackSize,StackSize,LE); - } + if(rsf->SystemControlInfo.StackSize) + u32_to_u8(CodeSetInfo->stackSize, strtoul(rsf->SystemControlInfo.StackSize,NULL,0), LE); else{ ErrorParamNotFound("SystemControlInfo/StackSize"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } /* Remaster Version */ - if(rsf->SystemControlInfo.RemasterVersion){ - u16 RemasterVersion = strtol(rsf->SystemControlInfo.RemasterVersion,NULL,0); - u16_to_u8(CodeSetInfo->remasterVersion,RemasterVersion,LE); - } - else{ - u16_to_u8(CodeSetInfo->remasterVersion,0,LE); - } + if(rsf->SystemControlInfo.RemasterVersion) + u16_to_u8(CodeSetInfo->remasterVersion, strtol(rsf->SystemControlInfo.RemasterVersion,NULL,0), LE); + else + u16_to_u8(CodeSetInfo->remasterVersion, 0, LE); + return 0; } -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *rsf) +int get_ExHeaderDependencyList(u8 *depList, rsf_settings *rsf) { if(rsf->SystemControlInfo.DependencyNum > 0x30){ fprintf(stderr,"[EXHEADER ERROR] Too Many Dependency IDs\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } for(int i = 0; i < rsf->SystemControlInfo.DependencyNum; i++){ - u8 *pos = (DependencyList + 0x8*i); - u64 TitleID = strtoull(rsf->SystemControlInfo.Dependency[i],NULL,0); - u64_to_u8(pos,TitleID,LE); + u8 *pos = (depList + 0x8*i); + u64_to_u8(pos, strtoull(rsf->SystemControlInfo.Dependency[i],NULL,0), LE); } return 0; } -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *rsf) +int get_ExHeaderSystemInfo(exhdr_SystemInfo *systemInfo, rsf_settings *rsf) { /* SaveDataSize */ if(rsf->SystemControlInfo.SaveDataSize){ - u64 SaveDataSize = 0; - int ret = GetSaveDataSizeFromString(&SaveDataSize,rsf->SystemControlInfo.SaveDataSize,"EXHEADER"); - if(ret) return ret; - u64_to_u8(SystemInfo->savedataSize,SaveDataSize,LE); - } - else{ - u64_to_u8(SystemInfo->savedataSize,0,LE); + u64 saveSize = 0; + if(GetSaveDataSizeFromString(&saveSize,rsf->SystemControlInfo.SaveDataSize,"EXHEADER")) + return EXHDR_BAD_RSF_OPT; + u64_to_u8(systemInfo->savedataSize, saveSize, LE); } + else + u64_to_u8(systemInfo->savedataSize,0,LE); + /* Jump Id */ - if(rsf->SystemControlInfo.JumpId){ - u64 JumpId = strtoull(rsf->SystemControlInfo.JumpId,NULL,0); - u64_to_u8(SystemInfo->jumpId,JumpId,LE); - } + if(rsf->SystemControlInfo.JumpId) + u64_to_u8(systemInfo->jumpId, strtoull(rsf->SystemControlInfo.JumpId,NULL,0), LE); + else{ - u64 JumpId = 0; - int result = GetProgramID(&JumpId,rsf,false); - if(result) return result; - u64_to_u8(SystemInfo->jumpId,JumpId,LE); + u64 jumpId = 0; + if(GetProgramID(&jumpId,rsf,false)) + return EXHDR_BAD_RSF_OPT; + u64_to_u8(systemInfo->jumpId,jumpId,LE); } return 0; } -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf, bool useAccessDescPreset) +int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { /* Program Id */ - u64 ProgramId = 0; - int result = GetProgramID(&ProgramId,rsf,true); - if(result) return result; - u64_to_u8(arm11->programId,ProgramId,LE); + u64 programId = 0; + if(GetProgramID(&programId,rsf,true)) + return EXHDR_BAD_RSF_OPT; + u64_to_u8(arm11->programId,programId,LE); - if(!useAccessDescPreset){ - /* Flags */ - result = SetARM11SystemLocalInfoFlags(arm11, rsf); - if(result) return result; + /* Flags */ + if(SetARM11SystemLocalInfoFlags(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; - /* Resource Limit Descriptors */ - result = SetARM11ResLimitDesc(arm11, rsf); - if(result) return result; - } + /* Resource Limit Descriptors */ + if(SetARM11ResLimitDesc(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; /* Storage Info */ - result = SetARM11StorageInfo(arm11, rsf); - if(result) return result; + if(SetARM11StorageInfo(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; - if(!useAccessDescPreset){ - /* Service Access Control */ - result = SetARM11ServiceAccessControl(arm11, rsf); - if(result) return result; + /* Service Access Control */ + if(SetARM11ServiceAccessControl(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; - /* Resource Limit Category */ - if(rsf->AccessControlInfo.ResourceLimitCategory){ - if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"application") == 0) arm11->resourceLimitCategory = resrc_limit_APPLICATION; - else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"sysapplet") == 0) arm11->resourceLimitCategory = resrc_limit_SYS_APPLET; - else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"libapplet") == 0) arm11->resourceLimitCategory = resrc_limit_LIB_APPLET; - else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"other") == 0) arm11->resourceLimitCategory = resrc_limit_OTHER; - } + /* Resource Limit Category */ + if(rsf->AccessControlInfo.ResourceLimitCategory){ + if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"application") == 0) arm11->resourceLimitCategory = resrc_limit_APPLICATION; + else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"sysapplet") == 0) arm11->resourceLimitCategory = resrc_limit_SYS_APPLET; + else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"libapplet") == 0) arm11->resourceLimitCategory = resrc_limit_LIB_APPLET; + else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"other") == 0) arm11->resourceLimitCategory = resrc_limit_OTHER; } + + /* Finish */ + return 0; +} + +int get_ExHeaderARM11SystemLocalInfoLimited(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +{ + /* Program Id */ + u64 programId = 0; + if(GetProgramID(&programId,rsf,true)) + return EXHDR_BAD_RSF_OPT; + u64_to_u8(arm11->programId,programId,LE); + + /* Storage Info */ + if(SetARM11StorageInfo(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; + /* Finish */ return 0; } @@ -296,72 +310,69 @@ int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { /* Core Version */ - if(rsf->AccessControlInfo.CoreVersion){ - u32 Version = strtoul(rsf->AccessControlInfo.CoreVersion,NULL,0); - u32_to_u8(arm11->coreVersion,Version,LE); - } + if(rsf->AccessControlInfo.CoreVersion) + u32_to_u8(arm11->coreVersion,strtoul(rsf->AccessControlInfo.CoreVersion,NULL,0),LE); else{ ErrorParamNotFound("AccessControlInfo/CoreVersion"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } /* Flag */ - u8 AffinityMask = 0; - u8 IdealProcessor = 0; - u8 SystemMode = 0; + u8 affinityMask = 0; + u8 idealProcessor = 0; + u8 systemMode = 0; + if(rsf->AccessControlInfo.AffinityMask){ - AffinityMask = strtol(rsf->AccessControlInfo.AffinityMask,NULL,0); - if(AffinityMask > 1){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected AffinityMask: %d. Expected range: 0x0 - 0x1\n",AffinityMask); - return EXHDR_BAD_YAML_OPT; + affinityMask = strtol(rsf->AccessControlInfo.AffinityMask,NULL,0); + if(affinityMask > 1){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected AffinityMask: %d. Expected range: 0x0 - 0x1\n",affinityMask); + return EXHDR_BAD_RSF_OPT; } } if(rsf->AccessControlInfo.IdealProcessor){ - IdealProcessor = strtol(rsf->AccessControlInfo.IdealProcessor,NULL,0); - if(IdealProcessor > 1){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected IdealProcessor: %d. Expected range: 0x0 - 0x1\n",IdealProcessor); - return EXHDR_BAD_YAML_OPT; + idealProcessor = strtol(rsf->AccessControlInfo.IdealProcessor,NULL,0); + if(idealProcessor > 1){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected IdealProcessor: %d. Expected range: 0x0 - 0x1\n",idealProcessor); + return EXHDR_BAD_RSF_OPT; } } if(rsf->AccessControlInfo.SystemMode){ - SystemMode = strtol(rsf->AccessControlInfo.SystemMode,NULL,0); - if(SystemMode > 15){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected SystemMode: 0x%x. Expected range: 0x0 - 0xf\n",SystemMode); - return EXHDR_BAD_YAML_OPT; + systemMode = strtol(rsf->AccessControlInfo.SystemMode,NULL,0); + if(systemMode > 15){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected SystemMode: 0x%x. Expected range: 0x0 - 0xf\n",systemMode); + return EXHDR_BAD_RSF_OPT; } } - arm11->flag = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); + arm11->flag = (u8)(systemMode << 4 | affinityMask << 2 | idealProcessor); /* Thread Priority */ if(rsf->AccessControlInfo.Priority){ - u8 Priority = strtoul(rsf->AccessControlInfo.Priority,NULL,0); - int ProccessType = 0; - GetAppType(&ProccessType,rsf); - if(ProccessType == processtype_APPLICATION || ProccessType == processtype_DEFAULT){ - Priority += 32; + u8 priority = strtoul(rsf->AccessControlInfo.Priority,NULL,0); + if(GetAppType(rsf) == processtype_APPLICATION) + priority += 32; + if(priority > 127){ + fprintf(stderr,"[EXHEADER ERROR] Invalid Priority: %d\n",priority); + return EXHDR_BAD_RSF_OPT; } - if(Priority > 127){ - fprintf(stderr,"[EXHEADER ERROR] Invalid Priority: %d\n",Priority); - return EXHDR_BAD_YAML_OPT; - } - arm11->priority = Priority; + arm11->priority = priority; } else{ ErrorParamNotFound("AccessControlInfo/Priority"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } return 0; } -int GetAppType(int *AppType, rsf_settings *rsf) -{ - *AppType = processtype_DEFAULT; +int GetAppType(rsf_settings *rsf) +{ if(rsf->SystemControlInfo.AppType){ - if(strcasecmp(rsf->SystemControlInfo.AppType,"application") == 0) *AppType = processtype_APPLICATION; - else if(strcasecmp(rsf->SystemControlInfo.AppType,"system") == 0) *AppType = processtype_SYSTEM; + if(strcasecmp(rsf->SystemControlInfo.AppType,"application") == 0) + return processtype_APPLICATION; + else if(strcasecmp(rsf->SystemControlInfo.AppType,"system") == 0) + return processtype_SYSTEM; } - return 0; + return processtype_APPLICATION; } int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) @@ -381,16 +392,15 @@ int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(rsf->AccessControlInfo.UseExtendedSaveDataAccessControl || rsf->AccessControlInfo.AccessibleSaveDataIds){ + if(rsf->AccessControlInfo.AccessibleSaveDataIds){ /* Accessible SaveData IDs */ if(!CheckCondiditionsForNewAccessibleSaveDataIds(rsf)) - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; SetARM11StorageInfoAccessibleSaveDataIds(arm11,rsf); } else{ /* Extdata Id */ - int ret = SetARM11StorageInfoExtSaveDataId(arm11,rsf); - if(ret) return ret; + SetARM11StorageInfoExtSaveDataId(arm11,rsf); /* OtherUserSaveData */ SetARM11StorageInfoOtherUserSaveData(arm11,rsf); } @@ -399,172 +409,142 @@ int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings SetARM11StorageInfoSystemSaveDataId(arm11,rsf); /* FileSystem Access Info */ - u32 AccessInfo = 0; + return SetARM11StorageInfoFsAccessInfo(arm11,rsf); +} + +int SetARM11StorageInfoFsAccessInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +{ + u32 accessInfo = 0; for(int i = 0; i < rsf->AccessControlInfo.FileSystemAccessNum; i++){ if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategorySystemApplication") == 0) - AccessInfo |= fsaccess_CATEGORY_SYSTEM_APPLICATION; + accessInfo |= fsaccess_CATEGORY_SYSTEM_APPLICATION; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategoryHardwareCheck") == 0) - AccessInfo |= fsaccess_CATEGORY_HARDWARE_CHECK; + accessInfo |= fsaccess_CATEGORY_HARDWARE_CHECK; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategoryFileSystemTool") == 0) - AccessInfo |= fsaccess_CATEGORY_FILE_SYSTEM_TOOL; + accessInfo |= fsaccess_CATEGORY_FILE_SYSTEM_TOOL; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Debug") == 0) - AccessInfo |= fsaccess_DEBUG; + accessInfo |= fsaccess_DEBUG; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"TwlCardBackup") == 0) - AccessInfo |= fsaccess_TWL_CARD_BACKUP; + accessInfo |= fsaccess_TWL_CARD_BACKUP; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"TwlNandData") == 0) - AccessInfo |= fsaccess_TWL_NAND_DATA; + accessInfo |= fsaccess_TWL_NAND_DATA; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Boss") == 0) - AccessInfo |= fsaccess_BOSS; + accessInfo |= fsaccess_BOSS; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - AccessInfo |= fsaccess_DIRECT_SDMC; + accessInfo |= fsaccess_DIRECT_SDMC; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Core") == 0) - AccessInfo |= fsaccess_CORE; + accessInfo |= fsaccess_CORE; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CtrNandRo") == 0) - AccessInfo |= fsaccess_CTR_NAND_RO; + accessInfo |= fsaccess_CTR_NAND_RO; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CtrNandRw") == 0) - AccessInfo |= fsaccess_CTR_NAND_RW; + accessInfo |= fsaccess_CTR_NAND_RW; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CtrNandRoWrite") == 0) - AccessInfo |= fsaccess_CTR_NAND_RO_WRITE; + accessInfo |= fsaccess_CTR_NAND_RO_WRITE; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategorySystemSettings") == 0) - AccessInfo |= fsaccess_CATEGORY_SYSTEM_SETTINGS; + accessInfo |= fsaccess_CATEGORY_SYSTEM_SETTINGS; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CardBoard") == 0) - AccessInfo |= fsaccess_CARD_BOARD; + accessInfo |= fsaccess_CARD_BOARD; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"ExportImportIvs") == 0) - AccessInfo |= fsaccess_EXPORT_IMPORT_IVS; + accessInfo |= fsaccess_EXPORT_IMPORT_IVS; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"DirectSdmcWrite") == 0) - AccessInfo |= fsaccess_DIRECT_SDMC_WRITE; + accessInfo |= fsaccess_DIRECT_SDMC_WRITE; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"SwitchCleanup") == 0) - AccessInfo |= fsaccess_SWITCH_CLEANUP; + accessInfo |= fsaccess_SWITCH_CLEANUP; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"SaveDataMove") == 0) - AccessInfo |= fsaccess_SAVE_DATA_MOVE; + accessInfo |= fsaccess_SAVE_DATA_MOVE; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Shop") == 0) - AccessInfo |= fsaccess_SHOP; + accessInfo |= fsaccess_SHOP; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Shell") == 0) - AccessInfo |= fsaccess_SHELL; + accessInfo |= fsaccess_SHELL; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategoryHomeMenu") == 0) - AccessInfo |= fsaccess_CATEGORY_HOME_MENU; + accessInfo |= fsaccess_CATEGORY_HOME_MENU; else{ fprintf(stderr,"[EXHEADER ERROR] Invalid FileSystemAccess Name: \"%s\"\n",rsf->AccessControlInfo.FileSystemAccess[i]); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } } - u32_to_u8(arm11->storageInfo.accessInfo,AccessInfo,LE); + u32_to_u8(arm11->storageInfo.accessInfo,accessInfo,LE); + return 0; } -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +void SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(rsf->AccessControlInfo.SystemSaveDataId1){ - u32 SaveId = strtoul(rsf->AccessControlInfo.SystemSaveDataId1,NULL,0); - u32_to_u8(arm11->storageInfo.systemSavedataId,SaveId,LE); - } - if(rsf->AccessControlInfo.SystemSaveDataId2){ - u32 SaveId = strtoul(rsf->AccessControlInfo.SystemSaveDataId2,NULL,0); - u32_to_u8(&arm11->storageInfo.systemSavedataId[4],SaveId,LE); - } - return 0; + if(rsf->AccessControlInfo.SystemSaveDataId1) + u32_to_u8(arm11->storageInfo.systemSavedataId[0], strtoul(rsf->AccessControlInfo.SystemSaveDataId1,NULL,0), LE); + + if(rsf->AccessControlInfo.SystemSaveDataId2) + u32_to_u8(arm11->storageInfo.systemSavedataId[1], strtoul(rsf->AccessControlInfo.SystemSaveDataId2,NULL,0), LE); } -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +void SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(rsf->AccessControlInfo.ExtSaveDataId){ - if(!rsf->AccessControlInfo.UseExtSaveData){ - fprintf(stderr,"[EXHEADER ERROR] Failed to set ExtSaveDataId. UseExtSaveData must be true.\n"); - return EXHDR_BAD_YAML_OPT; - } - u64 ExtdataId = strtoull(rsf->AccessControlInfo.ExtSaveDataId,NULL,0); - u64_to_u8(arm11->storageInfo.extSavedataId,ExtdataId,LE); - } - return 0; + if(rsf->AccessControlInfo.ExtSaveDataId) + u64_to_u8(arm11->storageInfo.extSavedataId, strtoull(rsf->AccessControlInfo.ExtSaveDataId,NULL,0), LE); } -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +void SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - u64 Value = 0; + u64 value = 0; if(rsf->AccessControlInfo.OtherUserSaveDataId1) - Value = 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0); - Value = Value << 20; + value = 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0); + value = value << 20; if(rsf->AccessControlInfo.OtherUserSaveDataId2) - Value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0); - Value = Value << 20; + value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0); + value = value << 20; if(rsf->AccessControlInfo.OtherUserSaveDataId3) - Value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0); + value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0); /* UseOtherVariationSaveData Flag */ if(rsf->AccessControlInfo.UseOtherVariationSaveData) - Value |= 0x1000000000000000; + value |= 0x1000000000000000; - u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,Value,LE); - return 0; + u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,value,LE); } bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *rsf) { - if(!rsf->AccessControlInfo.UseExtendedSaveDataAccessControl){ - if(rsf->AccessControlInfo.AccessibleSaveDataIds) - fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds is unavailable if UseExtendedSaveDataAccessControl is false.\n"); - return false; - } - - /* - if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum == 0){ - fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds must be specified if UseExtendedSaveDataAccessControl is true.\n"); - return false; - } - */ - if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum > 6){ fprintf(stderr,"[EXHEADER ERROR] Too many UniqueId in \"AccessibleSaveDataIds\".\n"); return false; } - - if(rsf->AccessControlInfo.UseExtSaveData){ - fprintf(stderr,"[EXHEADER ERROR] UseExtSaveData must be false if AccessibleSaveDataIds is specified.\n"); - return false; - } if (rsf->AccessControlInfo.ExtSaveDataId){ fprintf(stderr,"[EXHEADER ERROR] ExtSaveDataId is unavailable if AccessibleSaveDataIds is specified.\n"); return false; } - if (rsf->AccessControlInfo.OtherUserSaveDataId1){ - if(strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId1 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } + if (rsf->AccessControlInfo.OtherUserSaveDataId1 && strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0) > 0){ + fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId1 must be 0 if AccessibleSaveDataIds is specified.\n"); + return false; } - if (rsf->AccessControlInfo.OtherUserSaveDataId2){ - if(strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId2 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } + if (rsf->AccessControlInfo.OtherUserSaveDataId2 && strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0) > 0){ + fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId2 must be 0 if AccessibleSaveDataIds is specified.\n"); + return false; } - if (rsf->AccessControlInfo.OtherUserSaveDataId3){ - if(strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId3 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } + if (rsf->AccessControlInfo.OtherUserSaveDataId3 && strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0) > 0){ + fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId3 must be 0 if AccessibleSaveDataIds is specified.\n"); + return false; } return true; } -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +void SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - u64 RegionExtSaveDataId = 0; - u64 RegionOtherUseSaveData = 0; + u64 region_ExtSaveDataId = 0; + u64 region_OtherUseSaveData = 0; if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum > 0){ - u32 Max = rsf->AccessControlInfo.AccessibleSaveDataIdsNum < 3 ? rsf->AccessControlInfo.AccessibleSaveDataIdsNum : 3; - for(int i = 0; i < Max; i++){ - u32 UniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); - RegionOtherUseSaveData = RegionOtherUseSaveData << 20; - RegionOtherUseSaveData |= UniqueID; + u32 max = rsf->AccessControlInfo.AccessibleSaveDataIdsNum < 3 ? rsf->AccessControlInfo.AccessibleSaveDataIdsNum : 3; + for(int i = 0; i < max; i++){ + u32 uniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); + region_OtherUseSaveData = region_OtherUseSaveData << 20; + region_OtherUseSaveData |= uniqueID; } } if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum > 3){ for(int i = 3; i < rsf->AccessControlInfo.AccessibleSaveDataIdsNum; i++){ - u32 UniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); - RegionExtSaveDataId = RegionExtSaveDataId << 20; - RegionExtSaveDataId |= UniqueID; + u32 uniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); + region_ExtSaveDataId = region_ExtSaveDataId << 20; + region_ExtSaveDataId |= uniqueID; } } @@ -572,11 +552,10 @@ int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities /* UseOtherVariationSaveData Flag */ if(rsf->AccessControlInfo.UseOtherVariationSaveData) - RegionOtherUseSaveData |= 0x1000000000000000; + region_OtherUseSaveData |= 0x1000000000000000; - u64_to_u8(arm11->storageInfo.extSavedataId,RegionExtSaveDataId,LE); - u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,RegionOtherUseSaveData,LE); - return 0; + u64_to_u8(arm11->storageInfo.extSavedataId,region_ExtSaveDataId,LE); + u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,region_OtherUseSaveData,LE); } int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) @@ -584,20 +563,19 @@ int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_ if(rsf->AccessControlInfo.ServiceAccessControl){ if(rsf->AccessControlInfo.ServiceAccessControlNum > 32){ fprintf(stderr,"[EXHEADER ERROR] Too Many Service Names, maximum is 32\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } for(int i = 0; i < rsf->AccessControlInfo.ServiceAccessControlNum; i++){ - int svc_handle_len = strlen(rsf->AccessControlInfo.ServiceAccessControl[i]); - if(svc_handle_len > 8){ + if(strlen(rsf->AccessControlInfo.ServiceAccessControl[i]) > 8){ fprintf(stderr,"[EXHEADER ERROR] Service Name: \"%s\" is too long\n",rsf->AccessControlInfo.ServiceAccessControl[i]); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } - memcpy(arm11->serviceAccessControl[i],rsf->AccessControlInfo.ServiceAccessControl[i],svc_handle_len); + strncpy((char*)arm11->serviceAccessControl[i],rsf->AccessControlInfo.ServiceAccessControl[i],8); } } else{ ErrorParamNotFound("AccessControlInfo/ServiceAccessControl"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } return 0; } @@ -605,87 +583,89 @@ int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_ int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *rsf) { int result = 0; + u16 totalDesc, descIndex; ARM11KernelCapabilityDescriptor desc[6]; - memset(&desc,0,sizeof(ARM11KernelCapabilityDescriptor)*6); + clrmem(&desc,sizeof(ARM11KernelCapabilityDescriptor)*6); /* Get Descriptors */ - result = SetARM11KernelDescSysCallControl(&desc[0],rsf); - if(result) goto finish; - result = SetARM11KernelDescInteruptNumList(&desc[1],rsf); - if(result) goto finish; - result = SetARM11KernelDescAddressMapping(&desc[2],rsf); - if(result) goto finish; - result = SetARM11KernelDescOtherCapabilities(&desc[3],rsf); - if(result) goto finish; - result = SetARM11KernelDescHandleTableSize(&desc[4],rsf); - if(result) goto finish; - result = SetARM11KernelDescReleaseKernelVersion(&desc[5],rsf); + if((result = SetARM11KernelDescSysCallControl(&desc[0],rsf))) + goto finish; + if((result = SetARM11KernelDescInteruptNumList(&desc[1],rsf))) + goto finish; + if((result = SetARM11KernelDescAddressMapping(&desc[2],rsf))) + goto finish; + if((result = SetARM11KernelDescOtherCapabilities(&desc[3],rsf))) + goto finish; + if((result = SetARM11KernelDescHandleTableSize(&desc[4],rsf))) + goto finish; + if((result = SetARM11KernelDescReleaseKernelVersion(&desc[5],rsf))) + goto finish; /* Write Descriptors To Exheader */ - u16 TotalDesc = 0; - for(int i = 0; i < 6; i++){ - TotalDesc += desc[i].num; - } - if(TotalDesc >= 28){ + totalDesc = 0; + for(int i = 0; i < 6; i++) + totalDesc += desc[i].num; + + if(totalDesc >= 28){ fprintf(stderr,"[EXHEADER ERROR] Too many Kernel Capabilities.\n"); - result = EXHDR_BAD_YAML_OPT; + result = EXHDR_BAD_RSF_OPT; goto finish; } - u16 DescIndex = 0; + + descIndex = 0; for(int i = 0; i < 6; i++){ for(int j = 0; j < desc[i].num; j++){ - u32_to_u8(arm11->descriptors[DescIndex],desc[i].Data[j],LE); - DescIndex++; + u32_to_u8(arm11->descriptors[descIndex],desc[i].data[j],LE); + descIndex++; } } /* Fill Remaining Descriptors with 0xffffffff */ - for(int i = DescIndex; i < 28; i++){ + for(int i = descIndex; i < 28; i++) u32_to_u8(arm11->descriptors[i],0xffffffff,LE); - } finish: - for(int i = 0; i < 6; i++){ - free(desc[i].Data); - } + for(int i = 0; i < 6; i++) + free(desc[i].data); return result; } int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { int ret = 0; + u16 activeSysCallDesc, sysCallDescPos; // Create Temporary Descriptor ARM11KernelCapabilityDescriptor tmp; - memset(&tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); + clrmem(&tmp,sizeof(ARM11KernelCapabilityDescriptor)); AllocateARM11KernelDescMemory(&tmp,8); for(int i = 0; i < 8; i++) SetARM11KernelDescValue(&tmp,i,desc_SysCallControl | (i << 24)); // Get SysCalls - ret = GetARM11SysCalls(&tmp,rsf); - if(ret) goto finish; + if((ret = GetARM11SysCalls(&tmp,rsf))) + goto finish; // Count Active Syscall Descs - u16 ActiveSysCallDesc = 0; + activeSysCallDesc = 0; for(int i = 0; i < 8; i++) - if((tmp.Data[i] & 0x00ffffff) != 0) - ActiveSysCallDesc++; + if((tmp.data[i] & 0x00ffffff) != 0) + activeSysCallDesc++; // Transfer Active Syscall Descs to out Descriptor - AllocateARM11KernelDescMemory(desc,ActiveSysCallDesc); - u16 SysCallDescPos = 0; + AllocateARM11KernelDescMemory(desc,activeSysCallDesc); + sysCallDescPos = 0; for(int i = 0; i < 8; i++){ - if((tmp.Data[i] & 0x00ffffff) != 0) { - SetARM11KernelDescValue(desc,SysCallDescPos,tmp.Data[i]); - SysCallDescPos++; + if((tmp.data[i] & 0x00ffffff) != 0) { + SetARM11KernelDescValue(desc,sysCallDescPos,tmp.data[i]); + sysCallDescPos++; } } finish: // Free data in Temporary Descriptor - free(tmp.Data); + free(tmp.data); return ret; } @@ -693,38 +673,39 @@ int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { if(!rsf->AccessControlInfo.SystemCallAccess){ ErrorParamNotFound("AccessControlInfo/SystemCallAccess"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } for(int i = 0; i < rsf->AccessControlInfo.SystemCallAccessNum; i++){ - int SysCall = strtoul(rsf->AccessControlInfo.SystemCallAccess[i],NULL,0); - if(SysCall > 184){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected Syscall: 0x%02x. Expected Range: 0x00 - 0xB8\n",SysCall); - return EXHDR_BAD_YAML_OPT; + int sysCall = strtoul(rsf->AccessControlInfo.SystemCallAccess[i],NULL,0); + if(sysCall > 184){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected Syscall: 0x%02x. Expected Range: 0x00 - 0xB8\n",sysCall); + return EXHDR_BAD_RSF_OPT; } - EnableSystemCall(desc,SysCall); + EnableSystemCall(desc,sysCall); } return 0; } -void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall) +void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int sysCall) { - int num = SysCall / 24; - int num1 = SysCall % 24; - desc->Data[num] |= 1 << (num1 & 31); + int num = sysCall / 24; + int num1 = sysCall % 24; + desc->data[num] |= 1 << (num1 & 31); } -void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall) +void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int sysCall) { - int num = SysCall / 24; - int num1 = SysCall % 24; - desc->Data[num] = desc->Data[num] & ~(1 << (num1 & 31)); + int num = sysCall / 24; + int num1 = sysCall % 24; + desc->data[num] = desc->data[num] & ~(1 << (num1 & 31)); } int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { int ret = 0; - + u16 activeInteruptDesc, interuptDescPos; + // Create Temporary Descriptor ARM11KernelCapabilityDescriptor tmp; memset(&tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); @@ -736,43 +717,43 @@ int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf if(ret) goto finish; // Count Active Interupt Descs - u16 ActiveInteruptDesc = 0; + activeInteruptDesc = 0; for(int i = 0; i < 8; i++) - if(tmp.Data[i]) - ActiveInteruptDesc++; + if(tmp.data[i]) + activeInteruptDesc++; // Transfer Active Interupt Descs to output Descriptor - AllocateARM11KernelDescMemory(desc,ActiveInteruptDesc); - u16 InteruptDescPos = 0; + AllocateARM11KernelDescMemory(desc,activeInteruptDesc); + interuptDescPos = 0; for(int i = 0; i < 8; i++){ - if(tmp.Data[i]) { - SetARM11KernelDescValue(desc,InteruptDescPos,(tmp.Data[i] & 0x0fffffff) | desc_InteruptNumList); - InteruptDescPos++; + if(tmp.data[i]) { + SetARM11KernelDescValue(desc,interuptDescPos,(tmp.data[i] & 0x0fffffff) | desc_InteruptNumList); + interuptDescPos++; } } finish: // Free data in Temporary Descriptor - free(tmp.Data); + free(tmp.data); return ret; } int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - if(!rsf->AccessControlInfo.InterruptNumbers){ + if(!rsf->AccessControlInfo.InterruptNumbers) return 0; - } + if(rsf->AccessControlInfo.InterruptNumbersNum > 32){ fprintf(stderr,"[EXHEADER ERROR] Too many Interupts. Maximum is 32\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } for(int i = 0; i < rsf->AccessControlInfo.InterruptNumbersNum; i++){ - int Interrupt = strtoul(rsf->AccessControlInfo.InterruptNumbers[i],NULL,0); - if(Interrupt > 0x7f){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected Interupt: 0x%02x. Expected Range: 0x00 - 0x7f\n",Interrupt); - return EXHDR_BAD_YAML_OPT; + int interrupt = strtoul(rsf->AccessControlInfo.InterruptNumbers[i],NULL,0); + if(interrupt > 0x7f){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected Interupt: 0x%02x. Expected Range: 0x00 - 0x7f\n",interrupt); + return EXHDR_BAD_RSF_OPT; } - EnableInterupt(desc,Interrupt,i); + EnableInterupt(desc,interrupt,i); } return 0; @@ -781,44 +762,46 @@ int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) void EnableInterupt(ARM11KernelCapabilityDescriptor *desc, int Interrupt, int i) { int num = i / 4; - if(num*4 == i) desc->Data[num] |= 0xffffffff; - desc->Data[num] = desc->Data[num] << 7; - desc->Data[num] |= Interrupt; + if(num*4 == i) desc->data[num] |= 0xffffffff; + desc->data[num] = desc->data[num] << 7; + desc->data[num] |= Interrupt; } int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { int ret = 0; + u16 memMapDescPos; + // Create Temporary Descriptors ARM11KernelCapabilityDescriptor io_tmp; - memset(&io_tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); + clrmem(&io_tmp,sizeof(ARM11KernelCapabilityDescriptor)); ARM11KernelCapabilityDescriptor static_tmp; - memset(&static_tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); + clrmem(&static_tmp,sizeof(ARM11KernelCapabilityDescriptor)); // Getting IO Mapping - ret = GetARM11IOMappings(&io_tmp,rsf); - if(ret) goto finish; + if((ret = GetARM11IOMappings(&io_tmp,rsf))) + goto finish; // Getting Static Mapping - ret = GetARM11StaticMappings(&static_tmp,rsf); - if(ret) goto finish; + if((ret = GetARM11StaticMappings(&static_tmp,rsf))) + goto finish; // Creating Output Descriptor and Combining the two MemMap Descriptors AllocateARM11KernelDescMemory(desc,io_tmp.num+static_tmp.num); - u16 MemMapDescPos = 0; + memMapDescPos = 0; for(int i = 0; i < io_tmp.num; i++){ - SetARM11KernelDescValue(desc,MemMapDescPos,io_tmp.Data[i]); - MemMapDescPos++; + SetARM11KernelDescValue(desc,memMapDescPos,io_tmp.data[i]); + memMapDescPos++; } for(int i = 0; i < static_tmp.num; i++){ - SetARM11KernelDescValue(desc,MemMapDescPos,static_tmp.Data[i]); - MemMapDescPos++; + SetARM11KernelDescValue(desc,memMapDescPos,static_tmp.data[i]); + memMapDescPos++; } finish: - free(io_tmp.Data); - free(static_tmp.Data); + free(io_tmp.data); + free(static_tmp.data); return ret; } @@ -826,9 +809,10 @@ int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { if(!rsf->AccessControlInfo.IORegisterMapping) return 0; - + AllocateARM11KernelDescMemory(desc,rsf->AccessControlInfo.IORegisterMappingNum*2); - u16 DescUsed = 0; + u16 descUsed = 0; + for(int i = 0; i < rsf->AccessControlInfo.IORegisterMappingNum; i++){ if(strlen(rsf->AccessControlInfo.IORegisterMapping[i])){ // Parse Address String @@ -845,38 +829,36 @@ int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) u32 AddressStart = strtoul(AddressStartStr,NULL,16); if(!IsStartAddress(AddressStart)){ fprintf(stderr,"[EXHEADER ERROR] Address 0x%x is not valid mapping start address.\n",AddressStart); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } if(!AddressEndStr){ // No End Addr Was Specified - SetARM11KernelDescValue(desc,DescUsed,GetIOMappingDesc(AddressStart)); - DescUsed++; - goto skip; + SetARM11KernelDescValue(desc,descUsed,GetIOMappingDesc(AddressStart)); + descUsed++; + continue; } u32 AddressEnd = strtoul(AddressEndStr,NULL,16); if(!IsEndAddress(AddressEnd)){ fprintf(stderr,"[EXHEADER ERROR] Address 0x%x is not valid mapping end address.\n",AddressEnd); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } u32 DescStartAddr = GetStaticMappingDesc(AddressStart,false); u32 DescEndAddr = GetStaticMappingDesc(AddressEnd+0x1000,false); if(DescStartAddr != DescEndAddr){ - SetARM11KernelDescValue(desc,DescUsed,DescStartAddr); - SetARM11KernelDescValue(desc,DescUsed+1,DescEndAddr); - DescUsed += 2; - goto skip; + SetARM11KernelDescValue(desc,descUsed,DescStartAddr); + SetARM11KernelDescValue(desc,descUsed+1,DescEndAddr); + descUsed += 2; + continue; } else{ - SetARM11KernelDescValue(desc,DescUsed,GetIOMappingDesc(AddressStart)); - DescUsed++; - goto skip; + SetARM11KernelDescValue(desc,descUsed,GetIOMappingDesc(AddressStart)); + descUsed++; + continue; } } - - skip: ; } - desc->num = DescUsed; + desc->num = descUsed; return 0; } @@ -886,7 +868,7 @@ int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings * return 0; AllocateARM11KernelDescMemory(desc,rsf->AccessControlInfo.MemoryMappingNum*2); - u16 DescUsed = 0; + u16 descUsed = 0; for(int i = 0; i < rsf->AccessControlInfo.MemoryMappingNum; i++){ if(strlen(rsf->AccessControlInfo.MemoryMapping[i])){ char *AddressStartStr = rsf->AccessControlInfo.MemoryMapping[i]; @@ -908,115 +890,113 @@ int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings * u32 AddressStart = strtoul(AddressStartStr,NULL,16); if(!IsStartAddress(AddressStart)){ fprintf(stderr,"[EXHEADER ERROR] Address 0x%x (%s) is not valid mapping start address.\n",AddressStart,AddressStartStr); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } if(!AddressEndStr){ // No End Addr Was Specified - SetARM11KernelDescValue(desc,DescUsed,GetStaticMappingDesc(AddressStart,IsRO)); - SetARM11KernelDescValue(desc,DescUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); - DescUsed += 2; - goto skip; + SetARM11KernelDescValue(desc,descUsed,GetStaticMappingDesc(AddressStart,IsRO)); + SetARM11KernelDescValue(desc,descUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); + descUsed += 2; + continue; } u32 AddressEnd = strtoul(AddressEndStr,NULL,16); if(!IsEndAddress(AddressEnd)){ fprintf(stderr,"[EXHEADER ERROR] Address 0x%x (%s) is not valid mapping end address.\n",AddressEnd,AddressEndStr); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } u32 DescStartAddr = GetStaticMappingDesc(AddressStart,IsRO); u32 DescEndAddr = GetStaticMappingDesc(AddressEnd+0x1000,true); if(DescStartAddr != DescEndAddr){ - SetARM11KernelDescValue(desc,DescUsed,DescStartAddr); - SetARM11KernelDescValue(desc,DescUsed+1,DescEndAddr); - DescUsed += 2; - goto skip; + SetARM11KernelDescValue(desc,descUsed,DescStartAddr); + SetARM11KernelDescValue(desc,descUsed+1,DescEndAddr); + descUsed += 2; + continue; } else{ - SetARM11KernelDescValue(desc,DescUsed,GetStaticMappingDesc(AddressStart,IsRO)); - SetARM11KernelDescValue(desc,DescUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); - DescUsed += 2; - goto skip; + SetARM11KernelDescValue(desc,descUsed,GetStaticMappingDesc(AddressStart,IsRO)); + SetARM11KernelDescValue(desc,descUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); + descUsed += 2; + continue; } } - - skip: ; } - desc->num = DescUsed; + desc->num = descUsed; return 0; } -bool IsEndAddress(u32 Address) +bool IsEndAddress(u32 address) { - return (Address & 0x0fff) == 0x0fff; + return (address & 0x0fff) == 0x0fff; } -bool IsStartAddress(u32 Address) +bool IsStartAddress(u32 address) { - return (Address & 0x0fff) == 0; + return (address & 0x0fff) == 0; } -u32 GetIOMappingDesc(u32 Address) +u32 GetIOMappingDesc(u32 address) { - return GetMappingDesc(Address,0xFFE,0xC,false); + return GetMappingDesc(address,0xFFE,0xC,false); } -u32 GetStaticMappingDesc(u32 Address, bool IsReadOnly) +u32 GetStaticMappingDesc(u32 address, bool IsReadOnly) { - return GetMappingDesc(Address,0x7FC,0xB,IsReadOnly); + return GetMappingDesc(address,0x7FC,0xB,IsReadOnly); } -u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO) +u32 GetMappingDesc(u32 address, u32 prefixVal, s32 numPrefixBits, bool IsRO) { - u32 PrefixMask = GetDescPrefixMask(numPrefixBits); - u32 PrefixBits = GetDescPrefixBits(numPrefixBits,PrefixVal); - u32 Desc = (Address >> 12 & ~PrefixMask) | PrefixBits; + u32 prefixMask = GetDescPrefixMask(numPrefixBits); + u32 prefixBits = GetDescPrefixBits(numPrefixBits,prefixVal); + u32 desc = (address >> 12 & ~prefixMask) | prefixBits; if (IsRO) - Desc |= 0x100000; - return Desc; + desc |= 0x100000; + return desc; } int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - u32 OtherCapabilities = 0; + u32 otherCapabilities = 0; + u32 memType = 0; if(!rsf->AccessControlInfo.DisableDebug) - OtherCapabilities |= othcap_PERMIT_DEBUG; + otherCapabilities |= othcap_PERMIT_DEBUG; if(rsf->AccessControlInfo.EnableForceDebug) - OtherCapabilities |= othcap_FORCE_DEBUG; + otherCapabilities |= othcap_FORCE_DEBUG; if(rsf->AccessControlInfo.CanUseNonAlphabetAndNumber) - OtherCapabilities |= othcap_CAN_USE_NON_ALPHABET_AND_NUMBER; + otherCapabilities |= othcap_CAN_USE_NON_ALPHABET_AND_NUMBER; if(rsf->AccessControlInfo.CanWriteSharedPage) - OtherCapabilities |= othcap_CAN_WRITE_SHARED_PAGE; + otherCapabilities |= othcap_CAN_WRITE_SHARED_PAGE; if(rsf->AccessControlInfo.CanUsePrivilegedPriority) - OtherCapabilities |= othcap_CAN_USE_PRIVILEGE_PRIORITY; + otherCapabilities |= othcap_CAN_USE_PRIVILEGE_PRIORITY; if(rsf->AccessControlInfo.PermitMainFunctionArgument) - OtherCapabilities |= othcap_PERMIT_MAIN_FUNCTION_ARGUMENT; + otherCapabilities |= othcap_PERMIT_MAIN_FUNCTION_ARGUMENT; if(rsf->AccessControlInfo.CanShareDeviceMemory) - OtherCapabilities |= othcap_CAN_SHARE_DEVICE_MEMORY; + otherCapabilities |= othcap_CAN_SHARE_DEVICE_MEMORY; if(rsf->AccessControlInfo.RunnableOnSleep) - OtherCapabilities |= othcap_RUNNABLE_ON_SLEEP; + otherCapabilities |= othcap_RUNNABLE_ON_SLEEP; if(rsf->AccessControlInfo.SpecialMemoryArrange) - OtherCapabilities |= othcap_SPECIAL_MEMORY_ARRANGE; + otherCapabilities |= othcap_SPECIAL_MEMORY_ARRANGE; if(rsf->AccessControlInfo.MemoryType){ - u32 MemType = 0; if(strcasecmp(rsf->AccessControlInfo.MemoryType,"application") == 0) - MemType = memtype_APPLICATION; + memType = memtype_APPLICATION; else if(strcasecmp(rsf->AccessControlInfo.MemoryType,"system") == 0) - MemType = memtype_SYSTEM; + memType = memtype_SYSTEM; else if(strcasecmp(rsf->AccessControlInfo.MemoryType,"base") == 0) - MemType = memtype_BASE; + memType = memtype_BASE; else{ fprintf(stderr,"[EXHEADER ERROR] Invalid memory type: \"%s\"\n",rsf->AccessControlInfo.MemoryType); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } - OtherCapabilities = (OtherCapabilities & 0xffffff0f) | MemType << 8; + otherCapabilities = (otherCapabilities & 0xfffff0ff) | (memType & 0xf) << 8; } - if(OtherCapabilities){ + if(otherCapabilities){ AllocateARM11KernelDescMemory(desc,1); SetARM11KernelDescBitmask(desc,desc_OtherCapabilities); - SetARM11KernelDescValue(desc,0,OtherCapabilities); + SetARM11KernelDescValue(desc,0,otherCapabilities); } return 0; } @@ -1024,18 +1004,18 @@ int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, r int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { if(rsf->AccessControlInfo.HandleTableSize){ - u16 HandleTableSize = strtoul(rsf->AccessControlInfo.HandleTableSize,NULL,0); - if(HandleTableSize > 1023){ + u16 handleTableSize = strtoul(rsf->AccessControlInfo.HandleTableSize,NULL,0); + if(handleTableSize > 1023){ fprintf(stderr,"[EXHEADER ERROR] Too large handle table size\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } AllocateARM11KernelDescMemory(desc,1); SetARM11KernelDescBitmask(desc,desc_HandleTableSize); - SetARM11KernelDescValue(desc,0,HandleTableSize); + SetARM11KernelDescValue(desc,0,handleTableSize); } else{ ErrorParamNotFound("AccessControlInfo/HandleTableSize"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } return 0; } @@ -1055,24 +1035,24 @@ int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc return 0; } -void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 Index, u32 Value) +void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 index, u32 value) { - if(Index >= desc->num) return; - desc->Data[Index] |= Value; + if(index >= desc->num) return; + desc->data[index] |= value; } -void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 Bitmask) +void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 bitmask) { for(int i = 0; i < desc->num; i++) - SetARM11KernelDescValue(desc,i,Bitmask); + SetARM11KernelDescValue(desc,i,bitmask); } -void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Num) +void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 num) { - if(Num == 0) return; - desc->num = Num; - desc->Data = malloc(sizeof(u32)*Num); - memset(desc->Data,0,sizeof(u32)*Num); + if(num == 0) return; + desc->num = num; + desc->data = malloc(sizeof(u32)*num); + clrmem(desc->data,sizeof(u32)*num); return; } @@ -1081,63 +1061,58 @@ u32 GetDescPrefixMask(int numPrefixBits) return (u32)(~((1 << (32 - (numPrefixBits & 31))) - 1)); } -u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal) +u32 GetDescPrefixBits(int numPrefixBits, u32 prefixVal) { - return PrefixVal << (32 - (numPrefixBits & 31)); + return prefixVal << (32 - (numPrefixBits & 31)); } int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *rsf) { - u32 Arm9AccessControl = 0; + u32 arm9AccessControl = 0; for(int i = 0; i < rsf->AccessControlInfo.IoAccessControlNum; i++){ if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountNand") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_NAND; + arm9AccessControl |= arm9cap_FS_MOUNT_NAND; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountNandRoWrite") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_NAND_RO_WRITE; + arm9AccessControl |= arm9cap_FS_MOUNT_NAND_RO_WRITE; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountTwln") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_TWLN; + arm9AccessControl |= arm9cap_FS_MOUNT_TWLN; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountWnand") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_WNAND; + arm9AccessControl |= arm9cap_FS_MOUNT_WNAND; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountCardSpi") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_CARD_SPI; + arm9AccessControl |= arm9cap_FS_MOUNT_CARD_SPI; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"UseSdif3") == 0) - Arm9AccessControl |= arm9cap_USE_SDIF3; + arm9AccessControl |= arm9cap_USE_SDIF3; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"CreateSeed") == 0) - Arm9AccessControl |= arm9cap_CREATE_SEED; + arm9AccessControl |= arm9cap_CREATE_SEED; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"UseCardSpi") == 0) - Arm9AccessControl |= arm9cap_USE_CARD_SPI; + arm9AccessControl |= arm9cap_USE_CARD_SPI; else{ fprintf(stderr,"[EXHEADER ERROR] Invalid IoAccessControl Name: \"%s\"\n",rsf->AccessControlInfo.IoAccessControl[i]); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } } for(int i = 0; i < rsf->AccessControlInfo.FileSystemAccessNum; i++){ if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - Arm9AccessControl |= arm9cap_USE_DIRECT_SDMC; + arm9AccessControl |= arm9cap_USE_DIRECT_SDMC; } if(rsf->Option.UseOnSD) - Arm9AccessControl |= arm9cap_SD_APPLICATION; + arm9AccessControl |= arm9cap_SD_APPLICATION; - u32_to_u8(arm9->descriptors,Arm9AccessControl,LE); + u32_to_u8(arm9->descriptors,arm9AccessControl,LE); - if(rsf->AccessControlInfo.DescVersion){ + if(rsf->AccessControlInfo.DescVersion) arm9->descriptors[15] = strtol(rsf->AccessControlInfo.DescVersion,NULL,0); - } else{ //ErrorParamNotFound("AccessControlInfo/DescVersion"); - //return EXHDR_BAD_YAML_OPT; + //return EXHDR_BAD_RSF_OPT; arm9->descriptors[15] = 2; // Makerom generates a desc version 2 anyway, so if not specified, it will be set to 2 } return 0; } - - - - /* Generic Exheader Errors */ void ErrorParamNotFound(char *string) { @@ -1222,14 +1197,14 @@ int GetSaveDataSizeFromString(u64 *out, char *string, char *moduleName) fprintf(stderr,"[%s ERROR] Invalid save data size format.\n",moduleName); else fprintf(stderr,"[ERROR] Invalid save data size format.\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } if((SaveDataSize & 65536) != 0){ if(moduleName) fprintf(stderr,"[%s ERROR] Save data size must be aligned to 64K.\n",moduleName); else fprintf(stderr,"[ERROR] Save data size must be aligned to 64K.\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } *out = SaveDataSize; return 0; @@ -1260,11 +1235,11 @@ int GetSaveDataSize_rsf(u64 *SaveDataSize, user_settings *usrset) } else{ fprintf(stderr,"[EXHEADER ERROR] Invalid save data size format.\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } if((*SaveDataSize & 65536) != 0){ fprintf(stderr,"[EXHEADER ERROR] Save data size must be aligned to 64K.\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } } else{ diff --git a/makerom/exheader.h b/makerom/exheader.h index ee1e2d4..d33639c 100644 --- a/makerom/exheader.h +++ b/makerom/exheader.h @@ -117,7 +117,7 @@ typedef struct typedef struct { u8 extSavedataId[8]; - u8 systemSavedataId[8]; + u8 systemSavedataId[2][4]; u8 storageAccessableUniqueIds[8]; u8 accessInfo[7]; u8 otherAttributes; @@ -140,7 +140,7 @@ typedef struct typedef struct { u16 num; - u32 *Data; + u32 *data; } ARM11KernelCapabilityDescriptor; typedef enum diff --git a/makerom/exheader_build.h b/makerom/exheader_build.h index f7fd894..4645c07 100644 --- a/makerom/exheader_build.h +++ b/makerom/exheader_build.h @@ -4,7 +4,7 @@ typedef enum { COMMON_HEADER_KEY_NOT_FOUND = -10, - EXHDR_BAD_YAML_OPT = -11, + EXHDR_BAD_RSF_OPT = -11, CANNOT_SIGN_ACCESSDESC = -12 } exheader_errors; diff --git a/makerom/keyset.c b/makerom/keyset.c index 66ebeff..eaa3116 100644 --- a/makerom/keyset.c +++ b/makerom/keyset.c @@ -170,6 +170,31 @@ int LoadKeysFromResources(keys_struct *keys) SetTikCert(keys,(u8*)xsC_ppki_cert); SetTmdCert(keys,(u8*)cpB_ppki_cert); } + else if(keys->keyset == pki_GATEWAY3DS){ + keys->keysetLoaded = true; + /* AES Keys */ + // CIA + if(keys->aes.currentCommonKey > 0xff) + SetCurrentCommonKey(keys,0); + + // NCCH + SetNormalKey(keys,(u8*)dev_fixed_ncch_key[0]); + SetSystemFixedKey(keys,(u8*)dev_fixed_ncch_key[0]); + + /* RSA Keys */ + // CIA + SetTIK_RsaKey(keys,(u8*)xsC_ppki_rsa_priv,(u8*)xsC_ppki_rsa_pub); + SetTMD_RsaKey(keys,(u8*)cpB_ppki_rsa_priv,(u8*)cpB_ppki_rsa_pub); + // CCI/CFA + Set_CCI_CFA_RsaKey(keys,(u8*)prod_ncsd_cfa_priv,(u8*)prod_ncsd_cfa_pub); + // CXI + SetAccessDesc_RsaKey(keys,(u8*)prod_acex_priv,(u8*)prod_acex_pub); + + /* Certs */ + SetCaCert(keys,(u8*)ca3_ppki_cert); + SetTikCert(keys,(u8*)xsC_ppki_cert); + SetTmdCert(keys,(u8*)cpB_ppki_cert); + } return 0; } diff --git a/makerom/keyset.h b/makerom/keyset.h index 9d6c0c6..e8c9230 100644 --- a/makerom/keyset.h +++ b/makerom/keyset.h @@ -26,6 +26,7 @@ typedef enum pki_DEVELOPMENT, pki_PRODUCTION, pki_CUSTOM, + pki_GATEWAY3DS } pki_keyset; typedef enum diff --git a/makerom/ncch.c b/makerom/ncch.c index 2fc5c0c..8f15f91 100644 --- a/makerom/ncch.c +++ b/makerom/ncch.c @@ -175,7 +175,7 @@ int GetBasicOptions(ncch_settings *ncchset, user_settings *usrset) ncchset->options.FreeProductCode = ncchset->rsfSet->Option.FreeProductCode; ncchset->options.IsCfa = (usrset->ncch.ncchType == CFA); ncchset->options.IsBuildingCodeSection = (usrset->ncch.elfPath != NULL); - ncchset->options.UseRomFS = ((ncchset->rsfSet->Rom.HostRoot && strlen(ncchset->rsfSet->Rom.HostRoot) > 0) || usrset->ncch.romfsPath); + ncchset->options.UseRomFS = ((ncchset->rsfSet->RomFs.RootPath && strlen(ncchset->rsfSet->RomFs.RootPath) > 0) || usrset->ncch.romfsPath); ncchset->options.useSecCrypto = usrset->ncch.useSecCrypto; ncchset->options.keyXID = usrset->ncch.keyXID; diff --git a/makerom/ncsd.c b/makerom/ncsd.c index 39d7036..23d7dfe 100644 --- a/makerom/ncsd.c +++ b/makerom/ncsd.c @@ -13,6 +13,8 @@ const int NCCH0_OFFSET = 0x4000; const int CCI_BLOCK_SIZE = 0x200; +const char MEDIA_SIZE_STR[10][6] = {"128MB","256MB","512MB","1GB","2GB","4GB","8GB","16GB","32GB"}; + void ImportCciSettings(cci_settings *set, user_settings *usrset); void FreeCciSettings(cci_settings *set); int ImportCciNcch(cci_settings *set); @@ -46,13 +48,13 @@ int build_CCI(user_settings *usrset) goto finish; } - if(CheckRomConfig(set)){ - result = CCI_CONFIG_FAIL; + if(GenCardInfoHdr(set)){ + result = GEN_HDR_FAIL; goto finish; } - if(GenCardInfoHdr(set)){ - result = GEN_HDR_FAIL; + if(CheckRomConfig(set)){ + result = CCI_CONFIG_FAIL; goto finish; } @@ -165,63 +167,6 @@ bool CanCiaBeCci(u64 titleId, u16 count, tmd_content_chunk *content) return true; } -void GenRsfInputFromTmd(tmd_hdr *tmd, tmd_content_chunk *info, cci_settings *set) -{ - if(!set->rsf->CardInfo.MediaSize){ - set->rsf->CardInfo.MediaSize = calloc(20,sizeof(char)); - u64 contentSize = NCCH0_OFFSET; - u16 contentNum = GetTmdContentCount(tmd); - for(int i = 0; i < contentNum; i++) - contentSize += GetTmdContentSize(info[i]); - - if(contentSize < (u64)128*MB) - strcpy(set->rsf->CardInfo.MediaSize,"128MB"); - else if(contentSize < (u64)256*MB) - strcpy(set->rsf->CardInfo.MediaSize,"256MB"); - else if(contentSize < (u64)512*MB) - strcpy(set->rsf->CardInfo.MediaSize,"512MB"); - else if(contentSize < (u64)1*GB) - strcpy(set->rsf->CardInfo.MediaSize,"1GB"); - else if(contentSize < (u64)2*GB) - strcpy(set->rsf->CardInfo.MediaSize,"2GB"); - else if(contentSize < (u64)4*GB) - strcpy(set->rsf->CardInfo.MediaSize,"4GB"); - else if(contentSize < (u64)8*GB) - strcpy(set->rsf->CardInfo.MediaSize,"8GB"); - else{ - free(set->rsf->CardInfo.MediaSize); - set->rsf->CardInfo.MediaSize = NULL; - } - - if(set->options.verbose && set->rsf->CardInfo.MediaSize) - printf("[CCI] Auto generating RSF setting \"CardInfo/MediaSize: %s\" \n",set->rsf->CardInfo.MediaSize); - } - - if(!set->rsf->CardInfo.MediaType){ - set->rsf->CardInfo.MediaType = calloc(20,sizeof(char)); - if(set->romInfo.saveSize < (u64)1*MB) - strcpy(set->rsf->CardInfo.MediaType,"Card1"); - else - strcpy(set->rsf->CardInfo.MediaType,"Card2"); - - if(set->options.verbose) - printf("[CCI] Auto generating RSF setting \"CardInfo/MediaType: %s\" \n",set->rsf->CardInfo.MediaType); - } - - if(!set->rsf->CardInfo.CardDevice){ - set->rsf->CardInfo.CardDevice = calloc(20,sizeof(char)); - if(set->romInfo.saveSize < (u64)1*MB && set->romInfo.saveSize > 0) - strcpy(set->rsf->CardInfo.CardDevice,"NorFlash"); - else - strcpy(set->rsf->CardInfo.CardDevice,"None"); - - if(set->options.verbose) - printf("[CCI] Auto generating RSF setting \"CardInfo/CardDevice: %s\" \n",set->rsf->CardInfo.CardDevice); - } - - return; -} - int ProcessCiaForCci(cci_settings *set) { if(!IsCia(set->content.data)){ @@ -236,20 +181,12 @@ int ProcessCiaForCci(cci_settings *set) u16 contentCount = GetTmdContentCount(tmd); set->romInfo.saveSize = GetTmdSaveSize(tmd); - if(set->romInfo.saveSize > 0 && set->romInfo.saveSize < (u64)(128*KB)) - set->romInfo.saveSize = (u64)(128*KB); - else if(set->romInfo.saveSize > (u64)(128*KB) && set->romInfo.saveSize < (u64)(512*KB)) - set->romInfo.saveSize = (u64)(512*KB); - else if(set->romInfo.saveSize > (u64)(512*KB)) - set->romInfo.saveSize = align(set->romInfo.saveSize,MB); if(!CanCiaBeCci(GetTmdTitleId(tmd),contentCount,contentInfo)){ fprintf(stderr,"[CCI ERROR] This CIA cannot be converted to CCI\n"); return INCOMPAT_CIA; } - - GenRsfInputFromTmd(tmd,contentInfo,set); - + bool canDecrypt; u8 titleKey[AES_128_KEY_SIZE]; canDecrypt = GetTikTitleKey(titleKey,tik,set->keys); @@ -285,19 +222,36 @@ int ProcessCiaForCci(cci_settings *set) return 0; } -int ImportCciNcch(cci_settings *set) +void GetTitleSaveSize(cci_settings *set) { if(set->rsf->SystemControlInfo.SaveDataSize) GetSaveDataSizeFromString(&set->romInfo.saveSize,set->rsf->SystemControlInfo.SaveDataSize,"CCI"); + + // Adjusting save size + if(set->romInfo.saveSize > 0 && set->romInfo.saveSize < (u64)(128*KB)) + set->romInfo.saveSize = (u64)(128*KB); + else if(set->romInfo.saveSize > (u64)(128*KB) && set->romInfo.saveSize < (u64)(512*KB)) + set->romInfo.saveSize = (u64)(512*KB); + else if(set->romInfo.saveSize > (u64)(512*KB)) + set->romInfo.saveSize = align(set->romInfo.saveSize,MB); +} + +int ImportCciNcch(cci_settings *set) +{ + int ret = 0; if(set->content.dataType == infile_ncch) - return ImportNcchForCci(set); + ret = ImportNcchForCci(set); else if(set->content.dataType == infile_cia) - return ProcessCiaForCci(set); - else + ret = ProcessCiaForCci(set); + else{ fprintf(stderr,"[CCI ERROR] Unrecognised input data type\n"); + return FAILED_TO_IMPORT_FILE; + } - return FAILED_TO_IMPORT_FILE; + GetTitleSaveSize(set); + + return ret; } int ProcessCverDataForCci(cci_settings *set) @@ -399,12 +353,34 @@ int ProcessNcchForCci(cci_settings *set) return 0; } +void SetCciNcchInfo(cci_hdr *hdr, cci_settings *set) +{ + u64 ncchSize,ncchOffset; + + ncchOffset = NCCH0_OFFSET; + + for(int i = 0; i < CCI_MAX_CONTENT; i++){ + if(set->content.active[i]){ + set->content.cOffset[i] = ncchOffset; + ncchSize = align(set->content.dSize[i],set->romInfo.blockSize); + + u32_to_u8(hdr->offset_sizeTable[i].offset,(ncchOffset/set->romInfo.blockSize),LE); + u32_to_u8(hdr->offset_sizeTable[i].size,(ncchSize/set->romInfo.blockSize),LE); + u64_to_u8(hdr->ncchIdTable[i],set->content.titleId[i],LE); + + ncchOffset += ncchSize; + } + } + + set->romInfo.usedSize = ncchOffset; + + return; +} + int SetMediaSize(u8 *mediaSize, cci_settings *set) { char *str = set->rsf->CardInfo.MediaSize; - if(!str) - set->romInfo.mediaSize = (u64)GB*2; - else{ + if(str){ if(strcasecmp(str,"128MB") == 0) set->romInfo.mediaSize = (u64)MB*128; else if(strcasecmp(str,"256MB") == 0) set->romInfo.mediaSize = (u64)MB*256; else if(strcasecmp(str,"512MB") == 0) set->romInfo.mediaSize = (u64)MB*512; @@ -419,6 +395,31 @@ int SetMediaSize(u8 *mediaSize, cci_settings *set) return INVALID_RSF_OPT; } } + else{ + u64 dataSize = set->romInfo.usedSize + (set->romInfo.saveSize >= MB ? set->romInfo.saveSize : 0); + if(dataSize < (u64)MB*128) + set->romInfo.mediaSize = (u64)MB*128; + else if(dataSize < (u64)MB*256) + set->romInfo.mediaSize = (u64)MB*256; + else if(dataSize < (u64)MB*512) + set->romInfo.mediaSize = (u64)MB*512; + else if(dataSize < (u64)GB*1) + set->romInfo.mediaSize = (u64)GB*1; + else if(dataSize < (u64)GB*2) + set->romInfo.mediaSize = (u64)GB*2; + else if(dataSize < (u64)GB*4) + set->romInfo.mediaSize = (u64)GB*4; + else if(dataSize < (u64)GB*8) + set->romInfo.mediaSize = (u64)GB*8; + //else if(dataSize < (u64)GB*16) + // set->romInfo.mediaSize = (u64)GB*16; + //else if(dataSize < (u64)GB*32) + // set->romInfo.mediaSize = (u64)GB*32; + else { + fprintf(stderr,"[CCI ERROR] NCCH Partitions are too large\n"); + return INVALID_RSF_OPT; + } + } u32_to_u8(mediaSize,(set->romInfo.mediaSize/set->romInfo.blockSize),LE); @@ -446,9 +447,7 @@ int SetMediaType(u8 *flag, cci_settings *set) { char *str = set->rsf->CardInfo.MediaType; - if(!str) - *flag = mediatype_CARD1; - else{ + if(str){ if(strcasecmp(str,"Card1") == 0) *flag = mediatype_CARD1; else if(strcasecmp(str,"Card2") == 0) @@ -458,6 +457,12 @@ int SetMediaType(u8 *flag, cci_settings *set) return INVALID_RSF_OPT; } } + else{ + if(set->romInfo.saveSize >= (u64)1*MB) + *flag = mediatype_CARD2; + else + *flag = mediatype_CARD1; + } return 0; } @@ -488,9 +493,7 @@ int SetCardDevice(u8 *flags, u64 saveSize, rsf_settings *rsf) /* CardDevice */ u8 cardDevice = 0; - if(!rsf->CardInfo.CardDevice) - cardDevice = carddevice_NONE; - else{ + if(rsf->CardInfo.CardDevice){ if(strcmp(rsf->CardInfo.CardDevice,"NorFlash") == 0) cardDevice = carddevice_NOR_FLASH; else if(strcmp(rsf->CardInfo.CardDevice,"None") == 0) @@ -502,6 +505,12 @@ int SetCardDevice(u8 *flags, u64 saveSize, rsf_settings *rsf) return INVALID_RSF_OPT; } } + else{ + if(saveSize == 0 || saveSize >= (u64)1*MB) + cardDevice = carddevice_NONE; + else + cardDevice = carddevice_NOR_FLASH; + } if(flags[cciflag_MEDIA_TYPE] == mediatype_CARD1){ if(saveSize != (u64)(128*KB) && saveSize != (u64)(512*KB) && cardDevice == carddevice_NOR_FLASH){ @@ -544,31 +553,6 @@ int SetCciFlags(u8 *flags, cci_settings *set) return 0; } -void SetCciNcchInfo(cci_hdr *hdr, cci_settings *set) -{ - u64 ncchSize,ncchOffset; - - ncchOffset = NCCH0_OFFSET; - - for(int i = 0; i < CCI_MAX_CONTENT; i++){ - if(set->content.active[i]){ - set->content.cOffset[i] = ncchOffset; - ncchSize = align(set->content.dSize[i],set->romInfo.blockSize); - - u32_to_u8(hdr->offset_sizeTable[i].offset,(ncchOffset/set->romInfo.blockSize),LE); - u32_to_u8(hdr->offset_sizeTable[i].size,(ncchSize/set->romInfo.blockSize),LE); - u64_to_u8(hdr->ncchIdTable[i],set->content.titleId[i],LE); - - ncchOffset += ncchSize; - } - } - - set->romInfo.usedSize = ncchOffset; - - return; -} - - int GenCciHdr(cci_settings *set) { set->headers.ccihdr.size = sizeof(cci_hdr); @@ -586,11 +570,12 @@ int GenCciHdr(cci_settings *set) u64_to_u8(hdr->titleId,set->content.titleId[0],LE); + SetCciNcchInfo(hdr,set); if(SetMediaSize(hdr->mediaSize,set)) return GEN_HDR_FAIL; if(SetCciFlags(hdr->flags,set)) return GEN_HDR_FAIL; - SetCciNcchInfo(hdr,set); + // Sign Header RsaSignVerify(&hdr->magic,sizeof(cci_hdr)-RSA_2048_KEY_SIZE,hdr->signature,set->keys->rsa.cciCfaPub,set->keys->rsa.cciCfaPvt,RSA_2048_SHA256,CTR_RSA_SIGN); @@ -598,20 +583,31 @@ int GenCciHdr(cci_settings *set) return 0; } -int CheckRomConfig(cci_settings *set) +char* GetMediaSizeStr(u64 mediaSize) { + //MEDIA_SIZE_STR + switch(mediaSize){ + case (u64)MB*128: return (char*)MEDIA_SIZE_STR[0]; + case (u64)MB*256: return (char*)MEDIA_SIZE_STR[1]; + case (u64)MB*512: return (char*)MEDIA_SIZE_STR[2]; + case (u64)GB*1: return (char*)MEDIA_SIZE_STR[3]; + case (u64)GB*2: return (char*)MEDIA_SIZE_STR[4]; + case (u64)GB*4: return (char*)MEDIA_SIZE_STR[5]; + case (u64)GB*8: return (char*)MEDIA_SIZE_STR[6]; + default: return 0; + } +} + +int CheckRomConfig(cci_settings *set) +{ u64 cciUsedSize; if(set->romInfo.mediaType == mediatype_CARD2) cciUsedSize = set->romInfo.card2SaveOffset + set->romInfo.saveSize; else cciUsedSize = set->romInfo.usedSize; - if(cciUsedSize > set->romInfo.mediaSize){ - char *str = set->rsf->CardInfo.MediaSize; - if(!str) - str = "2GB"; - - fprintf(stderr,"[CCI ERROR] MediaSize '%s' is insufficient for the CCI data\n",str); + if(cciUsedSize > set->romInfo.mediaSize){ + fprintf(stderr,"[CCI ERROR] MediaSize '%s' is insufficient for the CCI data\n",GetMediaSizeStr(set->romInfo.mediaSize)); return CCI_CONFIG_FAIL; } return 0; diff --git a/makerom/romfs_gen.c b/makerom/romfs_gen.c index 5f41801..3ad516c 100644 --- a/makerom/romfs_gen.c +++ b/makerom/romfs_gen.c @@ -5,6 +5,7 @@ const int ROMFS_BLOCK_SIZE = 0x1000; const unsigned int ROMFS_UNUSED_ENTRY = 0xffffffff; +const fs_romfs_char ROMFS_EMPTY_PATH[2] = {0x0000, 0x0000}; // Build bool IsFileWanted(fs_file *file, void *filter_criteria); @@ -30,7 +31,7 @@ int PrepareBuildRomFsBinary(ncch_settings *ncchset, romfs_buildctx *ctx) char *cwd = calloc(CWD_MAX_LEN,sizeof(char)); getcwd(cwd,CWD_MAX_LEN); - char *dir = ncchset->rsfSet->Rom.HostRoot; + char *dir = ncchset->rsfSet->RomFs.RootPath; fs_char *fs_path; fs_romfs_char *path; @@ -201,9 +202,9 @@ int CalcRomfsSize(romfs_buildctx *ctx) //printf("predict level sizes\n"); ctx->level[3].size = romfsHdrSize + ctx->m_dataLen; // data - ctx->level[2].size = align(ctx->level[3].size,ROMFS_BLOCK_SIZE) / ROMFS_BLOCK_SIZE * 0x20 ; - ctx->level[1].size = align(ctx->level[2].size,ROMFS_BLOCK_SIZE) / ROMFS_BLOCK_SIZE * 0x20 ; - ctx->level[0].size = align(ctx->level[1].size,ROMFS_BLOCK_SIZE) / ROMFS_BLOCK_SIZE * 0x20 + align(sizeof(ivfc_hdr),0x10); // hdr + ctx->level[2].size = align(ctx->level[3].size,ROMFS_BLOCK_SIZE) / ROMFS_BLOCK_SIZE * SHA_256_LEN ; + ctx->level[1].size = align(ctx->level[2].size,ROMFS_BLOCK_SIZE) / ROMFS_BLOCK_SIZE * SHA_256_LEN ; + ctx->level[0].size = align(ctx->level[1].size,ROMFS_BLOCK_SIZE) / ROMFS_BLOCK_SIZE * SHA_256_LEN + align(sizeof(ivfc_hdr),0x10); // hdr ctx->romfsHeaderSize = ctx->level[0].size; @@ -319,13 +320,13 @@ void AddDirHashKey(romfs_buildctx *ctx, u32 parent, fs_romfs_char* path, u32 dir { u32 hash = CalcPathHash(parent,path,0,fs_u16StrLen(path)); u32 index = hash % ctx->m_dirUTableEntry; - if(ctx->dirUTable[index] == 0xffffffff) ctx->dirUTable[index] = dirOffset; + if(ctx->dirUTable[index] == ROMFS_UNUSED_ENTRY) ctx->dirUTable[index] = dirOffset; else { romfs_direntry * curdir = (romfs_direntry*)(ctx->dirTable + ctx->dirUTable[index]); while(1) { - if(*(u32*)curdir->weirdoffset == 0xffffffff) + if(*(u32*)curdir->weirdoffset == ROMFS_UNUSED_ENTRY) { *(u32*)curdir->weirdoffset = dirOffset; break; @@ -342,13 +343,13 @@ void AddFileHashKey(romfs_buildctx *ctx,u32 parent, fs_romfs_char *path, u32 fil { u32 hash = CalcPathHash(parent,path,0,fs_u16StrLen(path)); u32 index = hash % ctx->m_fileUTableEntry; - if(ctx->fileUTable[index] == 0xffffffff) ctx->fileUTable[index] = fileOffset; + if(ctx->fileUTable[index] == ROMFS_UNUSED_ENTRY) ctx->fileUTable[index] = fileOffset; else { romfs_fileentry * curfile = (romfs_fileentry*)(ctx->fileTable + ctx->fileUTable[index]); while(1) { - if(*(u32*)curfile->weirdoffset == 0xffffffff) + if(*(u32*)curfile->weirdoffset == ROMFS_UNUSED_ENTRY) { *(u32*)curfile->weirdoffset = fileOffset; break; @@ -367,7 +368,7 @@ int AddFileToRomfs(romfs_buildctx *ctx, fs_file *file, u32 parent, u32 sibling) u32_to_u8(entry->parentdiroffset,parent,LE); u32_to_u8(entry->siblingoffset,sibling,LE); - u32_to_u8(entry->weirdoffset,0xffffffff,LE); + u32_to_u8(entry->weirdoffset,ROMFS_UNUSED_ENTRY,LE); // Import Name u32_to_u8(entry->namesize,file->name_len,LE); @@ -387,6 +388,7 @@ int AddFileToRomfs(romfs_buildctx *ctx, fs_file *file, u32 parent, u32 sibling) } else u64_to_u8(entry->dataoffset,0x40,LE); + AddFileHashKey(ctx,parent,file->name,ctx->u_fileTableLen); ctx->u_fileTableLen += sizeof(romfs_fileentry) + align(file->name_len,4); @@ -399,18 +401,15 @@ int AddDirToRomfs(romfs_buildctx *ctx, fs_dir *fs, u32 parent, u32 sibling) romfs_direntry *entry = (romfs_direntry*)(ctx->dirTable + ctx->u_dirTableLen); u32_to_u8(entry->parentoffset,parent,LE); - u32_to_u8(entry->siblingoffset,sibling,LE); - - //u32 uTableIndex = GetDirUTableIndex(ctx,fs); - u32_to_u8(entry->weirdoffset,0xffffffff,LE); - //ctx->dirUTable[uTableIndex] = ctx->u_dirTableLen; + u32_to_u8(entry->siblingoffset,sibling,LE); + u32_to_u8(entry->weirdoffset,ROMFS_UNUSED_ENTRY,LE); u32 Currentdir = ctx->u_dirTableLen; if(Currentdir == 0) { u32_to_u8(entry->namesize,0,LE); - AddDirHashKey(ctx,parent,L"",ctx->u_dirTableLen); + AddDirHashKey(ctx,parent,(fs_romfs_char*)ROMFS_EMPTY_PATH,ctx->u_dirTableLen); ctx->u_dirTableLen += sizeof(romfs_direntry); } else @@ -464,7 +463,7 @@ int AddDirToRomfs(romfs_buildctx *ctx, fs_dir *fs, u32 parent, u32 sibling) AddDirToRomfs(ctx,&dir[i],Currentdir,dir_sibling); if(dir_sibling != ROMFS_UNUSED_ENTRY) { - dir_sibling = ctx->u_dirTableLen;//修复同目录文件夹偏移 + dir_sibling = ctx->u_dirTableLen;//修复同目录文件夹偏移 (Repair the same directory folder offset) u32_to_u8(temp_entry->siblingoffset,dir_sibling,LE); } } @@ -487,7 +486,7 @@ void BuildIvfcHeader(romfs_buildctx *ctx) memcpy(ctx->ivfcHdr->magic,"IVFC",4); u32_to_u8(ctx->ivfcHdr->id,0x10000,LE); - u32 masterHashSize = ( align(ctx->level[1].size,ROMFS_BLOCK_SIZE) / ROMFS_BLOCK_SIZE ) * 0x20 ; + u32 masterHashSize = ( align(ctx->level[1].size,ROMFS_BLOCK_SIZE) / ROMFS_BLOCK_SIZE ) * SHA_256_LEN ; u32_to_u8(ctx->ivfcHdr->masterHashSize,masterHashSize,LE); for(int i = 1; i < 4; i++){ @@ -507,7 +506,7 @@ void GenIvfcHashTree(romfs_buildctx *ctx) u32 numHashes = align(ctx->level[i+1].size,ROMFS_BLOCK_SIZE) / ROMFS_BLOCK_SIZE; for(u32 j = 0; j < numHashes; j++){ u8 *datapos = (u8*)(ctx->level[i+1].pos + ROMFS_BLOCK_SIZE * j); - u8 *hashpos = (u8*)(ctx->level[i].pos + 0x20 * j); + u8 *hashpos = (u8*)(ctx->level[i].pos + SHA_256_LEN * j); ShaCalc(datapos, ROMFS_BLOCK_SIZE, hashpos, CTR_SHA_256); } } @@ -515,15 +514,13 @@ void GenIvfcHashTree(romfs_buildctx *ctx) return; } -u32 CalcPathHash(u32 parent, fs_romfs_char * path, u32 start, u32 length) +u32 CalcPathHash(u32 parent, fs_romfs_char* path, u32 start, u32 length) { u32 hash = parent ^ 123456789; - u32 index = 0; - while(index < length) + for( u32 index = 0; index < length; index++ ) { hash = (u32)((hash >> 5) | (hash << 27));//ror hash ^= (u16)path[start + index]; - index++; } return hash; } diff --git a/makerom/rsf_settings.c b/makerom/rsf_settings.c index aa7e938..fdfa291 100644 --- a/makerom/rsf_settings.c +++ b/makerom/rsf_settings.c @@ -1,5 +1,16 @@ #include "lib.h" +void GET_Option(ctr_yaml_context *ctx, rsf_settings *rsf); +void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf); +void GET_SystemControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf); +void GET_BasicInfo(ctr_yaml_context *ctx, rsf_settings *rsf); +void GET_RomFs(ctr_yaml_context *ctx, rsf_settings *rsf); +void GET_ExeFs(ctr_yaml_context *ctx, rsf_settings *rsf); +void GET_PlainRegion(ctr_yaml_context *ctx, rsf_settings *rsf); +void GET_TitleInfo(ctr_yaml_context *ctx, rsf_settings *rsf); +void GET_CardInfo(ctr_yaml_context *ctx, rsf_settings *rsf); +void GET_CommonHeaderKey(ctr_yaml_context *ctx, rsf_settings *rsf); + void EvaluateRSF(rsf_settings *rsf, ctr_yaml_context *ctx) { u32 start_level = ctx->Level-1; @@ -11,7 +22,7 @@ void EvaluateRSF(rsf_settings *rsf, ctr_yaml_context *ctx) else if(cmpYamlValue("AccessControlInfo",ctx)) {FinishEvent(ctx); GET_AccessControlInfo(ctx,rsf); goto GET_NextGroup;} else if(cmpYamlValue("SystemControlInfo",ctx)) {FinishEvent(ctx); GET_SystemControlInfo(ctx,rsf); goto GET_NextGroup;} else if(cmpYamlValue("BasicInfo",ctx)) {FinishEvent(ctx); GET_BasicInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("Rom",ctx)) {FinishEvent(ctx); GET_Rom(ctx,rsf); goto GET_NextGroup;} + else if(cmpYamlValue("RomFs",ctx)) {FinishEvent(ctx); GET_RomFs(ctx,rsf); goto GET_NextGroup;} else if(cmpYamlValue("ExeFs",ctx)) {FinishEvent(ctx); GET_ExeFs(ctx,rsf); goto GET_NextGroup;} else if(cmpYamlValue("PlainRegion",ctx)) {FinishEvent(ctx); GET_PlainRegion(ctx,rsf); goto GET_NextGroup;} else if(cmpYamlValue("TitleInfo",ctx)) {FinishEvent(ctx); GET_TitleInfo(ctx,rsf); goto GET_NextGroup;} @@ -53,13 +64,11 @@ void GET_Option(ctr_yaml_context *ctx, rsf_settings *rsf) // Handle childs if(cmpYamlValue("AllowUnalignedSection",ctx)) SetBoolYAMLValue(&rsf->Option.AllowUnalignedSection,"AllowUnalignedSection",ctx); else if(cmpYamlValue("MediaFootPadding",ctx)) SetBoolYAMLValue(&rsf->Option.MediaFootPadding,"MediaFootPadding",ctx); - //else if(cmpYamlValue("NoPadding",ctx)) SetBoolYAMLValue(&rsf->Option.NoPadding,"NoPadding",ctx); else if(cmpYamlValue("EnableCrypt",ctx)) SetBoolYAMLValue(&rsf->Option.EnableCrypt,"EnableCrypt",ctx); else if(cmpYamlValue("EnableCompress",ctx)) SetBoolYAMLValue(&rsf->Option.EnableCompress,"EnableCompress",ctx); else if(cmpYamlValue("FreeProductCode",ctx)) SetBoolYAMLValue(&rsf->Option.FreeProductCode,"FreeProductCode",ctx); else if(cmpYamlValue("UseOnSD",ctx)) SetBoolYAMLValue(&rsf->Option.UseOnSD,"UseOnSD",ctx); else if(cmpYamlValue("PageSize",ctx)) SetSimpleYAMLValue(&rsf->Option.PageSize,"PageSize",ctx,0); - //else if(cmpYamlValue("AppendSystemCall",ctx)) rsf->Option.AppendSystemCallNum = SetYAMLSequence(&rsf->Option.AppendSystemCall,"AppendSystemCall",ctx); else{ fprintf(stderr,"[RSF ERROR] Unrecognised key '%s'\n",GetYamlString(ctx)); ctx->error = YAML_UNKNOWN_KEY; @@ -91,13 +100,10 @@ void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) else if(cmpYamlValue("PermitMainFunctionArgument",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.PermitMainFunctionArgument,"PermitMainFunctionArgument",ctx); else if(cmpYamlValue("CanShareDeviceMemory",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.CanShareDeviceMemory,"CanShareDeviceMemory",ctx); else if(cmpYamlValue("UseOtherVariationSaveData",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.UseOtherVariationSaveData,"UseOtherVariationSaveData",ctx); - else if(cmpYamlValue("UseExtSaveData",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.UseExtSaveData,"UseExtSaveData",ctx); - else if(cmpYamlValue("UseExtendedSaveDataAccessControl",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.UseExtendedSaveDataAccessControl,"UseExtendedSaveDataAccessControl",ctx); else if(cmpYamlValue("RunnableOnSleep",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.RunnableOnSleep,"RunnableOnSleep",ctx); else if(cmpYamlValue("SpecialMemoryArrange",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.SpecialMemoryArrange,"SpecialMemoryArrange",ctx); - //else if(cmpYamlValue("ProgramId",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ProgramId,"ProgramId",ctx,0); else if(cmpYamlValue("IdealProcessor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.IdealProcessor,"IdealProcessor",ctx,0); else if(cmpYamlValue("Priority",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.Priority,"Priority",ctx,0); else if(cmpYamlValue("MemoryType",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.MemoryType,"MemoryType",ctx,0); @@ -112,7 +118,6 @@ void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) else if(cmpYamlValue("ExtSaveDataId",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ExtSaveDataId,"ExtSaveDataId",ctx,0); else if(cmpYamlValue("AffinityMask",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.AffinityMask,"AffinityMask",ctx,0); else if(cmpYamlValue("DescVersion",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.DescVersion,"DescVersion",ctx,0); - //else if(cmpYamlValue("CryptoKey",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.CryptoKey,"CryptoKey",ctx,0); else if(cmpYamlValue("ResourceLimitCategory",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ResourceLimitCategory,"ResourceLimitCategory",ctx,0); else if(cmpYamlValue("ReleaseKernelMajor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ReleaseKernelMajor,"ReleaseKernelMajor",ctx,0); else if(cmpYamlValue("ReleaseKernelMinor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ReleaseKernelMinor,"ReleaseKernelMinor",ctx,0); @@ -126,7 +131,6 @@ void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) else if(cmpYamlValue("InterruptNumbers",ctx)) rsf->AccessControlInfo.InterruptNumbersNum = SetYAMLSequence(&rsf->AccessControlInfo.InterruptNumbers,"InterruptNumbers",ctx); else if(cmpYamlValue("SystemCallAccess",ctx)) rsf->AccessControlInfo.SystemCallAccessNum = SetYAMLSequenceFromMapping(&rsf->AccessControlInfo.SystemCallAccess,"SystemCallAccess",ctx,false); else if(cmpYamlValue("ServiceAccessControl",ctx)) rsf->AccessControlInfo.ServiceAccessControlNum = SetYAMLSequence(&rsf->AccessControlInfo.ServiceAccessControl,"ServiceAccessControl",ctx); - //else if(cmpYamlValue("StorageId",ctx)) rsf->AccessControlInfo.StorageIdNum = SetYAMLSequence(&rsf->AccessControlInfo.StorageId,"StorageId",ctx); else if(cmpYamlValue("AccessibleSaveDataIds",ctx)) rsf->AccessControlInfo.AccessibleSaveDataIdsNum = SetYAMLSequence(&rsf->AccessControlInfo.AccessibleSaveDataIds,"AccessibleSaveDataIds",ctx); else{ @@ -187,8 +191,6 @@ void GET_BasicInfo(ctr_yaml_context *ctx, rsf_settings *rsf) else if(cmpYamlValue("ProductCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.ProductCode,"ProductCode",ctx,0); else if(cmpYamlValue("ContentType",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.ContentType,"ContentType",ctx,0); else if(cmpYamlValue("Logo",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.Logo,"Logo",ctx,0); - //else if(cmpYamlValue("BackupMemoryType",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.BackupMemoryType,"BackupMemoryType",ctx,0); - //else if(cmpYamlValue("InitialCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.InitialCode,"InitialCode",ctx,0); else{ fprintf(stderr,"[RSF ERROR] Unrecognised key '%s'\n",GetYamlString(ctx)); ctx->error = YAML_UNKNOWN_KEY; @@ -202,7 +204,7 @@ void GET_BasicInfo(ctr_yaml_context *ctx, rsf_settings *rsf) FinishEvent(ctx); } -void GET_Rom(ctr_yaml_context *ctx, rsf_settings *rsf) +void GET_RomFs(ctr_yaml_context *ctx, rsf_settings *rsf) { /* Checking That Group is in a map */ if(!CheckMappingEvent(ctx)) return; @@ -213,13 +215,12 @@ void GET_Rom(ctr_yaml_context *ctx, rsf_settings *rsf) if(ctx->error || ctx->done) return; // Handle childs - if(cmpYamlValue("HostRoot",ctx)) SetSimpleYAMLValue(&rsf->Rom.HostRoot,"HostRoot",ctx,0); - //else if(cmpYamlValue("Padding",ctx)) SetSimpleYAMLValue(&rsf->Rom.Padding,"Padding",ctx,0); + if(cmpYamlValue("RootPath",ctx)) SetSimpleYAMLValue(&rsf->RomFs.RootPath,"RootPath",ctx,0); - else if(cmpYamlValue("DefaultReject",ctx)) rsf->Rom.DefaultRejectNum = SetYAMLSequence(&rsf->Rom.DefaultReject,"DefaultReject",ctx); - else if(cmpYamlValue("Reject",ctx)) rsf->Rom.RejectNum = SetYAMLSequence(&rsf->Rom.Reject,"Reject",ctx); - else if(cmpYamlValue("Include",ctx)) rsf->Rom.IncludeNum = SetYAMLSequence(&rsf->Rom.Include,"Include",ctx); - else if(cmpYamlValue("File",ctx)) rsf->Rom.FileNum = SetYAMLSequence(&rsf->Rom.File,"File",ctx); + else if(cmpYamlValue("DefaultReject",ctx)) rsf->RomFs.DefaultRejectNum = SetYAMLSequence(&rsf->RomFs.DefaultReject,"DefaultReject",ctx); + else if(cmpYamlValue("Reject",ctx)) rsf->RomFs.RejectNum = SetYAMLSequence(&rsf->RomFs.Reject,"Reject",ctx); + else if(cmpYamlValue("Include",ctx)) rsf->RomFs.IncludeNum = SetYAMLSequence(&rsf->RomFs.Include,"Include",ctx); + else if(cmpYamlValue("File",ctx)) rsf->RomFs.FileNum = SetYAMLSequence(&rsf->RomFs.File,"File",ctx); else{ fprintf(stderr,"[RSF ERROR] Unrecognised key '%s'\n",GetYamlString(ctx)); @@ -279,12 +280,10 @@ void GET_TitleInfo(ctr_yaml_context *ctx, rsf_settings *rsf) // Handle childs if(cmpYamlValue("Category",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Category,"Category",ctx,0); - //else if(cmpYamlValue("Platform",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Platform,"Platform",ctx,0); else if(cmpYamlValue("UniqueId",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.UniqueId,"UniqueId",ctx,0); else if(cmpYamlValue("Version",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Version,"Version",ctx,0); else if(cmpYamlValue("ContentsIndex",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.ContentsIndex,"ContentsIndex",ctx,0); else if(cmpYamlValue("Variation",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Variation,"Variation",ctx,0); - //else if(cmpYamlValue("Use",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Use,"Use",ctx,0); else if(cmpYamlValue("ChildIndex",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.ChildIndex,"ChildIndex",ctx,0); else if(cmpYamlValue("DemoIndex",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.DemoIndex,"DemoIndex",ctx,0); else if(cmpYamlValue("TargetCategory",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.TargetCategory,"TargetCategory",ctx,0); @@ -377,15 +376,8 @@ void free_RsfSettings(rsf_settings *set) { //Option free(set->Option.PageSize); - /* - for(u32 i = 0; i < set->Option.AppendSystemCallNum; i++){ - free(set->Option.AppendSystemCall[i]); - } - free(set->Option.AppendSystemCall); - */ //AccessControlInfo - //free(set->AccessControlInfo.ProgramId); free(set->AccessControlInfo.IdealProcessor); free(set->AccessControlInfo.Priority); free(set->AccessControlInfo.MemoryType); @@ -401,7 +393,6 @@ void free_RsfSettings(rsf_settings *set) free(set->AccessControlInfo.SystemMode); free(set->AccessControlInfo.AffinityMask); free(set->AccessControlInfo.DescVersion); - //free(set->AccessControlInfo.CryptoKey); free(set->AccessControlInfo.ResourceLimitCategory); free(set->AccessControlInfo.ReleaseKernelMajor); free(set->AccessControlInfo.ReleaseKernelMinor); @@ -441,11 +432,6 @@ void free_RsfSettings(rsf_settings *set) free(set->AccessControlInfo.ServiceAccessControl[i]); } free(set->AccessControlInfo.ServiceAccessControl); - - for(u32 i = 0; i < set->AccessControlInfo.StorageIdNum; i++){ - free(set->AccessControlInfo.StorageId[i]); - } - free(set->AccessControlInfo.StorageId); for(u32 i = 0; i < set->AccessControlInfo.AccessibleSaveDataIdsNum; i++){ free(set->AccessControlInfo.AccessibleSaveDataIds[i]); @@ -470,32 +456,29 @@ void free_RsfSettings(rsf_settings *set) free(set->BasicInfo.ProductCode); free(set->BasicInfo.ContentType); free(set->BasicInfo.Logo); - //free(set->BasicInfo.BackupMemoryType); - //free(set->BasicInfo.InitialCode); //Rom - free(set->Rom.HostRoot); - //free(set->Rom.Padding); + free(set->RomFs.RootPath); - for(u32 i = 0; i < set->Rom.DefaultRejectNum; i++){ - free(set->Rom.DefaultReject[i]); + for(u32 i = 0; i < set->RomFs.DefaultRejectNum; i++){ + free(set->RomFs.DefaultReject[i]); } - free(set->Rom.DefaultReject); + free(set->RomFs.DefaultReject); - for(u32 i = 0; i < set->Rom.RejectNum; i++){ - free(set->Rom.Reject[i]); + for(u32 i = 0; i < set->RomFs.RejectNum; i++){ + free(set->RomFs.Reject[i]); } - free(set->Rom.Reject); + free(set->RomFs.Reject); - for(u32 i = 0; i < set->Rom.IncludeNum; i++){ - free(set->Rom.Include[i]); + for(u32 i = 0; i < set->RomFs.IncludeNum; i++){ + free(set->RomFs.Include[i]); } - free(set->Rom.Include); + free(set->RomFs.Include); - for(u32 i = 0; i < set->Rom.FileNum; i++){ - free(set->Rom.File[i]); + for(u32 i = 0; i < set->RomFs.FileNum; i++){ + free(set->RomFs.File[i]); } - free(set->Rom.File); + free(set->RomFs.File); //ExeFs for(u32 i = 0; i < set->ExeFs.TextNum; i++){ @@ -520,13 +503,11 @@ void free_RsfSettings(rsf_settings *set) free(set->PlainRegion); //TitleInfo - //free(set->TitleInfo.Platform); free(set->TitleInfo.Category); free(set->TitleInfo.UniqueId); free(set->TitleInfo.Version); free(set->TitleInfo.ContentsIndex); free(set->TitleInfo.Variation); - //free(set->TitleInfo.Use); free(set->TitleInfo.ChildIndex); free(set->TitleInfo.DemoIndex); free(set->TitleInfo.TargetCategory); diff --git a/makerom/rsf_settings.h b/makerom/rsf_settings.h index 2b355fc..e77f301 100644 --- a/makerom/rsf_settings.h +++ b/makerom/rsf_settings.h @@ -1,16 +1,4 @@ #pragma once void EvaluateRSF(rsf_settings *rsf, ctr_yaml_context *ctx); - -void GET_Option(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_SystemControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_BasicInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_Rom(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_ExeFs(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_PlainRegion(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_TitleInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_CardInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_CommonHeaderKey(ctr_yaml_context *ctx, rsf_settings *rsf); - void free_RsfSettings(rsf_settings *set); \ No newline at end of file diff --git a/makerom/user_settings.c b/makerom/user_settings.c index ff987a1..1efbc0c 100644 --- a/makerom/user_settings.c +++ b/makerom/user_settings.c @@ -181,8 +181,8 @@ int SetArgument(int argc, int i, char *argv[], user_settings *set) set->common.keys.keyset = pki_DEVELOPMENT; else if(strcasecmp(argv[i+1],"retail") == 0 || strcasecmp(argv[i+1],"production") == 0 || strcasecmp(argv[i+1],"p") == 0) set->common.keys.keyset = pki_PRODUCTION; - //else if(strcasecmp(argv[i+1],"custom") == 0 || strcasecmp(argv[i+1],"c") == 0) // given all known keys are here, this isn't needed - // set->common.keys.keyset = pki_CUSTOM; + else if(strcasecmp(argv[i+1],"gw") == 0 || strcasecmp(argv[i+1],"gateway3ds") == 0 || strcasecmp(argv[i+1],"g") == 0) + set->common.keys.keyset = pki_GATEWAY3DS; else{ fprintf(stderr,"[SETTING ERROR] Unrecognised target '%s'\n",argv[i+1]); return USR_BAD_ARG; @@ -866,10 +866,11 @@ void DisplayHelp(char *app_name) printf(" -v Verbose output\n"); printf(" -DNAME=VALUE Substitute values in RSF file\n"); printf("KEY OPTIONS:\n"); - printf(" -target Target for crypto, defaults to 't'\n"); + printf(" -target Target for crypto, defaults to 't'\n"); printf(" 't' Test(false) Keys & prod Certs\n"); printf(" 'd' Development Keys & Certs\n"); printf(" 'p' Production Keys & Certs\n"); + printf(" 'g' Production Keys & Certs for GW3DS only\n"); printf(" -ckeyid Override the automatic common key selection\n"); printf(" -ncchseckey Ncch keyX index ('0'=1.0+, '1'=7.0+)\n"); printf(" -showkeys Display the loaded key chain\n"); diff --git a/makerom/user_settings.h b/makerom/user_settings.h index 89d9a9e..561429a 100644 --- a/makerom/user_settings.h +++ b/makerom/user_settings.h @@ -62,10 +62,8 @@ static const char output_extention[5][5] = {".cxi",".cfa",".cci",".cia",".app"}; typedef struct { struct{ - // Booleans // Booleans bool MediaFootPadding; - //bool NoPadding; // DELETE bool AllowUnalignedSection; bool EnableCrypt; bool EnableCompress; @@ -74,10 +72,6 @@ typedef struct // Strings char *PageSize; - - // String Collections - //u32 AppendSystemCallNum; // DELETE - //char **AppendSystemCall; // DELETE } Option; struct{ @@ -90,13 +84,10 @@ typedef struct bool PermitMainFunctionArgument; bool CanShareDeviceMemory; bool UseOtherVariationSaveData; - bool UseExtSaveData; - bool UseExtendedSaveDataAccessControl; bool RunnableOnSleep; bool SpecialMemoryArrange; // Strings - //char *ProgramId; // DELETE char *IdealProcessor; char *Priority; char *MemoryType; @@ -112,7 +103,6 @@ typedef struct char *AffinityMask; // Strings From DESC char *DescVersion; - //char *CryptoKey; // DELETE char *ResourceLimitCategory; char *ReleaseKernelMajor; char *ReleaseKernelMinor; @@ -133,8 +123,6 @@ typedef struct char **SystemCallAccess; u32 ServiceAccessControlNum; char **ServiceAccessControl; - u32 StorageIdNum; // DELETE - char **StorageId; // DELETE u32 AccessibleSaveDataIdsNum; char **AccessibleSaveDataIds; } AccessControlInfo; @@ -159,14 +147,11 @@ typedef struct char *ProductCode; char *ContentType; char *Logo; - //char *BackupMemoryType;// Delete - //char *InitialCode;// Delete } BasicInfo; struct{ // Strings - char *HostRoot; - //char *Padding; // DELETE + char *RootPath; // String Collections u32 DefaultRejectNum; @@ -177,7 +162,7 @@ typedef struct char **Include; u32 FileNum; char **File; - } Rom; + } RomFs; struct{ u32 TextNum; @@ -193,13 +178,11 @@ typedef struct struct{ // Strings - //char *Platform; // DELETE char *Category; char *UniqueId; char *Version; char *ContentsIndex; char *Variation; - //char *Use; // DELETE char *ChildIndex; char *DemoIndex; char *TargetCategory;