Support pkg1+pkg2 mismatch and "dev.keys" filename
This commit is contained in:
		| @@ -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(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user