mirror of
https://github.com/shchmue/Lockpick_RCM.git
synced 2024-12-23 00:55:36 +00:00
Support pkg1+pkg2 mismatch and "dev.keys" filename
This commit is contained in:
parent
b464042f3a
commit
dae4c72910
|
@ -285,10 +285,6 @@ get_tsec: ;
|
||||||
// Dump package2.
|
// Dump package2.
|
||||||
u8 *pkg2 = NULL;
|
u8 *pkg2 = NULL;
|
||||||
pkg2_kip1_info_t *ki = NULL;
|
pkg2_kip1_info_t *ki = NULL;
|
||||||
if (!_key_exists(master_key[pkg1_id->kb])) {
|
|
||||||
EPRINTF("Current master key not found.\nUnable to decrypt Package2.");
|
|
||||||
goto pkg2_done;
|
|
||||||
}
|
|
||||||
|
|
||||||
sdmmc_storage_set_mmc_partition(&storage, 0);
|
sdmmc_storage_set_mmc_partition(&storage, 0);
|
||||||
// Parse eMMC GPT.
|
// Parse eMMC GPT.
|
||||||
|
@ -318,14 +314,24 @@ get_tsec: ;
|
||||||
pkg2 = malloc(pkg2_size_aligned);
|
pkg2 = malloc(pkg2_size_aligned);
|
||||||
nx_emmc_part_read(&storage, pkg2_part, 0x4000 / NX_EMMC_BLOCKSIZE, pkg2_size_aligned / NX_EMMC_BLOCKSIZE, pkg2);
|
nx_emmc_part_read(&storage, pkg2_part, 0x4000 / NX_EMMC_BLOCKSIZE, pkg2_size_aligned / NX_EMMC_BLOCKSIZE, pkg2);
|
||||||
|
|
||||||
// Decrypt package2 and parse KIP1 blobs in INI1 section.
|
// Decrypt package2 and parse KIP1 blobs in INI1 section. Try all available key generations in case of pkg1/pkg2 mismatch.
|
||||||
se_aes_key_set(8, master_key[pkg1_id->kb], 0x10);
|
pkg2_hdr_t *pkg2_hdr;
|
||||||
|
pkg2_hdr_t hdr;
|
||||||
|
u32 pkg2_kb;
|
||||||
|
for (pkg2_kb = 0; pkg2_kb < MAX_KEY; pkg2_kb++) {
|
||||||
|
se_aes_key_set(8, master_key[pkg2_kb], 0x10);
|
||||||
se_aes_unwrap_key(8, 8, package2_key_source);
|
se_aes_unwrap_key(8, 8, package2_key_source);
|
||||||
pkg2_hdr_t *pkg2_hdr = pkg2_decrypt(pkg2);
|
memcpy(&hdr, pkg2 + 0x100, sizeof(pkg2_hdr_t));
|
||||||
if (!pkg2_hdr) {
|
se_aes_crypt_ctr(8, &hdr, sizeof(pkg2_hdr_t), &hdr, sizeof(pkg2_hdr_t), &hdr);
|
||||||
|
if (hdr.magic == PKG2_MAGIC)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (pkg2_kb == MAX_KEY) {
|
||||||
EPRINTF("Failed to decrypt Package2.");
|
EPRINTF("Failed to decrypt Package2.");
|
||||||
goto pkg2_done;
|
goto pkg2_done;
|
||||||
}
|
} else if (pkg2_kb != pkg1_id->kb)
|
||||||
|
EPRINTF("Warning: Package1-Package2 mismatch.");
|
||||||
|
pkg2_hdr = pkg2_decrypt(pkg2);
|
||||||
|
|
||||||
TPRINTFARGS("%kDecrypt pkg2... ", colors[2]);
|
TPRINTFARGS("%kDecrypt pkg2... ", colors[2]);
|
||||||
|
|
||||||
|
@ -745,8 +751,13 @@ key_output: ;
|
||||||
TPRINTFARGS("\n%kFound %d keys.\n%kLockpick totally", colors[0], _key_count, colors[1]);
|
TPRINTFARGS("\n%kFound %d keys.\n%kLockpick totally", colors[0], _key_count, colors[1]);
|
||||||
|
|
||||||
f_mkdir("switch");
|
f_mkdir("switch");
|
||||||
if (!sd_save_to_file(text_buffer, strlen(text_buffer), "sd:/switch/prod.keys") && !f_stat("sd:/switch/prod.keys", &fno)) {
|
char keyfile_path[30] = "sd:/switch/";
|
||||||
gfx_printf("%kWrote %d bytes to /switch/prod.keys\n", colors[2], (u32)fno.fsize);
|
if (!(fuse_read_odm(4) & 3))
|
||||||
|
sprintf(&keyfile_path[11], "prod.keys");
|
||||||
|
else
|
||||||
|
sprintf(&keyfile_path[11], "dev.keys");
|
||||||
|
if (!sd_save_to_file(text_buffer, strlen(text_buffer), keyfile_path) && !f_stat(keyfile_path, &fno)) {
|
||||||
|
gfx_printf("%kWrote %d bytes to %s\n", colors[2], (u32)fno.fsize, keyfile_path);
|
||||||
} else
|
} else
|
||||||
EPRINTF("Failed to save keys to SD.");
|
EPRINTF("Failed to save keys to SD.");
|
||||||
sd_unmount();
|
sd_unmount();
|
||||||
|
|
Loading…
Reference in a new issue