From 310159f0cb9537299f98ebf292165df4e1159f91 Mon Sep 17 00:00:00 2001 From: d0k3 Date: Thu, 8 Dec 2016 13:06:56 +0100 Subject: [PATCH] SetNcchKey(): Prevent unnecessary usage of SHA registers --- source/game/ncch.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/source/game/ncch.c b/source/game/ncch.c index 8bb8cf7..5e0fe65 100644 --- a/source/game/ncch.c +++ b/source/game/ncch.c @@ -172,12 +172,18 @@ u32 SetNcchKey(NcchHeader* ncch, u32 keyid) { // key Y for seed and non seed if (keyid && (ncch->flags[7] & 0x20)) { // seed crypto - u8 keydata[16+16]; - u8 seedkeyY[16+16]; - memcpy(keydata, ncch->signature, 16); - if (GetNcchSeed(keydata + 16, ncch) != 0) - return 1; - sha_quick(seedkeyY, keydata, 32, SHA256_MODE); + static u8 seedkeyY[16+16] = { 0 }; + static u8 lsignature[16] = { 0 }; + static u64 ltitleId = 0; + if ((memcmp(lsignature, ncch->signature, 16) != 0) || (ltitleId != ncch->programId)) { + u8 keydata[16+16]; + memcpy(keydata, ncch->signature, 16); + if (GetNcchSeed(keydata + 16, ncch) != 0) + return 1; + sha_quick(seedkeyY, keydata, 32, SHA256_MODE); + memcpy(lsignature, ncch->signature, 16); + ltitleId = ncch->programId; + } setup_aeskeyY(keyslot, seedkeyY); } else { // no seed crypto setup_aeskeyY(keyslot, ncch->signature);