Add FSS0 support
This commit is contained in:
		| @@ -79,31 +79,6 @@ typedef struct _fss_content_t | |||||||
| 	char name[0x10]; | 	char name[0x10]; | ||||||
| } fss_content_t; | } fss_content_t; | ||||||
|  |  | ||||||
| static void _update_r2p(const char *path) |  | ||||||
| { |  | ||||||
| 	char *r2p_path = malloc(256); |  | ||||||
| 	u32 path_len = strlen(path); |  | ||||||
| 	strcpy(r2p_path, path); |  | ||||||
|  |  | ||||||
| 	while(path_len) |  | ||||||
| 	{ |  | ||||||
| 		if ((r2p_path[path_len - 1] == '/') || (r2p_path[path_len - 1] == 0x5C)) |  | ||||||
| 		{ |  | ||||||
| 			r2p_path[path_len] = 0; |  | ||||||
| 			strcat(r2p_path, "reboot_payload.bin"); |  | ||||||
| 			u8 *r2p_payload = sd_file_read(r2p_path, NULL); |  | ||||||
|  |  | ||||||
| 			is_ipl_updated(r2p_payload, r2p_path, h_cfg.updater2p ? true : false); |  | ||||||
|  |  | ||||||
| 			free(r2p_payload); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		path_len--; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	free(r2p_path); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) | int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) | ||||||
| { | { | ||||||
| 	FIL fp; | 	FIL fp; | ||||||
| @@ -224,8 +199,6 @@ out: | |||||||
| 		gfx_printf("Done!\n"); | 		gfx_printf("Done!\n"); | ||||||
| 		f_close(&fp); | 		f_close(&fp); | ||||||
|  |  | ||||||
| 		_update_r2p(path); |  | ||||||
|  |  | ||||||
| 		return (!sept_ctxt ? 1 : sept_used); | 		return (!sept_ctxt ? 1 : sept_used); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -17,7 +17,9 @@ | |||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
| #include "sept.h" | #include "sept.h" | ||||||
|  | #include "../config/ini.h" | ||||||
| #include "../gfx/di.h" | #include "../gfx/di.h" | ||||||
|  | #include "../hos/fss.h" | ||||||
| #include "../hos/hos.h" | #include "../hos/hos.h" | ||||||
| #include "../libs/fatfs/ff.h" | #include "../libs/fatfs/ff.h" | ||||||
| #include "../mem/heap.h" | #include "../mem/heap.h" | ||||||
| @@ -28,6 +30,7 @@ | |||||||
| #include "../storage/nx_sd.h" | #include "../storage/nx_sd.h" | ||||||
| #include "../storage/sdmmc.h" | #include "../storage/sdmmc.h" | ||||||
| #include "../utils/btn.h" | #include "../utils/btn.h" | ||||||
|  | #include "../utils/list.h" | ||||||
| #include "../utils/types.h" | #include "../utils/types.h" | ||||||
|  |  | ||||||
| #include "../gfx/gfx.h" | #include "../gfx/gfx.h" | ||||||
| @@ -65,42 +68,76 @@ extern void reloc_patcher(u32 payload_dst, u32 payload_src, u32 payload_size); | |||||||
| int reboot_to_sept(const u8 *tsec_fw, const u32 tsec_size, const u32 kb) | int reboot_to_sept(const u8 *tsec_fw, const u32 tsec_size, const u32 kb) | ||||||
| { | { | ||||||
| 	FIL fp; | 	FIL fp; | ||||||
|  | 	bool fss0_sept_used = false; | ||||||
|  |  | ||||||
| 	// Copy warmboot reboot code and TSEC fw. | 	// Copy warmboot reboot code and TSEC fw. | ||||||
| 	memcpy((u8 *)(SEPT_PK1T_ADDR - WB_RST_SIZE), (u8 *)warmboot_reboot, sizeof(warmboot_reboot)); | 	memcpy((u8 *)(SEPT_PK1T_ADDR - WB_RST_SIZE), (u8 *)warmboot_reboot, sizeof(warmboot_reboot)); | ||||||
| 	memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, tsec_size); | 	memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, tsec_size); | ||||||
| 	*(vu32 *)SEPT_TCSZ_ADDR = tsec_size; | 	*(vu32 *)SEPT_TCSZ_ADDR = tsec_size; | ||||||
|  |  | ||||||
| 	// Copy sept-primary. | 	LIST_INIT(ini_sections); | ||||||
| 	if (f_open(&fp, "sd:/sept/sept-primary.bin", FA_READ)) | 	if (ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false)) | ||||||
| 		goto error; | 	{ | ||||||
|  | 		bool found = false; | ||||||
|  | 		LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link) | ||||||
|  | 		{ | ||||||
|  | 			// Only parse non config sections. | ||||||
|  | 			if (ini_sec->type == INI_CHOICE && strcmp(ini_sec->name, "config")) | ||||||
|  | 			{ | ||||||
|  | 				LIST_FOREACH_ENTRY(ini_kv_t, kv, &ini_sec->kvs, link) | ||||||
|  | 				{ | ||||||
|  | 					if (!strcmp("fss0", kv->key)) | ||||||
|  | 					{ | ||||||
|  | 						fss0_sept_t sept_ctxt; | ||||||
|  | 						sept_ctxt.kb = kb; | ||||||
|  | 						sept_ctxt.sept_primary = (void *)SEPT_STG1_ADDR; | ||||||
|  | 						sept_ctxt.sept_secondary = (void *)SEPT_STG2_ADDR; | ||||||
|  | 						fss0_sept_used = parse_fss(NULL, kv->val, &sept_ctxt); | ||||||
|  |  | ||||||
| 	if (f_read(&fp, (u8 *)SEPT_STG1_ADDR, f_size(&fp), NULL)) | 						found = true; | ||||||
| 	{ | 						break; | ||||||
| 		f_close(&fp); | 					} | ||||||
| 		goto error; | 				} | ||||||
|  | 			} | ||||||
|  | 			if (found) | ||||||
|  | 				break; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	f_close(&fp); |  | ||||||
|  |  | ||||||
| 	// Copy sept-secondary. |  | ||||||
| 	if (kb < KB_FIRMWARE_VERSION_810) | 	if (!fss0_sept_used) | ||||||
| 	{ | 	{ | ||||||
| 		if (f_open(&fp, "sd:/sept/sept-secondary_00.enc", FA_READ)) | 		// Copy sept-primary. | ||||||
| 			if (f_open(&fp, "sd:/sept/sept-secondary.enc", FA_READ)) // Try the deprecated version. | 		if (f_open(&fp, "sd:/sept/sept-primary.bin", FA_READ)) | ||||||
| 				goto error; |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		if (f_open(&fp, "sd:/sept/sept-secondary_01.enc", FA_READ)) |  | ||||||
| 			goto error; | 			goto error; | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if (f_read(&fp, (u8 *)SEPT_STG2_ADDR, f_size(&fp), NULL)) | 		if (f_read(&fp, (u8 *)SEPT_STG1_ADDR, f_size(&fp), NULL)) | ||||||
| 	{ | 		{ | ||||||
|  | 			f_close(&fp); | ||||||
|  | 			goto error; | ||||||
|  | 		} | ||||||
|  | 		f_close(&fp); | ||||||
|  |  | ||||||
|  | 		// Copy sept-secondary. | ||||||
|  | 		if (kb < KB_FIRMWARE_VERSION_810) | ||||||
|  | 		{ | ||||||
|  | 			if (f_open(&fp, "sd:/sept/sept-secondary_00.enc", FA_READ)) | ||||||
|  | 				if (f_open(&fp, "sd:/sept/sept-secondary.enc", FA_READ)) // Try the deprecated version. | ||||||
|  | 					goto error; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			if (f_open(&fp, "sd:/sept/sept-secondary_01.enc", FA_READ)) | ||||||
|  | 				goto error; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if (f_read(&fp, (u8 *)SEPT_STG2_ADDR, f_size(&fp), NULL)) | ||||||
|  | 		{ | ||||||
|  | 			f_close(&fp); | ||||||
|  | 			goto error; | ||||||
|  | 		} | ||||||
| 		f_close(&fp); | 		f_close(&fp); | ||||||
| 		goto error; |  | ||||||
| 	} | 	} | ||||||
| 	f_close(&fp); |  | ||||||
|  |  | ||||||
| 	// Save auto boot config to sept payload, if any. | 	// Save auto boot config to sept payload, if any. | ||||||
| 	boot_cfg_t *tmp_cfg = malloc(sizeof(boot_cfg_t)); | 	boot_cfg_t *tmp_cfg = malloc(sizeof(boot_cfg_t)); | ||||||
|   | |||||||
| @@ -304,7 +304,7 @@ get_tsec: ; | |||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|                 memcpy(master_key[kb-1], master_key[kb], 0x10); |                 memcpy(master_key[kb-1], master_key[kb], 0x10); | ||||||
|                 memcpy(master_key[kb], zeros, 0x10); |                 memset(master_key[kb], 0, 0x10); | ||||||
|             } |             } | ||||||
|             if (_key_exists(temp_key)) { |             if (_key_exists(temp_key)) { | ||||||
|                 EPRINTF("Unable to derive master key."); |                 EPRINTF("Unable to derive master key."); | ||||||
| @@ -527,6 +527,8 @@ pkg2_done: | |||||||
|             for (u32 j = 0; j < 3; j++) { |             for (u32 j = 0; j < 3; j++) { | ||||||
|                 _generate_kek(8, fs_keys[2 + j], master_key[i], aes_kek_generation_source, NULL); |                 _generate_kek(8, fs_keys[2 + j], master_key[i], aes_kek_generation_source, NULL); | ||||||
|                 se_aes_crypt_block_ecb(8, 0, key_area_key[j][i], aes_key_generation_source); |                 se_aes_crypt_block_ecb(8, 0, key_area_key[j][i], aes_key_generation_source); | ||||||
|  |                 if (j == 2) | ||||||
|  |                     gfx_hexdump(i, key_area_key[j][i], 0x10); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         se_aes_key_set(8, master_key[i], 0x10); |         se_aes_key_set(8, master_key[i], 0x10); | ||||||
| @@ -1088,8 +1090,14 @@ static void _save_key(const char *name, const void *data, u32 len, char *outbuf) | |||||||
|  |  | ||||||
| static void _save_key_family(const char *name, const void *data, u32 start_key, u32 num_keys, u32 len, char *outbuf) { | static void _save_key_family(const char *name, const void *data, u32 start_key, u32 num_keys, u32 len, char *outbuf) { | ||||||
|     char temp_name[0x40] = {0}; |     char temp_name[0x40] = {0}; | ||||||
|  |     if (memcmp(name, "key_area_key_system", 19) == 0) { | ||||||
|  |         gfx_hexdump(0, data, num_keys * 0x10); | ||||||
|  |     } | ||||||
|     for (u32 i = 0; i < num_keys; i++) { |     for (u32 i = 0; i < num_keys; i++) { | ||||||
|         sprintf(temp_name, "%s_%02x", name, i + start_key); |         sprintf(temp_name, "%s_%02x", name, i + start_key); | ||||||
|  |         if (memcmp(name, "key_area_key_system", 19) == 0) { | ||||||
|  |             gfx_printf("attempt save key %x\n", i); | ||||||
|  |         } | ||||||
|         _save_key(temp_name, data + i * len, len, outbuf); |         _save_key(temp_name, data + i * len, len, outbuf); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user