mirror of
https://github.com/DarkStore-3DS/Project_CTR.git
synced 2026-07-03 00:39:14 +00:00
Merge pull request #13 from 3DSGuy/unstable
refactored cia code & fixed bugs
This commit is contained in:
+17
-19
@@ -166,7 +166,7 @@ int GetSettingsFromUsrset(cia_settings *ciaset, user_settings *usrset)
|
||||
ciaset->content.includeUpdateNcch = usrset->cia.includeUpdateNcch;
|
||||
ciaset->verbose = usrset->common.verbose;
|
||||
|
||||
u32_to_u8(ciaset->tmd.titleType,TYPE_CTR,BE);
|
||||
ciaset->tmd.titleType = TYPE_CTR;
|
||||
ciaset->content.encryptCia = usrset->common.rsfSet.Option.EnableCrypt;
|
||||
ciaset->content.IsDlc = usrset->cia.DlcContent;
|
||||
if(ciaset->keys->aes.commonKey[ciaset->keys->aes.currentCommonKey] == NULL && ciaset->content.encryptCia){
|
||||
@@ -182,10 +182,10 @@ int GetSettingsFromUsrset(cia_settings *ciaset, user_settings *usrset)
|
||||
}
|
||||
|
||||
// Ticket Data
|
||||
rndset(ciaset->tik.ticketId,8);
|
||||
u32_to_u8(ciaset->tik.deviceId,usrset->cia.deviceId,BE);
|
||||
u32_to_u8(ciaset->tik.eshopAccId,usrset->cia.eshopAccId,BE);
|
||||
ciaset->tik.licenceType = 0;
|
||||
ciaset->tik.ticketId = u64GetRand();
|
||||
ciaset->tik.deviceId = usrset->cia.deviceId;
|
||||
ciaset->tik.eshopAccId = usrset->cia.eshopAccId;
|
||||
ciaset->tik.licenceType = lic_Permanent;
|
||||
ciaset->tik.audit = 0;
|
||||
|
||||
if(usrset->cia.randomTitleKey)
|
||||
@@ -208,6 +208,7 @@ int GetSettingsFromUsrset(cia_settings *ciaset, user_settings *usrset)
|
||||
ciaset->content.id[0] = usrset->cia.contentId[0];
|
||||
|
||||
ciaset->tmd.formatVersion = 1;
|
||||
ciaset->tmd.accessRights = 0;
|
||||
result = GenCertChildIssuer(ciaset->tmd.issuer,ciaset->keys->certs.cpCert);
|
||||
return 0;
|
||||
}
|
||||
@@ -256,12 +257,12 @@ int GetSettingsFromNcch0(cia_settings *ciaset, u32 ncch0_offset)
|
||||
}
|
||||
|
||||
/* Gen Settings From Ncch0 */
|
||||
endian_memcpy(ciaset->common.titleId,hdr->titleId,8,LE);
|
||||
ciaset->common.titleId = u8_to_u64(hdr->titleId,LE);
|
||||
|
||||
|
||||
/* Getting ncch key */
|
||||
u8 *ncchkey = NULL;
|
||||
if(!ciaset->content.keyNotFound || IsNcchEncrypted(hdr)){
|
||||
if(!ciaset->content.keyNotFound && IsNcchEncrypted(hdr)){
|
||||
SetNcchKeys(ciaset->keys,hdr);
|
||||
ncchkey = ciaset->keys->aes.ncchKey0;
|
||||
if(ciaset->verbose){
|
||||
@@ -290,17 +291,15 @@ int GetTmdDataFromNcch(cia_settings *ciaset, u8 *ncch, ncch_info *ncch_ctx, u8 *
|
||||
if(key != NULL)
|
||||
CryptNcchRegion((u8*)exhdr,sizeof(extended_hdr),0,ncch_ctx,key,ncch_exhdr);
|
||||
|
||||
u16 Category = u8_to_u16((ciaset->common.titleId+2),BE);
|
||||
if(IsPatch(Category)||ciaset->content.IsCfa||ciaset->content.keyNotFound)
|
||||
u32_to_u8(ciaset->tmd.savedataSize,0,LE);
|
||||
else
|
||||
u32_to_u8(ciaset->tmd.savedataSize,(u32)GetSaveDataSize_frm_exhdr(exhdr),LE);
|
||||
|
||||
if(ciaset->rsf->SystemControlInfo.SaveDataSize && !ciaset->content.IsCfa && ciaset->content.keyNotFound){
|
||||
if(IsPatch(GetTidCategory(ciaset->common.titleId))||ciaset->content.IsCfa)
|
||||
ciaset->tmd.savedataSize = 0;
|
||||
else if(ciaset->content.keyNotFound && ciaset->rsf->SystemControlInfo.SaveDataSize){ // if it's a title which can have save data, but save data size could not be read from exhdr
|
||||
u64 size = 0;
|
||||
GetSaveDataSizeFromString(&size,ciaset->rsf->SystemControlInfo.SaveDataSize,"CIA");
|
||||
u32_to_u8(ciaset->tmd.savedataSize,(u32)size,LE);
|
||||
ciaset->tmd.savedataSize = (u32)(size & MAX_U32);
|
||||
}
|
||||
else
|
||||
ciaset->tmd.savedataSize = (u32)(GetSaveDataSize_frm_exhdr(exhdr) & MAX_U32);
|
||||
|
||||
if(ciaset->content.IsCfa||ciaset->content.keyNotFound){
|
||||
if(ciaset->common.titleVersion[VER_MAJOR] == MAX_U16){ // '-major' wasn't set
|
||||
@@ -479,8 +478,7 @@ int GetSettingsFromSrl(cia_settings *ciaset)
|
||||
}
|
||||
|
||||
// Generate and store Converted TitleID
|
||||
u64_to_u8(ciaset->common.titleId,ConvertTwlIdToCtrId(u8_to_u64(hdr->title_id,LE)),BE);
|
||||
//memdump(stdout,"SRL TID: ",ciaset->TitleID,8);
|
||||
ciaset->common.titleId = ConvertTwlIdToCtrId(u8_to_u64(hdr->title_id,LE));
|
||||
|
||||
// Get TWL Flag
|
||||
ciaset->tmd.twlFlag = ((hdr->reserved_flags[3] & 6) >> 1);
|
||||
@@ -491,8 +489,8 @@ int GetSettingsFromSrl(cia_settings *ciaset)
|
||||
ciaset->tmd.version = version;
|
||||
|
||||
// Get SaveDataSize (Public and Private)
|
||||
memcpy(ciaset->tmd.savedataSize,hdr->pubSaveDataSize,4);
|
||||
memcpy(ciaset->tmd.privSavedataSize,hdr->privSaveDataSize,4);
|
||||
ciaset->tmd.savedataSize = u8_to_u32(hdr->pubSaveDataSize,LE);
|
||||
ciaset->tmd.privSavedataSize = u8_to_u32(hdr->privSaveDataSize,LE);
|
||||
|
||||
// Setting CIA Content Settings
|
||||
ciaset->content.count = 1;
|
||||
|
||||
+8
-7
@@ -23,7 +23,7 @@ typedef struct
|
||||
bool verbose;
|
||||
|
||||
struct{
|
||||
u8 titleId[8];
|
||||
u64 titleId;
|
||||
u16 titleVersion[4];
|
||||
u8 titleKey[16];
|
||||
} common;
|
||||
@@ -40,11 +40,11 @@ typedef struct
|
||||
|
||||
u16 version;
|
||||
|
||||
u8 ticketId[8];
|
||||
u8 deviceId[4];
|
||||
u64 ticketId;
|
||||
u32 deviceId;
|
||||
u8 licenceType;
|
||||
u8 audit;
|
||||
u8 eshopAccId[4];
|
||||
u32 eshopAccId;
|
||||
} tik;
|
||||
|
||||
struct{
|
||||
@@ -52,10 +52,11 @@ typedef struct
|
||||
u8 formatVersion;
|
||||
|
||||
u16 version;
|
||||
u32 accessRights;
|
||||
|
||||
u8 titleType[4];
|
||||
u8 savedataSize[4];
|
||||
u8 privSavedataSize[4];
|
||||
u32 titleType;
|
||||
u32 savedataSize;
|
||||
u32 privSavedataSize;
|
||||
u8 twlFlag;
|
||||
} tmd;
|
||||
|
||||
|
||||
+14
-12
@@ -55,19 +55,21 @@ void SetupTicketHeader(tik_hdr *hdr, cia_settings *ciaset)
|
||||
hdr->formatVersion = ciaset->tik.formatVersion;
|
||||
hdr->caCrlVersion = ciaset->cert.caCrlVersion;
|
||||
hdr->signerCrlVersion = ciaset->cert.signerCrlVersion;
|
||||
if(ciaset->content.encryptCia)
|
||||
CryptTitleKey(hdr->encryptedTitleKey, ciaset->common.titleKey,ciaset->common.titleId,ciaset->keys,ENC);
|
||||
else
|
||||
rndset(hdr->encryptedTitleKey,16);
|
||||
memcpy(hdr->ticketId,ciaset->tik.ticketId,8);
|
||||
memcpy(hdr->deviceId,ciaset->tik.deviceId,4);
|
||||
memcpy(hdr->titleId,ciaset->common.titleId,8);
|
||||
u64_to_u8(hdr->ticketId,ciaset->tik.ticketId,BE);
|
||||
u32_to_u8(hdr->deviceId,ciaset->tik.deviceId,BE);
|
||||
u64_to_u8(hdr->titleId,ciaset->common.titleId,BE);
|
||||
u16_to_u8(hdr->ticketVersion,ciaset->tik.version,BE);
|
||||
hdr->licenceType = ciaset->tik.licenceType;
|
||||
hdr->keyId = ciaset->keys->aes.currentCommonKey;
|
||||
memcpy(hdr->eshopAccId,ciaset->tik.eshopAccId,4);
|
||||
u32_to_u8(hdr->eshopAccId,ciaset->tik.eshopAccId,BE);
|
||||
hdr->audit = ciaset->tik.audit;
|
||||
SetLimits(hdr,ciaset);
|
||||
|
||||
// Crypt TitleKey
|
||||
if(ciaset->content.encryptCia)
|
||||
CryptTitleKey(hdr->encryptedTitleKey, ciaset->common.titleKey, hdr->titleId, ciaset->keys, ENC);
|
||||
else
|
||||
rndset(hdr->encryptedTitleKey,AES_128_KEY_SIZE);
|
||||
}
|
||||
|
||||
int SignTicketHeader(buffer_struct *tik, keys_struct *keys)
|
||||
@@ -83,12 +85,12 @@ int SignTicketHeader(buffer_struct *tik, keys_struct *keys)
|
||||
return ctr_sig(data,len,sig->data,keys->rsa.xsPub,keys->rsa.xsPvt,RSA_2048_SHA256,CTR_RSA_SIGN);
|
||||
}
|
||||
|
||||
int CryptTitleKey(u8 *EncTitleKey, u8 *DecTitleKey, u8 *TitleID, keys_struct *keys, u8 mode)
|
||||
int CryptTitleKey(u8 *encKey, u8 *decKey, u8 *titleId, keys_struct *keys, u8 mode)
|
||||
{
|
||||
//Generating IV
|
||||
u8 iv[16];
|
||||
memset(&iv,0x0,16);
|
||||
memcpy(iv,TitleID,0x8);
|
||||
memcpy(iv,titleId,0x8);
|
||||
|
||||
//Setting up Aes Context
|
||||
ctr_aes_context ctx;
|
||||
@@ -96,8 +98,8 @@ int CryptTitleKey(u8 *EncTitleKey, u8 *DecTitleKey, u8 *TitleID, keys_struct *ke
|
||||
|
||||
//Crypting TitleKey
|
||||
ctr_init_aes_cbc(&ctx,keys->aes.commonKey[keys->aes.currentCommonKey],iv,mode);
|
||||
if(mode == ENC) ctr_aes_cbc(&ctx,DecTitleKey,EncTitleKey,0x10,ENC);
|
||||
else ctr_aes_cbc(&ctx,EncTitleKey,DecTitleKey,0x10,DEC);
|
||||
if(mode == ENC) ctr_aes_cbc(&ctx,decKey,encKey,0x10,ENC);
|
||||
else ctr_aes_cbc(&ctx,encKey,decKey,0x10,DEC);
|
||||
|
||||
// Return
|
||||
return 0;
|
||||
|
||||
@@ -14,6 +14,16 @@ u64 ConvertTwlIdToCtrId(u64 pgid)
|
||||
return 0x0004800000000000 | (pgid & 0x00007FFFFFFFFFFF);
|
||||
}
|
||||
|
||||
u16 GetTidCategory(u64 titleId)
|
||||
{
|
||||
return (titleId>>32) & MAX_U16;
|
||||
}
|
||||
|
||||
u32 GetTidUniqueId(u64 titleId)
|
||||
{
|
||||
return (titleId>>8) & 0xFFFFFF;
|
||||
}
|
||||
|
||||
int GetProgramID(u64 *dest, rsf_settings *rsf, bool IsForExheader)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -88,6 +88,9 @@ u64 ConvertTwlIdToCtrId(u64 pgid);
|
||||
int GetProgramID(u64 *dest, rsf_settings *rsf, bool IsForExheader);
|
||||
int GetUniqueID(u32 *dest, rsf_settings *rsf);
|
||||
|
||||
u16 GetTidCategory(u64 titleId);
|
||||
u32 GetTidUniqueId(u64 titleId);
|
||||
|
||||
bool IsDemo(u16 Category);
|
||||
bool IsSystem(u16 Category);
|
||||
bool IsDlpChild(u16 Category);
|
||||
|
||||
+6
-5
@@ -54,11 +54,12 @@ int SetupTMDHeader(tmd_hdr *hdr, tmd_content_info_record *info_record, cia_setti
|
||||
hdr->formatVersion = ciaset->tmd.formatVersion;
|
||||
hdr->caCrlVersion = ciaset->cert.caCrlVersion;
|
||||
hdr->signerCrlVersion = ciaset->cert.signerCrlVersion;
|
||||
memcpy(hdr->titleID,ciaset->common.titleId,8);
|
||||
memcpy(hdr->titleType,ciaset->tmd.titleType,4);
|
||||
memcpy(hdr->savedataSize,ciaset->tmd.savedataSize,4);
|
||||
memcpy(hdr->privSavedataSize,ciaset->tmd.privSavedataSize,4);
|
||||
u64_to_u8(hdr->titleID,ciaset->common.titleId,BE);
|
||||
u32_to_u8(hdr->titleType,ciaset->tmd.titleType,BE);
|
||||
u32_to_u8(hdr->savedataSize,ciaset->tmd.savedataSize,LE);
|
||||
u32_to_u8(hdr->privSavedataSize,ciaset->tmd.privSavedataSize,LE);
|
||||
hdr->twlFlag = ciaset->tmd.twlFlag;
|
||||
u32_to_u8(hdr->accessRights,ciaset->tmd.accessRights,BE);
|
||||
u16_to_u8(hdr->titleVersion,ciaset->tmd.version,BE);
|
||||
u16_to_u8(hdr->contentCount,ciaset->content.count,BE);
|
||||
ctr_sha(info_record,sizeof(tmd_content_info_record)*64,hdr->infoRecordHash,CTR_SHA_256);
|
||||
@@ -129,7 +130,7 @@ u64 GetTmdTitleId(tmd_hdr *hdr)
|
||||
|
||||
u32 GetTmdSaveSize(tmd_hdr *hdr)
|
||||
{
|
||||
return u8_to_u32(hdr->savedataSize,BE);
|
||||
return u8_to_u32(hdr->savedataSize,LE);
|
||||
}
|
||||
|
||||
u16 GetTmdContentCount(tmd_hdr *hdr)
|
||||
|
||||
Reference in New Issue
Block a user