void tmd_process(tmd_context* ctx, u32 actions) { if (ctx->buffer == 0) ctx->buffer = malloc(ctx->size); if (ctx->buffer) { fseeko64(ctx->file, ctx->offset, SEEK_SET); fread(ctx->buffer, 1, ctx->size, ctx->file); if (actions & InfoFlag) { tmd_print(ctx); } } }
void cia_process(cia_context* ctx, u32 actions) { fseek(ctx->file, 0, SEEK_SET); if (fread(&ctx->header, 1, sizeof(ctr_ciaheader), ctx->file) != sizeof(ctr_ciaheader)) { fprintf(stderr, "Error reading CIA header\n"); goto clean; } ctx->sizeheader = getle32(ctx->header.headersize); ctx->sizecert = getle32(ctx->header.certsize); ctx->sizetik = getle32(ctx->header.ticketsize); ctx->sizetmd = getle32(ctx->header.tmdsize); ctx->sizecontent = (u32)getle64(ctx->header.contentsize); ctx->sizemeta = getle32(ctx->header.metasize); ctx->offsetcerts = align(ctx->sizeheader, 64); ctx->offsettik = align(ctx->offsetcerts + ctx->sizecert, 64); ctx->offsettmd = align(ctx->offsettik + ctx->sizetik, 64); ctx->offsetcontent = align(ctx->offsettmd + ctx->sizetmd, 64); ctx->offsetmeta = align(ctx->offsetcontent + ctx->sizecontent, 64); if (actions & InfoFlag) cia_print(ctx); tik_set_file(&ctx->tik, ctx->file); tik_set_offset(&ctx->tik, ctx->offsettik); tik_set_size(&ctx->tik, ctx->sizetik); tik_set_usersettings(&ctx->tik, ctx->usersettings); tik_process(&ctx->tik, actions); memset(ctx->iv, 0, 16); if (settings_get_common_key(ctx->usersettings)) tik_get_decrypted_titlekey(&ctx->tik, ctx->titlekey); tmd_set_file(&ctx->tmd, ctx->file); tmd_set_offset(&ctx->tmd, ctx->offsettmd); tmd_set_size(&ctx->tmd, ctx->sizetmd); tmd_set_usersettings(&ctx->tmd, ctx->usersettings); tmd_process(&ctx->tmd, actions); if (actions & VerifyFlag) { cia_verify_contents(ctx, actions); } if (actions & InfoFlag || actions & VerifyFlag) tmd_print(&ctx->tmd); if (actions & ExtractFlag) { cia_save(ctx, CIATYPE_CERTS, actions); cia_save(ctx, CIATYPE_TMD, actions); cia_save(ctx, CIATYPE_TIK, actions); cia_save(ctx, CIATYPE_META, actions); cia_save(ctx, CIATYPE_CONTENT, actions); } clean: return; }