Example #1
0
int SetCardInfoNotes(cardinfo_hdr *hdr, cci_settings *set)
{
	u64_to_u8(hdr->notes.mediaSizeUsed,set->romInfo.usedSize,LE);
	u32_to_u8(hdr->notes.unknown,0,LE);
	
	if(set->options.tmdHdr){
		u64_to_u8(hdr->notes.cverTitleId,GetTmdTitleId(set->options.tmdHdr),LE);
		u16_to_u8(hdr->notes.cverTitleId,GetTmdVersion(set->options.tmdHdr),LE);
	}
		
	return 0;
}
Example #2
0
int ProcessCiaForCci(cci_settings *set)
{
	if(!IsCia(set->content.data)){
		fprintf(stderr,"[CCI ERROR] CIA is corrupt\n");
		return FAILED_TO_IMPORT_FILE;
	}
		
	tik_hdr *tik = GetTikHdr(GetCiaTik(set->content.data));
	tmd_hdr *tmd = GetTmdHdr(GetCiaTmd(set->content.data));
	tmd_content_chunk *contentInfo = GetTmdContentInfo(GetCiaTmd(set->content.data));
	u64 contentOffset = GetCiaContentOffset((cia_hdr*)set->content.data);
	
	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);
	if(set->options.verbose){
		if(canDecrypt)
			memdump(stdout,"[CCI] CIA title key: ",titleKey,AES_128_KEY_SIZE);
		else
			fprintf(stdout,"[CCI] CIA title key could not be decrypted\n");
	}
	
	for(u16 i = 0; i < contentCount; i++){
		u16 index = GetTmdContentIndex(contentInfo[i]);
		set->content.active[index] = true;
		set->content.dOffset[index] = contentOffset;
		set->content.dSize[index] = GetTmdContentSize(contentInfo[i]);
		u8 *content = set->content.data + contentOffset;
		if(IsTmdContentEncrypted(contentInfo[i])){
			if(canDecrypt)
				CryptContent(content,content,set->content.dSize[index],titleKey,i,DEC);
			else{
				fprintf(stderr,"[CCI ERROR] Failed to decrypt CIA content: 0x%08x\n",GetTmdContentId(contentInfo[i]));
				return INCOMPAT_CIA;
			}
		}
		if(!ValidateTmdContent(content,contentInfo[i])){
			fprintf(stderr,"[CCI ERROR] CIA content: 0x%08x is corrupt\n",GetTmdContentId(contentInfo[i]));
			return NCSD_INVALID_NCCH;
		}
		
		contentOffset += set->content.dSize[index];
	}
	
	return 0;
}