makerom v0.6

This commit is contained in:
3DSGuy
2014-04-08 13:09:00 +08:00
parent 26772b49c8
commit 9cb89cbe8b
59 changed files with 2935 additions and 2662 deletions
+12 -359
View File
@@ -1,15 +1,9 @@
#include "lib.h"
#include "ncch.h"
#include "exheader.h"
#include "accessdesc.h"
#include "titleid.h"
#include "polarssl/base64.h"
#include "desc_presets.h"
#ifndef PUBLIC_BUILD
#include "desc_dev_sigdata.h"
#include "desc_prod_sigdata.h"
#endif
/* Prototypes */
void init_ExHeaderSettings(exheader_settings *exhdrset);
@@ -56,16 +50,6 @@ void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Nu
u32 GetDescPrefixMask(int numPrefixBits);
u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal);
int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *rsf);
int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset);
int accessdesc_SignWithKey(exheader_settings *exhdrset, ncch_settings *ncchset);
int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchset);
int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncchset);
void accessdesc_GetPresetData(u8 **AccessDescData, u8 **DepList, ncch_settings *ncchset);
#ifndef PUBLIC_BUILD
void accessdesc_GetPresetSigData(u8 **AccessDescSig, u8 **CXI_Pubk, u8 **CXI_Privk, ncch_settings *ncchset);
#endif
void ErrorParamNotFound(char *string);
/* ExHeader Signature Functions */
int SignAccessDesc(extended_hdr *exHdr, keys_struct *keys)
@@ -104,8 +88,6 @@ int BuildExHeader(ncch_settings *ncchset)
result = set_AccessDesc(exhdrset,ncchset);
if(result) goto finish;
exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities.flags[6] = 5;
finish:
if(result) fprintf(stderr,"[EXHEADER ERROR] Failed to create ExHeader\n");
free_ExHeaderSettings(exhdrset);
@@ -169,9 +151,9 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings *
/* Set Simple Flags */
if(ncchset->options.CompressCode)
exhdrset->exHdr->codeSetInfo.flags.flag |= Compress;
exhdrset->exHdr->codeSetInfo.flag |= Compress;
if(ncchset->options.UseOnSD)
exhdrset->exHdr->codeSetInfo.flags.flag |= RetailSDAppFlag;
exhdrset->exHdr->codeSetInfo.flag |= RetailSDAppFlag;
if(!ncchset->options.UseRomFS) // Move this later
exhdrset->exHdr->arm11SystemLocalCapabilities.storageInfo.otherAttributes |= attribute_NOT_USE_ROMFS;
@@ -233,10 +215,10 @@ int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *rsf)
/* Remaster Version */
if(rsf->SystemControlInfo.RemasterVersion){
u16 RemasterVersion = strtol(rsf->SystemControlInfo.RemasterVersion,NULL,0);
u16_to_u8(CodeSetInfo->flags.remasterVersion,RemasterVersion,LE);
u16_to_u8(CodeSetInfo->remasterVersion,RemasterVersion,LE);
}
else{
u16_to_u8(CodeSetInfo->flags.remasterVersion,0,LE);
u16_to_u8(CodeSetInfo->remasterVersion,0,LE);
}
return 0;
}
@@ -325,14 +307,14 @@ int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_
/* Core Version */
if(rsf->AccessControlInfo.CoreVersion){
u32 Version = strtoul(rsf->AccessControlInfo.CoreVersion,NULL,0);
u32_to_u8(&arm11->flags[0],Version,LE);
u32_to_u8(arm11->coreVersion,Version,LE);
}
else{
ErrorParamNotFound("AccessControlInfo/CoreVersion");
return EXHDR_BAD_YAML_OPT;
}
/* Byte[6] */
/* Flag */
u8 AffinityMask = 0;
u8 IdealProcessor = 0;
u8 SystemMode = 0;
@@ -357,7 +339,7 @@ int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_
return EXHDR_BAD_YAML_OPT;
}
}
arm11->flags[6] = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor);
arm11->flag = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor);
/* Thread Priority */
if(rsf->AccessControlInfo.Priority){
@@ -371,7 +353,7 @@ int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_
fprintf(stderr,"[EXHEADER ERROR] Invalid Priority: %d\n",Priority);
return EXHDR_BAD_YAML_OPT;
}
arm11->flags[7] = Priority;
arm11->priority = Priority;
}
else{
ErrorParamNotFound("AccessControlInfo/Priority");
@@ -1162,336 +1144,7 @@ int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_set
int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset)
{
if(ncchset->keys->accessDescSign.presetType == not_preset){
if(ncchset->rsfSet->CommonHeaderKey.Found) // Keydata exists in RSF
return accessdesc_GetSignFromRsf(exhdrset,ncchset);
else if(!ncchset->keys->rsa.requiresPresignedDesc) // Else if The AccessDesc can be signed with key
return accessdesc_SignWithKey(exhdrset,ncchset);
else{ // No way the access desc signature can be 'obtained'
fprintf(stderr,"[EXHEADER ERROR] Current keyset cannot sign AccessDesc, please appropriatly setup RSF, or specify a preset with -accessdesc\n");
return CANNOT_SIGN_ACCESSDESC;
}
}
return accessdesc_GetSignFromPreset(exhdrset,ncchset);
}
int accessdesc_SignWithKey(exheader_settings *exhdrset, ncch_settings *ncchset)
{
/* Set RSA Keys */
memcpy(exhdrset->keys->rsa.cxiHdrPvt,exhdrset->keys->rsa.cciCfaPvt,0x100);
memcpy(exhdrset->keys->rsa.cxiHdrPub,exhdrset->keys->rsa.cciCfaPub,0x100);
memcpy(&exhdrset->exHdr->accessDescriptor.ncchRsaPubKey,exhdrset->keys->rsa.cxiHdrPub,0x100);
/* Copy Data From ExHeader */
memcpy(&exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities,&exhdrset->exHdr->arm11SystemLocalCapabilities,sizeof(exhdr_ARM11SystemLocalCapabilities));
u8 *byte6 = &exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities.flags[6];
u8 SystemMode = (*byte6>>4)&0xF;
u8 AffinityMask = (*byte6>>2)&0x3;
u8 IdealProcessor = ((*byte6>>0)&0x3)+1;
*byte6 = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor);
memcpy(&exhdrset->exHdr->accessDescriptor.arm11KernelCapabilities,&exhdrset->exHdr->arm11KernelCapabilities,sizeof(exhdr_ARM11KernelCapabilities));
memcpy(&exhdrset->exHdr->accessDescriptor.arm9AccessControlInfo,&exhdrset->exHdr->arm9AccessControlInfo,sizeof(exhdr_ARM9AccessControlInfo));
/* Sign AccessDesc */
return SignAccessDesc(exhdrset->exHdr,exhdrset->keys);
}
int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchset)
{
/* Yaml Option Sanity Checks */
if(!exhdrset->rsf->CommonHeaderKey.Found){
fprintf(stderr,"[EXHEADER ERROR] RSF Section \"CommonHeaderKey\" not found\n");
return COMMON_HEADER_KEY_NOT_FOUND;
}
if(!exhdrset->rsf->CommonHeaderKey.D){
ErrorParamNotFound("CommonHeaderKey/D");
return COMMON_HEADER_KEY_NOT_FOUND;
}
if(strlen(exhdrset->rsf->CommonHeaderKey.D) != 350){
fprintf(stderr,"[EXHEADER ERROR] \"CommonHeaderKey/D\" has invalid length (%d)\n",strlen(exhdrset->rsf->CommonHeaderKey.D));
return COMMON_HEADER_KEY_NOT_FOUND;
}
if(!exhdrset->rsf->CommonHeaderKey.Modulus){
ErrorParamNotFound("CommonHeaderKey/Modulus");
return COMMON_HEADER_KEY_NOT_FOUND;
}
if(strlen(exhdrset->rsf->CommonHeaderKey.Modulus) != 350){
fprintf(stderr,"[EXHEADER ERROR] \"CommonHeaderKey/Modulus\" has invalid length (%d)\n",strlen(exhdrset->rsf->CommonHeaderKey.Modulus));
return COMMON_HEADER_KEY_NOT_FOUND;
}
if(!exhdrset->rsf->CommonHeaderKey.AccCtlDescSign){
ErrorParamNotFound("CommonHeaderKey/Signature");
return COMMON_HEADER_KEY_NOT_FOUND;
}
if(strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescSign) != 350){
fprintf(stderr,"[EXHEADER ERROR] \"CommonHeaderKey/Signature\" has invalid length (%d)\n",strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescSign));
return COMMON_HEADER_KEY_NOT_FOUND;
}
if(!exhdrset->rsf->CommonHeaderKey.AccCtlDescBin){
ErrorParamNotFound("CommonHeaderKey/Descriptor");
return COMMON_HEADER_KEY_NOT_FOUND;
}
if(strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescBin) != 695){
fprintf(stderr,"[EXHEADER ERROR] \"CommonHeaderKey/Descriptor\" has invalid length (%d)\n",strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescBin));
return COMMON_HEADER_KEY_NOT_FOUND;
}
/* Set RSA Keys */
int result = 0;
u32 out = 0x500;
u8 *tmp = malloc(0x500);
result = base64_decode(tmp,&out,(const u8*)exhdrset->rsf->CommonHeaderKey.Modulus,strlen(exhdrset->rsf->CommonHeaderKey.Modulus));
if(result) goto finish;
memcpy(exhdrset->keys->rsa.cxiHdrPub,tmp,0x100);
out = 0x500;
result = base64_decode(tmp,&out,(const u8*)exhdrset->rsf->CommonHeaderKey.D,strlen(exhdrset->rsf->CommonHeaderKey.D));
if(result) goto finish;
memcpy(exhdrset->keys->rsa.cxiHdrPvt,tmp,0x100);
/* Set AccessDesc */
out = 0x500;
result = base64_decode(tmp,&out,(const u8*)exhdrset->rsf->CommonHeaderKey.AccCtlDescSign,strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescSign));
if(result) goto finish;
memcpy(exhdrset->exHdr->accessDescriptor.signature,tmp,0x100);
memcpy(exhdrset->exHdr->accessDescriptor.ncchRsaPubKey,exhdrset->keys->rsa.cxiHdrPub,0x100);
out = 0x500;
result = base64_decode(tmp,&out,(const u8*)exhdrset->rsf->CommonHeaderKey.AccCtlDescBin,strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescBin));
if(result) goto finish;
memcpy(&exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities,tmp,0x200);
finish:
free(tmp);
return result;
}
int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncchset)
{
u8 *AccessDescData = NULL;
u8 *DepList = NULL;
u8 *AccessDescSig = NULL;
u8 *CXI_Pubk = NULL;
u8 *CXI_Privk = NULL;
accessdesc_GetPresetData(&AccessDescData,&DepList,ncchset);
#ifndef PUBLIC_BUILD
accessdesc_GetPresetSigData(&AccessDescSig,&CXI_Pubk,&CXI_Privk,ncchset);
#endif
// Error Checking
if(!AccessDescData || !DepList){
fprintf(stderr,"[EXHEADER ERROR] AccessDesc preset is unavailable, please configure RSF file\n");
return CANNOT_SIGN_ACCESSDESC;
}
if((!CXI_Pubk || !CXI_Privk || !AccessDescSig) && ncchset->keys->rsa.requiresPresignedDesc){
fprintf(stderr,"[EXHEADER ERROR] This AccessDesc preset needs to be signed, the current keyset is incapable of doing so. Please configure RSF file with the appropriate signature data.\n");
return CANNOT_SIGN_ACCESSDESC;
}
// Setting data in Exheader
// Dependency List
memcpy(exhdrset->exHdr->dependencyList,DepList,0x180);
// ARM11 Local Capabilities
exhdr_ARM11SystemLocalCapabilities *arm11local = (exhdr_ARM11SystemLocalCapabilities*)(AccessDescData);
// Backing Up Non Preset Details
u8 ProgramID[8];
memcpy(ProgramID,exhdrset->exHdr->arm11SystemLocalCapabilities.programId,8);
exhdr_StorageInfo StorageInfoBackup;
memcpy(&StorageInfoBackup,&exhdrset->exHdr->arm11SystemLocalCapabilities.storageInfo,sizeof(exhdr_StorageInfo));
// Setting Preset Data
memcpy(&exhdrset->exHdr->arm11SystemLocalCapabilities,arm11local,sizeof(exhdr_ARM11SystemLocalCapabilities));
// Restoring Non Preset Data
memcpy(exhdrset->exHdr->arm11SystemLocalCapabilities.programId,ProgramID,8);
memcpy(&exhdrset->exHdr->arm11SystemLocalCapabilities.storageInfo,&StorageInfoBackup,sizeof(exhdr_StorageInfo));
// Adjusting flags to prevent errors
u8 *byte6 = &exhdrset->exHdr->arm11SystemLocalCapabilities.flags[6];
u8 SystemMode = (*byte6>>4)&0xF;
u8 AffinityMask = (*byte6>>2)&0x3;
u8 IdealProcessor = ((*byte6>>0)&0x3)-1;
*byte6 = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor);
exhdrset->exHdr->arm11SystemLocalCapabilities.flags[7] = 0x30;
// ARM11 Kernel Capabilities
exhdr_ARM11KernelCapabilities *arm11kernel = (exhdr_ARM11KernelCapabilities*)(AccessDescData+sizeof(exhdr_ARM11SystemLocalCapabilities));
memcpy(&exhdrset->exHdr->arm11KernelCapabilities,arm11kernel,(sizeof(exhdr_ARM11KernelCapabilities)));
// ARM9 Access Control
exhdr_ARM9AccessControlInfo *arm9 = (exhdr_ARM9AccessControlInfo*)(AccessDescData+sizeof(exhdr_ARM11SystemLocalCapabilities)+sizeof(exhdr_ARM11KernelCapabilities));
memcpy(&exhdrset->exHdr->arm9AccessControlInfo,arm9,(sizeof(exhdr_ARM9AccessControlInfo)));
// Setting AccessDesc Area
// Signing normally if possible
if(!ncchset->keys->rsa.requiresPresignedDesc)
return accessdesc_SignWithKey(exhdrset,ncchset);
// Otherwise set static data & ncch hdr sig info
memcpy(exhdrset->keys->rsa.cxiHdrPub,CXI_Pubk,0x100);
memcpy(exhdrset->keys->rsa.cxiHdrPvt,CXI_Privk,0x100);
memcpy(&exhdrset->exHdr->accessDescriptor.signature,AccessDescSig,0x100);
memcpy(&exhdrset->exHdr->accessDescriptor.ncchRsaPubKey,CXI_Pubk,0x100);
memcpy(&exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities,AccessDescData,0x200);
return 0;
}
void accessdesc_GetPresetData(u8 **AccessDescData, u8 **DepList, ncch_settings *ncchset)
{
if(ncchset->keys->accessDescSign.presetType == app){
switch(ncchset->keys->accessDescSign.targetFirmware){
case 1:
*AccessDescData = (u8*)app_1_acex_data;
*DepList = (u8*)sdk1_dep_list;
break;
case 2:
*AccessDescData = (u8*)app_2_acex_data;
*DepList = (u8*)sdk2_dep_list;
break;
case 4:
case 5:
*AccessDescData = (u8*)app_4_acex_data;
*DepList = (u8*)sdk4_dep_list;
break;
case 7:
*AccessDescData = (u8*)app_7_acex_data;
*DepList = (u8*)sdk7_dep_list;
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == ec_app){
switch(ncchset->keys->accessDescSign.targetFirmware){
case 4:
case 5:
*AccessDescData = (u8*)ecapp_4_acex_data;
*DepList = (u8*)sdk4_dep_list;
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == dlp){
switch(ncchset->keys->accessDescSign.targetFirmware){
case 1:
*AccessDescData = (u8*)dlp_1_acex_data;
*DepList = (u8*)sdk1_dep_list;
break;
case 2:
*AccessDescData = (u8*)dlp_2_acex_data;
*DepList = (u8*)sdk2_dep_list;
break;
case 4:
case 5:
*AccessDescData = (u8*)dlp_4_acex_data;
*DepList = (u8*)sdk4_dep_list;
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == demo){
switch(ncchset->keys->accessDescSign.targetFirmware){
case 4:
case 5:
*AccessDescData = (u8*)demo_4_acex_data;
*DepList = (u8*)sdk4_dep_list;
break;
}
}
}
#ifndef PUBLIC_BUILD
void accessdesc_GetPresetSigData(u8 **AccessDescSig, u8 **CXI_Pubk, u8 **CXI_Privk, ncch_settings *ncchset)
{
if(ncchset->keys->accessDescSign.presetType == app){
switch(ncchset->keys->accessDescSign.targetFirmware){
case 1:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
*AccessDescSig = (u8*)app_1_dev_acexsig;
*CXI_Pubk = (u8*)app_1_dev_hdrpub;
*CXI_Privk = (u8*)app_1_dev_hdrpvt;
}
break;
case 2:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
*AccessDescSig = (u8*)app_2_dev_acexsig;
*CXI_Pubk = (u8*)app_2_dev_hdrpub;
*CXI_Privk = (u8*)app_2_dev_hdrpvt;
}
break;
case 4:
case 5:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
*AccessDescSig = (u8*)app_4_dev_acexsig;
*CXI_Pubk = (u8*)app_4_dev_hdrpub;
*CXI_Privk = (u8*)app_4_dev_hdrpvt;
}
else if(ncchset->keys->keyset == pki_PRODUCTION){
*AccessDescSig = (u8*)app_4_prod_acexsig;
*CXI_Pubk = (u8*)app_4_prod_hdrpub;
*CXI_Privk = NULL;
}
break;
case 7:
if(ncchset->keys->keyset == pki_PRODUCTION){
*AccessDescSig = (u8*)app_7_prod_acexsig;
*CXI_Pubk = (u8*)app_7_prod_hdrpub;
*CXI_Privk = NULL;
}
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == ec_app){
switch(ncchset->keys->accessDescSign.targetFirmware){
case 4:
case 5:
if(ncchset->keys->keyset == pki_PRODUCTION){
*AccessDescSig = (u8*)ecapp_4_prod_acexsig;
*CXI_Pubk = (u8*)ecapp_4_prod_hdrpub;
*CXI_Privk = NULL;
}
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == dlp){
switch(ncchset->keys->accessDescSign.targetFirmware){
case 1:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
*AccessDescSig = (u8*)dlp_1_dev_acexsig;
*CXI_Pubk = (u8*)dlp_1_dev_hdrpub;
*CXI_Privk = (u8*)dlp_1_dev_hdrpvt;
}
break;
case 2:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
*AccessDescSig = (u8*)dlp_2_dev_acexsig;
*CXI_Pubk = (u8*)dlp_2_dev_hdrpub;
*CXI_Privk = (u8*)dlp_2_dev_hdrpvt;
}
break;
case 4:
case 5:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
*AccessDescSig = (u8*)dlp_4_dev_acexsig;
*CXI_Pubk = (u8*)dlp_4_dev_hdrpub;
*CXI_Privk = (u8*)dlp_4_dev_hdrpvt;
}
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == demo){
switch(ncchset->keys->accessDescSign.targetFirmware){
case 4:
case 5:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
*AccessDescSig = (u8*)demo_4_dev_acexsig;
*CXI_Pubk = (u8*)demo_4_dev_hdrpub;
*CXI_Privk = (u8*)demo_4_dev_hdrpvt;
}
break;
}
}
}
#endif
/* Generic Exheader Errors */
void ErrorParamNotFound(char *string)
@@ -1531,7 +1184,7 @@ u8* GetAccessDesc_frm_exhdr(extended_hdr *hdr)
u16 GetRemasterVersion_frm_exhdr(extended_hdr *hdr)
{
return u8_to_u16(hdr->codeSetInfo.flags.remasterVersion,LE);
return u8_to_u16(hdr->codeSetInfo.remasterVersion,LE);
}
u64 GetSaveDataSize_frm_exhdr(extended_hdr *hdr)
@@ -1539,9 +1192,9 @@ u64 GetSaveDataSize_frm_exhdr(extended_hdr *hdr)
return u8_to_u64(hdr->systemInfo.savedataSize,LE);
}
int GetCoreVersion_frm_exhdr(u8 *Dest, extended_hdr *hdr)
void GetCoreVersion_frm_exhdr(u8 *Dest, extended_hdr *hdr)
{
return (int) memcpy(Dest,hdr->arm11SystemLocalCapabilities.flags,4);
memcpy(Dest,hdr->arm11SystemLocalCapabilities.coreVersion,4);
}
int GetDependencyList_frm_exhdr(u8 *Dest, extended_hdr *hdr)