diff --git a/bootloader/hos/fss.c b/bootloader/hos/fss.c index 2825c42..d403589 100644 --- a/bootloader/hos/fss.c +++ b/bootloader/hos/fss.c @@ -165,7 +165,7 @@ int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) continue; // If content is experimental and experimental flag is not enabled, skip it. - if ((curr_fss_cnt[i].flags0 & CNT_FLAG0_EXPERIMENTAL) && !ctxt->fss0_enable_experimental) + if ((curr_fss_cnt[i].flags0 & CNT_FLAG0_EXPERIMENTAL) && !ctxt->fss0_experimental) continue; // Parse content. diff --git a/bootloader/hos/hos.c b/bootloader/hos/hos.c index 9cebf4b..ab4488b 100644 --- a/bootloader/hos/hos.c +++ b/bootloader/hos/hos.c @@ -854,13 +854,11 @@ int hos_launch(ini_sec_t *cfg) if (!pkg2_hdr) { _hos_crit_error("Pkg2 decryption failed!"); - if (kb >= KB_FIRMWARE_VERSION_700) - { - EPRINTF("Is Sept updated?"); + EPRINTFARGS("Is hekate%s updated?", kb >= KB_FIRMWARE_VERSION_700 ? " or Sept" : ""); - // Clear EKS slot, in case something went wrong with sept keygen. + // Clear EKS slot, in case something went wrong with sept keygen. + if (kb >= KB_FIRMWARE_VERSION_700) hos_eks_clear(kb); - } goto error; } else if (kb >= KB_FIRMWARE_VERSION_700) @@ -964,7 +962,7 @@ int hos_launch(ini_sec_t *cfg) } // Rebuild and encrypt package2. - pkg2_build_encrypt((void *)PKG2_LOAD_ADDR, ctxt.kernel, ctxt.kernel_size, &kip1_info, ctxt.new_pkg2, kb); + pkg2_build_encrypt((void *)PKG2_LOAD_ADDR, &ctxt, &kip1_info); gfx_puts("Rebuilt & loaded pkg2\n"); diff --git a/bootloader/hos/hos.h b/bootloader/hos/hos.h index 59f130f..a8e9803 100644 --- a/bootloader/hos/hos.h +++ b/bootloader/hos/hos.h @@ -97,6 +97,7 @@ typedef struct _launch_ctxt_t void *kernel; u32 kernel_size; + link_t kip1_list; char* kip1_patches; @@ -105,7 +106,7 @@ typedef struct _launch_ctxt_t bool debugmode; bool stock; bool atmosphere; - bool fss0_enable_experimental; + bool fss0_experimental; bool emummc_forced; exo_ctxt_t exo_ctx; diff --git a/bootloader/hos/hos_config.c b/bootloader/hos/hos_config.c index 568cb5a..038d3ee 100644 --- a/bootloader/hos/hos_config.c +++ b/bootloader/hos/hos_config.c @@ -253,7 +253,7 @@ static int _config_fss(launch_ctxt_t *ctxt, const char *value) { if (!strcmp("fss0experimental", kv->key)) { - ctxt->fss0_enable_experimental = *kv->val == '1'; + ctxt->fss0_experimental = *kv->val == '1'; break; } } diff --git a/bootloader/hos/pkg2.c b/bootloader/hos/pkg2.c index 0e588bd..cdb600e 100644 --- a/bootloader/hos/pkg2.c +++ b/bootloader/hos/pkg2.c @@ -1410,9 +1410,11 @@ DPRINTF("adding kip1 '%s' @ %08X (%08X)\n", ki->kip1->name, (u32)ki->kip1, ki->s return ini1_size; } -void pkg2_build_encrypt(void *dst, void *kernel, u32 kernel_size, link_t *kips_info, bool new_pkg2, u8 kb) +void pkg2_build_encrypt(void *dst, void *hos_ctxt, link_t *kips_info) { u8 *pdst = (u8 *)dst; + launch_ctxt_t * ctxt = (launch_ctxt_t *)hos_ctxt; + u32 kernel_size = ctxt->kernel_size; // Signature. memset(pdst, 0, 0x100); @@ -1427,23 +1429,25 @@ void pkg2_build_encrypt(void *dst, void *kernel, u32 kernel_size, link_t *kips_i hdr->bl_ver = 0; hdr->pkg2_ver = 0xFF; - if (!new_pkg2) + if (!ctxt->new_pkg2) hdr->base = 0x10000000; else hdr->base = 0x60000; -DPRINTF("kernel @ %08X (%08X)\n", (u32)kernel, kernel_size); +DPRINTF("kernel @ %08X (%08X)\n", (u32)ctxt->kernel, kernel_size); pdst += sizeof(pkg2_hdr_t); // Kernel. - memcpy(pdst, kernel, kernel_size); - if (!new_pkg2) + memcpy(pdst, ctxt->kernel, kernel_size); + if (!ctxt->new_pkg2) hdr->sec_off[PKG2_SEC_KERNEL] = 0x10000000; else { // Set new INI1 offset to kernel. *(u32 *)(pdst + pkg2_newkern_ini1_val) = kernel_size; - kernel_size += _pkg2_ini1_build(pdst + kernel_size, hdr, kips_info, new_pkg2); + + // Build INI1 for new Package2. + kernel_size += _pkg2_ini1_build(pdst + kernel_size, hdr, kips_info, ctxt->new_pkg2); hdr->sec_off[PKG2_SEC_KERNEL] = 0x60000; } hdr->sec_size[PKG2_SEC_KERNEL] = kernel_size; @@ -1451,10 +1455,10 @@ DPRINTF("kernel @ %08X (%08X)\n", (u32)kernel, kernel_size); pdst += kernel_size; DPRINTF("kernel encrypted\n"); - // INI1. + /// Build INI1 for old Package2. u32 ini1_size = 0; - if (!new_pkg2) - ini1_size = _pkg2_ini1_build(pdst, hdr, kips_info, new_pkg2); + if (!ctxt->new_pkg2) + ini1_size = _pkg2_ini1_build(pdst, hdr, kips_info, false); DPRINTF("INI1 encrypted\n"); // Calculate SHA256 over encrypted Kernel and INI1. @@ -1466,7 +1470,7 @@ DPRINTF("INI1 encrypted\n"); (void *)pk2_hash_data, hdr->sec_size[PKG2_SEC_INI1]); //Encrypt header. - u8 key_ver = kb ? kb + 1 : 0; + u8 key_ver = ctxt->pkg1_id->kb ? ctxt->pkg1_id->kb + 1 : 0; *(u32 *)hdr->ctr = 0x100 + sizeof(pkg2_hdr_t) + kernel_size + ini1_size; hdr->ctr[4] = key_ver; se_aes_crypt_ctr(pkg2_keyslot, hdr, sizeof(pkg2_hdr_t), hdr, sizeof(pkg2_hdr_t), hdr); diff --git a/bootloader/hos/pkg2.h b/bootloader/hos/pkg2.h index eb1e054..58a030d 100644 --- a/bootloader/hos/pkg2.h +++ b/bootloader/hos/pkg2.h @@ -155,6 +155,6 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames); const pkg2_kernel_id_t *pkg2_identify(u8 *hash); pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb); -void pkg2_build_encrypt(void *dst, void *kernel, u32 kernel_size, link_t *kips_info, bool new_pkg2, u8 kb); +void pkg2_build_encrypt(void *dst, void *hos_ctxt, link_t *kips_info); #endif