diff --git a/ctrtool/cia.c b/ctrtool/cia.c index 030b09d..c0963a5 100644 --- a/ctrtool/cia.c +++ b/ctrtool/cia.c @@ -217,7 +217,9 @@ void cia_process(cia_context* ctx, u32 actions) if (settings_get_common_key(ctx->usersettings)) tik_get_decrypted_titlekey(&ctx->tik, ctx->titlekey); - + else if(settings_get_title_key(ctx->usersettings)) + memcpy(ctx->titlekey, settings_get_title_key(ctx->usersettings), 16); + tmd_set_file(&ctx->tmd, ctx->file); tmd_set_offset(&ctx->tmd, ctx->offsettmd); tmd_set_size(&ctx->tmd, ctx->sizetmd); diff --git a/ctrtool/keyset.cpp b/ctrtool/keyset.cpp index bc7e23c..f11e185 100644 --- a/ctrtool/keyset.cpp +++ b/ctrtool/keyset.cpp @@ -175,6 +175,8 @@ void keyset_merge(keyset* keys, keyset* src) keyset_set_key128(&keys->ncchfixedsystemkey, src->ncchfixedsystemkey.data); if (src->commonkey.valid) keyset_set_key128(&keys->commonkey, src->commonkey.data); + if (src->titlekey.valid) + keyset_set_key128(&keys->titlekey, src->titlekey.data); } void keyset_set_key128(key128* key, unsigned char* keydata) @@ -198,6 +200,16 @@ void keyset_parse_commonkey(keyset* keys, char* keytext, int keylen) keyset_parse_key128(&keys->commonkey, keytext, keylen); } +void keyset_set_titlekey(keyset* keys, unsigned char* keydata) +{ + keyset_set_key128(&keys->titlekey, keydata); +} + +void keyset_parse_titlekey(keyset* keys, char* keytext, int keylen) +{ + keyset_parse_key128(&keys->titlekey, keytext, keylen); +} + void keyset_set_ncchkey(keyset* keys, unsigned char* keydata) { keyset_set_key128(&keys->ncchkey, keydata); diff --git a/ctrtool/keyset.h b/ctrtool/keyset.h index f695f54..2cf2866 100644 --- a/ctrtool/keyset.h +++ b/ctrtool/keyset.h @@ -43,6 +43,7 @@ typedef struct typedef struct { key128 commonkey; + key128 titlekey; key128 ncchkey; key128 ncchfixedsystemkey; rsakey2048 ncsdrsakey; @@ -56,6 +57,8 @@ int keyset_load(keyset* keys, const char* fname, int verbose); void keyset_merge(keyset* keys, keyset* src); void keyset_set_commonkey(keyset* keys, unsigned char* keydata); void keyset_parse_commonkey(keyset* keys, char* keytext, int keylen); +void keyset_set_titlekey(keyset* keys, unsigned char* keydata); +void keyset_parse_titlekey(keyset* keys, char* keytext, int keylen); void keyset_set_ncchkey(keyset* keys, unsigned char* keydata); void keyset_parse_ncchkey(keyset* keys, char* keytext, int keylen); void keyset_set_ncchfixedsystemkey(keyset* keys, unsigned char* keydata); diff --git a/ctrtool/main.c b/ctrtool/main.c index 9f2b766..98671ab 100644 --- a/ctrtool/main.c +++ b/ctrtool/main.c @@ -53,6 +53,7 @@ static void usage(const char *argv0) " -y, --verify Verify hashes and signatures.\n" " --unitsize=size Set media unit size (default 0x200).\n" " --commonkey=key Set common key.\n" + " --titlekey=key Set tik title key.\n" " --ncchkey=key Set ncch key.\n" " --ncchsyskey=key Set ncch fixed system key.\n" " --showkeys Show the keys being used.\n" @@ -146,6 +147,7 @@ int main(int argc, char* argv[]) {"wavloops", 1, NULL, 19}, {"logo", 1, NULL, 20}, {"decompresscode", 0, NULL, 21}, + {"titlekey", 1, NULL, 22}, {NULL}, }; @@ -233,6 +235,7 @@ int main(int argc, char* argv[]) case 19: settings_set_cwav_loopcount(&ctx.usersettings, strtoul(optarg, 0, 0)); break; case 20: settings_set_logo_path(&ctx.usersettings, optarg); break; case 21: ctx.actions |= DecompressCodeFlag; break; + case 22: keyset_parse_titlekey(&tmpkeys, optarg, strlen(optarg)); break; default: usage(argv[0]); diff --git a/ctrtool/settings.c b/ctrtool/settings.c index 888bdc9..cbc7aec 100644 --- a/ctrtool/settings.c +++ b/ctrtool/settings.c @@ -152,6 +152,13 @@ unsigned char* settings_get_common_key(settings* usersettings) return 0; } +unsigned char* settings_get_title_key(settings* usersettings) +{ + if (usersettings && usersettings->keys.titlekey.valid) + return usersettings->keys.titlekey.data; + else + return 0; +} int settings_get_ignore_programid(settings* usersettings) { diff --git a/ctrtool/settings.h b/ctrtool/settings.h index 39d3c2d..c75bb94 100644 --- a/ctrtool/settings.h +++ b/ctrtool/settings.h @@ -47,6 +47,7 @@ unsigned int settings_get_mediaunit_size(settings* usersettings); unsigned char* settings_get_ncch_key(settings* usersettings); unsigned char* settings_get_ncch_fixedsystemkey(settings* usersettings); unsigned char* settings_get_common_key(settings* usersettings); +unsigned char* settings_get_title_key(settings* usersettings); int settings_get_ignore_programid(settings* usersettings); int settings_get_list_romfs_files(settings* usersettings); int settings_get_cwav_loopcount(settings* usersettings);