nyx: info: make cal0 dumping public

This commit is contained in:
CTCaer 2023-06-09 11:01:08 +03:00
parent 25b181bf36
commit dc8f6beb8d
2 changed files with 59 additions and 34 deletions

View file

@ -33,7 +33,7 @@ extern volatile nyx_storage_t *nyx_str;
extern lv_res_t launch_payload(lv_obj_t *list); extern lv_res_t launch_payload(lv_obj_t *list);
extern char *emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t *storage); extern char *emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t *storage);
static u8 *cal0_buf = NULL; u8 *cal0_buf = NULL;
static lv_res_t _create_window_dump_done(int error, char *dump_filenames) static lv_res_t _create_window_dump_done(int error, char *dump_filenames)
{ {
@ -237,6 +237,55 @@ static lv_res_t _kfuse_dump_window_action(lv_obj_t * btn)
return LV_RES_OK; return LV_RES_OK;
} }
int dump_cal0()
{
// Init eMMC.
if (!emmc_initialize(false))
return 1;
// Generate BIS keys
hos_bis_keygen();
if (!cal0_buf)
cal0_buf = malloc(SZ_64K);
// Read and decrypt CAL0.
emmc_set_partition(EMMC_GPP);
LIST_INIT(gpt);
emmc_gpt_parse(&gpt);
emmc_part_t *cal0_part = emmc_part_find(&gpt, "PRODINFO"); // check if null
nx_emmc_bis_init(cal0_part, false, 0);
nx_emmc_bis_read(0, 0x40, cal0_buf);
nx_emmc_bis_end();
emmc_gpt_free(&gpt);
emmc_end();
// Clear BIS keys slots.
hos_bis_keys_clear();
nx_emmc_cal0_t *cal0 = (nx_emmc_cal0_t *)cal0_buf;
// Check keys validity.
if (memcmp(&cal0->magic, "CAL0", 4))
{
free(cal0_buf);
cal0_buf = NULL;
// Clear EKS keys.
hos_eks_clear(KB_FIRMWARE_VERSION_MAX);
return 2;
}
u32 hash[8];
se_calc_sha256_oneshot(hash, (u8 *)cal0 + 0x40, cal0->body_size);
if (memcmp(hash, cal0->body_sha256, 0x20))
return 3;
return 0;
}
static lv_res_t _create_mbox_cal0(lv_obj_t *btn) static lv_res_t _create_mbox_cal0(lv_obj_t *btn)
{ {
lv_obj_t *dark_bg = lv_obj_create(lv_scr_act(), NULL); lv_obj_t *dark_bg = lv_obj_create(lv_scr_act(), NULL);
@ -261,48 +310,24 @@ static lv_res_t _create_mbox_cal0(lv_obj_t *btn)
sd_mount(); sd_mount();
// Init eMMC. // Dump CAL0.
if (!emmc_initialize(false)) int cal0_res = dump_cal0();
// Check result. Don't error if hash doesn't match.
if (cal0_res == 1)
{ {
lv_label_set_text(lb_desc, "#FFDD00 Failed to init eMMC!#"); lv_label_set_text(lb_desc, "#FFDD00 Failed to init eMMC!#");
goto out; goto out;
} }
else if (cal0_res == 2)
// Generate BIS keys
hos_bis_keygen();
if (!cal0_buf)
cal0_buf = malloc(SZ_64K);
// Read and decrypt CAL0.
emmc_set_partition(EMMC_GPP);
LIST_INIT(gpt);
emmc_gpt_parse(&gpt);
emmc_part_t *cal0_part = emmc_part_find(&gpt, "PRODINFO"); // check if null
nx_emmc_bis_init(cal0_part, false, 0);
nx_emmc_bis_read(0, 0x40, cal0_buf);
nx_emmc_bis_end();
emmc_gpt_free(&gpt);
// Clear BIS keys slots.
hos_bis_keys_clear();
nx_emmc_cal0_t *cal0 = (nx_emmc_cal0_t *)cal0_buf;
// Check keys validity.
if (memcmp(&cal0->magic, "CAL0", 4))
{ {
free(cal0_buf);
cal0_buf = NULL;
// Clear EKS keys.
hos_eks_clear(KB_FIRMWARE_VERSION_MAX);
lv_label_set_text(lb_desc, "#FFDD00 CAL0 is corrupt or wrong keys!#\n"); lv_label_set_text(lb_desc, "#FFDD00 CAL0 is corrupt or wrong keys!#\n");
goto out; goto out;
} }
nx_emmc_cal0_t *cal0 = (nx_emmc_cal0_t *)cal0_buf;
u32 hash[8]; u32 hash[8];
se_calc_sha256_oneshot(hash, (u8 *)cal0 + 0x40, cal0->body_size); se_calc_sha256_oneshot(hash, (u8 *)cal0 + 0x40, cal0->body_size);
@ -376,7 +401,6 @@ static lv_res_t _create_mbox_cal0(lv_obj_t *btn)
out: out:
free(txt_buf); free(txt_buf);
sd_unmount(); sd_unmount();
emmc_end();
lv_mbox_add_btns(mbox, mbox_btn_map, _cal0_dump_window_action); lv_mbox_add_btns(mbox, mbox_btn_map, _cal0_dump_window_action);

View file

@ -20,5 +20,6 @@
#include <libs/lvgl/lvgl.h> #include <libs/lvgl/lvgl.h>
void create_tab_info(lv_theme_t *th, lv_obj_t *parent); void create_tab_info(lv_theme_t *th, lv_obj_t *parent);
int dump_cal0();
#endif #endif