Fixed some errors and bad programming

This commit is contained in:
applestash
2014-06-21 18:21:22 +10:00
parent 5ffe17390c
commit dc8de388a3
11 changed files with 246 additions and 259 deletions
+77 -76
View File
@@ -15,57 +15,57 @@ const int RSF_RSA_DATA_LEN = 344;
const int RSF_DESC_DATA_LEN = 684;
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 **desc, u8 **accessDesc, u8 **depList, ncch_settings *ncchset);
int accessdesc_SignWithKey(exheader_settings *exhdrset);
int accessdesc_GetSignFromRsf(exheader_settings *exhdrset);
int accessdesc_GetSignFromPreset(exheader_settings *exhdrset);
void accessdesc_GetPresetData(u8 **desc, u8 **accessDesc, u8 **depList, keys_struct *keys);
#ifndef PUBLIC_BUILD
void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, ncch_settings *ncchset);
void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, keys_struct *keys);
#endif
bool IsValidB64Char(char chr);
u32 b64_strlen(char *str);
void b64_strcpy(char *dst, char *src);
int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset)
int set_AccessDesc(exheader_settings *exhdrset)
{
if(exhdrset->useAccessDescPreset)
return accessdesc_GetSignFromPreset(exhdrset,ncchset);
else 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);
return accessdesc_GetSignFromPreset(exhdrset);
else if(exhdrset->rsf->CommonHeaderKey.Found) // Keydata exists in RSF
return accessdesc_GetSignFromRsf(exhdrset);
else if(!exhdrset->keys->rsa.requiresPresignedDesc) // Else if The AccessDesc can be signed with key
return accessdesc_SignWithKey(exhdrset);
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;
}
}
int accessdesc_SignWithKey(exheader_settings *exhdrset, ncch_settings *ncchset)
int accessdesc_SignWithKey(exheader_settings *exhdrset)
{
/* 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);
memcpy(&exhdrset->acexDesc->ncchRsaPubKey,exhdrset->keys->rsa.cxiHdrPub,0x100);
/* Copy Data From ExHeader */
memcpy(&exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities,&exhdrset->exHdr->arm11SystemLocalCapabilities,sizeof(exhdr_ARM11SystemLocalCapabilities));
memcpy(&exhdrset->exHdr->accessDescriptor.arm11KernelCapabilities,&exhdrset->exHdr->arm11KernelCapabilities,sizeof(exhdr_ARM11KernelCapabilities));
memcpy(&exhdrset->exHdr->accessDescriptor.arm9AccessControlInfo,&exhdrset->exHdr->arm9AccessControlInfo,sizeof(exhdr_ARM9AccessControlInfo));
memcpy(&exhdrset->acexDesc->arm11SystemLocalCapabilities,&exhdrset->exHdr->arm11SystemLocalCapabilities,sizeof(exhdr_ARM11SystemLocalCapabilities));
memcpy(&exhdrset->acexDesc->arm11KernelCapabilities,&exhdrset->exHdr->arm11KernelCapabilities,sizeof(exhdr_ARM11KernelCapabilities));
memcpy(&exhdrset->acexDesc->arm9AccessControlInfo,&exhdrset->exHdr->arm9AccessControlInfo,sizeof(exhdr_ARM9AccessControlInfo));
/* Adjust Data */
u8 *flag = &exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities.flag;
u8 *flag = &exhdrset->acexDesc->arm11SystemLocalCapabilities.flag;
u8 SystemMode = (*flag>>4)&0xF;
u8 AffinityMask = (*flag>>2)&0x3;
u8 IdealProcessor = 1<<((*flag>>0)&0x3);
*flag = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor);
exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities.priority /= 2;
exhdrset->acexDesc->arm11SystemLocalCapabilities.priority /= 2;
/* Sign AccessDesc */
return SignAccessDesc(exhdrset->exHdr,exhdrset->keys);
return SignAccessDesc(exhdrset->acexDesc,exhdrset->keys);
}
int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchset)
int accessdesc_GetSignFromRsf(exheader_settings *exhdrset)
{
/* Yaml Option Sanity Checks */
if(!exhdrset->rsf->CommonHeaderKey.Found){
@@ -127,14 +127,14 @@ int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchse
/* Set AccessDesc */
out = 0x100;
result = base64_decode(exhdrset->exHdr->accessDescriptor.signature,(size_t *)&out,(const u8*)exhdrset->rsf->CommonHeaderKey.AccCtlDescSign, strlen( exhdrset->rsf->CommonHeaderKey.AccCtlDescSign));
result = base64_decode(exhdrset->acexDesc->signature,(size_t *)&out,(const u8*)exhdrset->rsf->CommonHeaderKey.AccCtlDescSign, strlen( exhdrset->rsf->CommonHeaderKey.AccCtlDescSign));
if(out != 0x100)
result = POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL;
if(result) goto finish;
memcpy(exhdrset->exHdr->accessDescriptor.ncchRsaPubKey,exhdrset->keys->rsa.cxiHdrPub,0x100);
memcpy(exhdrset->acexDesc->ncchRsaPubKey,exhdrset->keys->rsa.cxiHdrPub,0x100);
out = 0x200;
result = base64_decode((u8*)&exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities,(size_t *)&out,(const u8*)exhdrset->rsf->CommonHeaderKey.AccCtlDescBin,strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescBin));
result = base64_decode((u8*)&exhdrset->acexDesc->arm11SystemLocalCapabilities,(size_t *)&out,(const u8*)exhdrset->rsf->CommonHeaderKey.AccCtlDescBin,strlen(exhdrset->rsf->CommonHeaderKey.AccCtlDescBin));
if(out != 0x200)
result = POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL;
if(result) goto finish;
@@ -142,7 +142,7 @@ finish:
return result;
}
int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncchset)
int accessdesc_GetSignFromPreset(exheader_settings *exhdrset)
{
u8 *desc = NULL;
u8 *accessDesc = NULL;
@@ -152,9 +152,9 @@ int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncc
u8 *cxiPubk = NULL;
u8 *cxiPvtk = NULL;
accessdesc_GetPresetData(&desc,&accessDesc,&depList,ncchset);
accessdesc_GetPresetData(&desc,&accessDesc,&depList,exhdrset->keys);
#ifndef PUBLIC_BUILD
accessdesc_GetPresetSigData(&accessDescSig,&cxiPubk,&cxiPvtk,ncchset);
accessdesc_GetPresetSigData(&accessDescSig,&cxiPubk,&cxiPvtk,exhdrset->keys);
#endif
// Error Checking
@@ -163,11 +163,12 @@ int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncc
return CANNOT_SIGN_ACCESSDESC;
}
if((!cxiPubk || !cxiPvtk || !accessDesc || !accessDescSig) && ncchset->keys->rsa.requiresPresignedDesc){
if((!cxiPubk || !cxiPvtk || !accessDesc || !accessDescSig) && exhdrset->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);
@@ -191,23 +192,23 @@ int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncc
// Setting AccessDesc Area
// Signing normally if possible
if(!ncchset->keys->rsa.requiresPresignedDesc)
return accessdesc_SignWithKey(exhdrset,ncchset);
if(!exhdrset->keys->rsa.requiresPresignedDesc)
return accessdesc_SignWithKey(exhdrset);
// Otherwise set static data & ncch hdr sig info
memcpy(exhdrset->keys->rsa.cxiHdrPub,cxiPubk,0x100);
memcpy(exhdrset->keys->rsa.cxiHdrPvt,cxiPvtk,0x100);
memcpy(&exhdrset->exHdr->accessDescriptor.signature,accessDescSig,0x100);
memcpy(&exhdrset->exHdr->accessDescriptor.ncchRsaPubKey,cxiPubk,0x100);
memcpy(&exhdrset->exHdr->accessDescriptor.arm11SystemLocalCapabilities,accessDesc,0x200);
memcpy(&exhdrset->acexDesc->signature,accessDescSig,0x100);
memcpy(&exhdrset->acexDesc->ncchRsaPubKey,cxiPubk,0x100);
memcpy(&exhdrset->acexDesc->arm11SystemLocalCapabilities,accessDesc,0x200);
return 0;
}
void accessdesc_GetPresetData(u8 **desc, u8 **accessDesc, u8 **depList, ncch_settings *ncchset)
void accessdesc_GetPresetData(u8 **desc, u8 **accessDesc, u8 **depList, keys_struct *keys)
{
if(ncchset->keys->accessDescSign.presetType == desc_preset_APP){
switch(ncchset->keys->accessDescSign.targetFirmware){
if(keys->accessDescSign.presetType == desc_preset_APP){
switch(keys->accessDescSign.targetFirmware){
case 0x1B:
case 0x1C:
*desc = (u8*)app_fw1B_desc_data;
@@ -247,8 +248,8 @@ void accessdesc_GetPresetData(u8 **desc, u8 **accessDesc, u8 **depList, ncch_set
}
}
else if(ncchset->keys->accessDescSign.presetType == desc_preset_EC_APP){
switch(ncchset->keys->accessDescSign.targetFirmware){
else if(keys->accessDescSign.presetType == desc_preset_EC_APP){
switch(keys->accessDescSign.targetFirmware){
case 0x20:
*desc = (u8*)ecapp_fw20_desc_data;
*accessDesc = (u8*)ecapp_fw20_acex_data;
@@ -261,8 +262,8 @@ void accessdesc_GetPresetData(u8 **desc, u8 **accessDesc, u8 **depList, ncch_set
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == desc_preset_DLP){
switch(ncchset->keys->accessDescSign.targetFirmware){
else if(keys->accessDescSign.presetType == desc_preset_DLP){
switch(keys->accessDescSign.targetFirmware){
case 0x1B:
case 0x1C:
*desc = (u8*)dlp_fw1B_desc_data;
@@ -281,8 +282,8 @@ void accessdesc_GetPresetData(u8 **desc, u8 **accessDesc, u8 **depList, ncch_set
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == desc_preset_DEMO){
switch(ncchset->keys->accessDescSign.targetFirmware){
else if(keys->accessDescSign.presetType == desc_preset_DEMO){
switch(keys->accessDescSign.targetFirmware){
case 0x1E:
*desc = (u8*)demo_fw1E_desc_data;
*accessDesc = (u8*)demo_fw1E_acex_data;
@@ -295,8 +296,8 @@ void accessdesc_GetPresetData(u8 **desc, u8 **accessDesc, u8 **depList, ncch_set
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == desc_preset_FIRM){
switch(ncchset->keys->accessDescSign.targetFirmware){
else if(keys->accessDescSign.presetType == desc_preset_FIRM){
switch(keys->accessDescSign.targetFirmware){
default:
*desc = (u8*)firm_fw26_desc_data;
*accessDesc = (u8*)firm_fw26_acex_data;
@@ -307,75 +308,75 @@ void accessdesc_GetPresetData(u8 **desc, u8 **accessDesc, u8 **depList, ncch_set
}
#ifndef PUBLIC_BUILD
void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, ncch_settings *ncchset)
void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk, keys_struct *keys)
{
if(ncchset->keys->accessDescSign.presetType == desc_preset_APP){
switch(ncchset->keys->accessDescSign.targetFirmware){
if(keys->accessDescSign.presetType == desc_preset_APP){
switch(keys->accessDescSign.targetFirmware){
case 0x1B:
case 0x1C:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)app_fw1B_dev_acexsig;
*cxiPubk = (u8*)app_fw1B_dev_hdrpub;
*cxiPvtk = (u8*)app_fw1B_dev_hdrpvt;
}
break;
case 0x1D:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)app_fw1D_dev_acexsig;
*cxiPubk = (u8*)app_fw1D_dev_hdrpub;
*cxiPvtk = (u8*)app_fw1D_dev_hdrpvt;
}
if(ncchset->keys->keyset == pki_PRODUCTION){
if(keys->keyset == pki_PRODUCTION){
*accessDescSig = (u8*)app_fw1D_prod_acexsig;
*cxiPubk = (u8*)app_fw1D_prod_hdrpub;
*cxiPvtk = NULL;
}
break;
case 0x1E:
if(ncchset->keys->keyset == pki_PRODUCTION){
if(keys->keyset == pki_PRODUCTION){
*accessDescSig = (u8*)app_fw1E_prod_acexsig;
*cxiPubk = (u8*)app_fw1E_prod_hdrpub;
*cxiPvtk = NULL;
}
break;
case 0x20:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)app_fw20_dev_acexsig;
*cxiPubk = (u8*)app_fw20_dev_hdrpub;
*cxiPvtk = NULL;
}
else if(ncchset->keys->keyset == pki_PRODUCTION){
else if(keys->keyset == pki_PRODUCTION){
*accessDescSig = (u8*)app_fw20_prod_acexsig;
*cxiPubk = (u8*)app_fw20_prod_hdrpub;
*cxiPvtk = NULL;
}
break;
case 0x21:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)app_fw21_dev_acexsig;
*cxiPubk = (u8*)app_fw21_dev_hdrpub;
*cxiPvtk = (u8*)app_fw21_dev_hdrpvt;
}
else if(ncchset->keys->keyset == pki_PRODUCTION){
else if(keys->keyset == pki_PRODUCTION){
*accessDescSig = (u8*)app_fw21_prod_acexsig;
*cxiPubk = (u8*)app_fw21_prod_hdrpub;
*cxiPvtk = NULL;
}
break;
case 0x23:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)app_fw23_dev_acexsig;
*cxiPubk = (u8*)app_fw23_dev_hdrpub;
*cxiPvtk = NULL;
}
else if(ncchset->keys->keyset == pki_PRODUCTION){
else if(keys->keyset == pki_PRODUCTION){
*accessDescSig = (u8*)app_fw23_prod_acexsig;
*cxiPubk = (u8*)app_fw23_prod_hdrpub;
*cxiPvtk = NULL;
}
break;
case 0x27:
if(ncchset->keys->keyset == pki_PRODUCTION){
if(keys->keyset == pki_PRODUCTION){
*accessDescSig = (u8*)app_fw27_prod_acexsig;
*cxiPubk = (u8*)app_fw27_prod_hdrpub;
*cxiPvtk = NULL;
@@ -384,17 +385,17 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk,
}
}
else if(ncchset->keys->accessDescSign.presetType == desc_preset_EC_APP){
switch(ncchset->keys->accessDescSign.targetFirmware){
else if(keys->accessDescSign.presetType == desc_preset_EC_APP){
switch(keys->accessDescSign.targetFirmware){
case 0x20:
if(ncchset->keys->keyset == pki_PRODUCTION){
if(keys->keyset == pki_PRODUCTION){
*accessDescSig = (u8*)ecapp_fw20_prod_acexsig;
*cxiPubk = (u8*)ecapp_fw20_prod_hdrpub;
*cxiPvtk = NULL;
}
break;
case 0x23:
if(ncchset->keys->keyset == pki_PRODUCTION){
if(keys->keyset == pki_PRODUCTION){
*accessDescSig = (u8*)ecapp_fw23_prod_acexsig;
*cxiPubk = (u8*)ecapp_fw23_prod_hdrpub;
*cxiPvtk = NULL;
@@ -402,25 +403,25 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk,
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == desc_preset_DLP){
switch(ncchset->keys->accessDescSign.targetFirmware){
else if(keys->accessDescSign.presetType == desc_preset_DLP){
switch(keys->accessDescSign.targetFirmware){
case 0x1B:
case 0x1C:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)dlp_fw1B_dev_acexsig;
*cxiPubk = (u8*)dlp_fw1B_dev_hdrpub;
*cxiPvtk = (u8*)dlp_fw1B_dev_hdrpvt;
}
break;
case 0x1D:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)dlp_fw1D_dev_acexsig;
*cxiPubk = (u8*)dlp_fw1D_dev_hdrpub;
*cxiPvtk = (u8*)dlp_fw1D_dev_hdrpvt;
}
break;
case 0x21:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)dlp_fw21_dev_acexsig;
*cxiPubk = (u8*)dlp_fw21_dev_hdrpub;
*cxiPvtk = (u8*)dlp_fw21_dev_hdrpvt;
@@ -428,17 +429,17 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk,
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == desc_preset_DEMO){
switch(ncchset->keys->accessDescSign.targetFirmware){
else if(keys->accessDescSign.presetType == desc_preset_DEMO){
switch(keys->accessDescSign.targetFirmware){
case 0x1E:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)demo_fw1E_dev_acexsig;
*cxiPubk = (u8*)demo_fw1E_dev_hdrpub;
*cxiPvtk = NULL;
}
break;
case 0x21:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)demo_fw21_dev_acexsig;
*cxiPubk = (u8*)demo_fw21_dev_hdrpub;
*cxiPvtk = (u8*)demo_fw21_dev_hdrpvt;
@@ -446,10 +447,10 @@ void accessdesc_GetPresetSigData(u8 **accessDescSig, u8 **cxiPubk, u8 **cxiPvtk,
break;
}
}
else if(ncchset->keys->accessDescSign.presetType == desc_preset_FIRM){
switch(ncchset->keys->accessDescSign.targetFirmware){
else if(keys->accessDescSign.presetType == desc_preset_FIRM){
switch(keys->accessDescSign.targetFirmware){
case 0x26:
if(ncchset->keys->keyset == pki_DEVELOPMENT){
if(keys->keyset == pki_DEVELOPMENT){
*accessDescSig = (u8*)firm_fw26_dev_acexsig;
*cxiPubk = (u8*)firm_fw26_dev_hdrpub;
*cxiPvtk = NULL;
@@ -492,6 +493,6 @@ void b64_strcpy(char *dst, char *src)
}
dst[j] = 0;
memdump(stdout,"src: ",(u8*)src,src_len+1);
memdump(stdout,"dst: ",(u8*)dst,j+1);
}
//memdump(stdout,"src: ",(u8*)src,src_len+1);
//memdump(stdout,"dst: ",(u8*)dst,j+1);
}