From b941838adbdee83d9ec91b735bed71004109bc1c Mon Sep 17 00:00:00 2001 From: jakcron Date: Mon, 20 Aug 2018 14:17:32 +0800 Subject: [PATCH] [ctrtool] Fix ctrtool bug where content wouldn't extract. --- ctrtool/cia.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/ctrtool/cia.c b/ctrtool/cia.c index a034763..6d4cdb8 100644 --- a/ctrtool/cia.c +++ b/ctrtool/cia.c @@ -42,6 +42,7 @@ void cia_save(cia_context* ctx, u32 type, u32 flags) u64 offset; u64 size; u16 contentflags; + u16 contentindex; u8 docrypto; filepath* path = 0; ctr_tmd_body *body; @@ -102,17 +103,18 @@ void cia_save(cia_context* ctx, u32 type, u32 flags) chunk = (ctr_tmd_contentchunk*)(body->contentinfo + (sizeof(ctr_tmd_contentinfo) * TMD_MAX_CONTENTS)); for(i = 0; i < getbe16(body->contentcount); i++) { - if(ctx->header.contentindex[i >> 3] & (0x80 >> (i & 7))) { - sprintf(tmpname, "%s.%04x.%08x", path->pathname, getbe16(chunk->index), getbe32(chunk->id)); - fprintf(stdout, "Saving content #%04x to %s\n", getbe16(chunk->index), tmpname); - - contentflags = getbe16(chunk->type); - docrypto = contentflags & 1 && !(flags & PlainFlag); + contentflags = getbe16(chunk->type); + contentindex = getbe16(chunk->index); + docrypto = (contentflags & 1) && !(flags & PlainFlag); + if(ctx->header.contentindex[contentindex >> 3] & (0x80 >> (contentindex & 7))) { + sprintf(tmpname, "%s.%04x.%08x", path->pathname, contentindex, getbe32(chunk->id)); + fprintf(stdout, "Saving content #%04x to %s\n", contentindex, tmpname); + if(docrypto) // Decrypt if needed { - ctx->iv[0] = (getbe16(chunk->index) >> 8) & 0xff; - ctx->iv[1] = getbe16(chunk->index) & 0xff; + ctx->iv[0] = (contentindex >> 8) & 0xff; + ctx->iv[1] = contentindex & 0xff; ctr_init_cbc_decrypt(&ctx->aes, ctx->titlekey, ctx->iv); }