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; }
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; }