mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 13:42:47 +00:00
NCCH crypto: Workaround for unrecognized seeds in internal SEEDDB
This commit is contained in:
parent
ffc053a682
commit
b5f2c64e77
@ -67,6 +67,7 @@ u32 GetNcchSeed(u8* seed, NcchHeader* ncch) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// try to grab the seed from NAND database
|
// try to grab the seed from NAND database
|
||||||
|
const u32 seed_offset[2] = {SEEDSAVE_AREA_OFFSETS};
|
||||||
const char* nand_drv[] = {"1:", "4:"}; // SysNAND and EmuNAND
|
const char* nand_drv[] = {"1:", "4:"}; // SysNAND and EmuNAND
|
||||||
for (u32 i = 0; i < (sizeof(nand_drv)/sizeof(char*)); i++) {
|
for (u32 i = 0; i < (sizeof(nand_drv)/sizeof(char*)); i++) {
|
||||||
// grab the key Y from movable.sed
|
// grab the key Y from movable.sed
|
||||||
@ -84,23 +85,32 @@ u32 GetNcchSeed(u8* seed, NcchHeader* ncch) {
|
|||||||
nand_drv[i], sha256sum[0], sha256sum[1], sha256sum[2], sha256sum[3]);
|
nand_drv[i], sha256sum[0], sha256sum[1], sha256sum[2], sha256sum[3]);
|
||||||
|
|
||||||
// check seedsave for seed
|
// check seedsave for seed
|
||||||
u8* seedsave = (u8*) (TEMP_BUFFER + (TEMP_BUFFER_SIZE/2));
|
u8* seeddb[2];
|
||||||
|
seeddb[0] = (u8*) (TEMP_BUFFER + (TEMP_BUFFER_SIZE/2));
|
||||||
|
seeddb[1] = seeddb[0] + (SEEDSAVE_MAX_ENTRIES*(8+16));
|
||||||
if (f_open(&file, path, FA_READ | FA_OPEN_EXISTING) != FR_OK)
|
if (f_open(&file, path, FA_READ | FA_OPEN_EXISTING) != FR_OK)
|
||||||
continue;
|
continue;
|
||||||
f_read(&file, seedsave, 0x200, &btr);
|
f_read(&file, seeddb[0], 0x200, &btr);
|
||||||
u32 p_active = (getle32(seedsave + 0x168)) ? 1 : 0;
|
u32 p_active = (getle32(seeddb[0] + 0x168)) ? 1 : 0;
|
||||||
static const u32 seed_offset[2] = {SEEDSAVE_AREA_OFFSETS};
|
|
||||||
|
// read both partitions
|
||||||
for (u32 p = 0; p < 2; p++) {
|
for (u32 p = 0; p < 2; p++) {
|
||||||
f_lseek(&file, seed_offset[(p + p_active) % 2]);
|
f_lseek(&file, seed_offset[(p + p_active) % 2]);
|
||||||
f_read(&file, seedsave, SEEDSAVE_MAX_ENTRIES*(8+16), &btr);
|
f_read(&file, seeddb[p], SEEDSAVE_MAX_ENTRIES*(8+16), &btr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// search for the seed
|
||||||
|
for (u32 p = 0; p < 2; p++) {
|
||||||
for (u32 s = 0; s < SEEDSAVE_MAX_ENTRIES; s++) {
|
for (u32 s = 0; s < SEEDSAVE_MAX_ENTRIES; s++) {
|
||||||
if (titleId != getle64(seedsave + (s*8))) continue;
|
if (titleId != getle64(seeddb[p] + (s*8))) continue;
|
||||||
memcpy(lseed, seedsave + (SEEDSAVE_MAX_ENTRIES*8) + (s*16), 16);
|
for (u32 p0 = 0; p0 < 2; p0++) {
|
||||||
sha_quick(sha256sum, lseed, 16 + 8, SHA256_MODE);
|
memcpy(lseed, seeddb[(p+p0)%2] + (SEEDSAVE_MAX_ENTRIES*8) + (s*16), 16);
|
||||||
if (hash_seed == sha256sum[0]) {
|
sha_quick(sha256sum, lseed, 16 + 8, SHA256_MODE);
|
||||||
memcpy(seed, lseed, 16);
|
if (hash_seed == sha256sum[0]) {
|
||||||
f_close(&file);
|
memcpy(seed, lseed, 16);
|
||||||
return 0; // found!
|
f_close(&file);
|
||||||
|
return 0; // found!
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user