diff --git a/source/gfx/gfx.c b/source/gfx/gfx.c index 6adb7be..4323e49 100644 --- a/source/gfx/gfx.c +++ b/source/gfx/gfx.c @@ -216,7 +216,8 @@ void gfx_putc(char c) cbuf++; } gfx_con.x += 16; - if (gfx_con.x >= gfx_ctxt.width - 16) { + if (gfx_con.x >= gfx_ctxt.width - 16) + { gfx_con.x = 0; gfx_con.y += 16; } @@ -250,7 +251,8 @@ void gfx_putc(char c) fb += gfx_ctxt.stride - 8; } gfx_con.x += 8; - if (gfx_con.x >= gfx_ctxt.width - 8) { + if (gfx_con.x >= gfx_ctxt.width - 8) + { gfx_con.x = 0; gfx_con.y += 8; } diff --git a/source/gfx/tui.c b/source/gfx/tui.c index cd3cea6..3b59569 100644 --- a/source/gfx/tui.c +++ b/source/gfx/tui.c @@ -147,7 +147,8 @@ void *tui_do_menu(menu_t *menu) gfx_con_setcol(0xFF1B1B1B, 1, 0xFFCCCCCC); else gfx_con_setcol(0xFFCCCCCC, 1, 0xFF1B1B1B); - if (menu->ents[cnt].type != MENT_CHGLINE && menu->ents[cnt].type != MENT_MENU) { + if (menu->ents[cnt].type != MENT_CHGLINE && menu->ents[cnt].type != MENT_MENU) + { if (cnt == idx) gfx_printf(" %s", menu->ents[cnt].caption); else diff --git a/source/hos/sept.c b/source/hos/sept.c index 1858533..2a30f16 100644 --- a/source/hos/sept.c +++ b/source/hos/sept.c @@ -107,7 +107,8 @@ int reboot_to_sept(const u8 *tsec_fw, const u32 tsec_size, const u32 kb) tmp_cfg->boot_cfg |= BOOT_CFG_SEPT_RUN; - if (f_open(&fp, "sd:/sept/payload.bin", FA_READ | FA_WRITE)) { + if (f_open(&fp, "sd:/sept/payload.bin", FA_READ | FA_WRITE)) + { free(tmp_cfg); goto error; } diff --git a/source/main.c b/source/main.c index 3fcdf81..5ad772d 100644 --- a/source/main.c +++ b/source/main.c @@ -320,7 +320,8 @@ void launch_tools() if (file_sec) { - if (memcmp("sd:/", file_sec, 4)) { + if (memcmp("sd:/", file_sec, 4)) + { memcpy(dir + strlen(dir), "/", 2); memcpy(dir + strlen(dir), file_sec, strlen(file_sec) + 1); } @@ -371,7 +372,8 @@ ment_t ment_top[] = { menu_t menu_top = { ment_top, NULL, 0, 0 }; -void _get_key_generations(char *sysnand_label, char *emunand_label) { +void _get_key_generations(char *sysnand_label, char *emunand_label) +{ sdmmc_t sdmmc; sdmmc_storage_t storage; sdmmc_storage_init_mmc(&storage, &sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, 4); @@ -384,7 +386,8 @@ void _get_key_generations(char *sysnand_label, char *emunand_label) { if (pkg1_id) sprintf(sysnand_label + 36, "% 3d", pkg1_id->kb); ment_top[0].caption = sysnand_label; - if (h_cfg.emummc_force_disable) { + if (h_cfg.emummc_force_disable) + { free(pkg1); return; } diff --git a/source/sec/se.c b/source/sec/se.c index c5e19b3..d129eda 100644 --- a/source/sec/se.c +++ b/source/sec/se.c @@ -235,6 +235,16 @@ void se_aes_key_set(u32 ks, const void *key, u32 size) } } +void se_aes_iv_set(u32 ks, const void *iv, u32 size) +{ + u32 *data = (u32 *)iv; + for (u32 i = 0; i < size / 4; i++) + { + SE(SE_KEYTABLE_REG_OFFSET) = SE_KEYTABLE_SLOT(ks) | 8 | i; + SE(SE_KEYTABLE_DATA0_REG_OFFSET) = data[i]; + } +} + void se_aes_key_read(u32 ks, void *key, u32 size) { u32 *data = (u32 *)key; @@ -321,6 +331,83 @@ int se_aes_crypt_ctr(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_s return 1; } +// random calls were derived from Atmosphère's +int se_initialize_rng(u32 ks) +{ + u8 *output_buf = (u8 *)malloc(0x10); + + SE(SE_CONFIG_REG_OFFSET) = SE_CONFIG_ENC_ALG(ALG_RNG) | SE_CONFIG_DST(DST_MEMORY); + SE(SE_CRYPTO_REG_OFFSET) = SE_CRYPTO_KEY_INDEX(ks) | SE_CRYPTO_CORE_SEL(CORE_ENCRYPT) | + SE_CRYPTO_INPUT_SEL(INPUT_RANDOM); + SE(SE_RNG_CONFIG_REG_OFFSET) = SE_RNG_CONFIG_MODE(DRBG_MODE_FORCE_INSTANTION) | SE_RNG_CONFIG_SRC(DRBG_SRC_ENTROPY); + SE(SE_RNG_RESEED_INTERVAL_REG_OFFSET) = 70001; + SE(SE_RNG_SRC_CONFIG_REG_OFFSET) = SE_RNG_SRC_CONFIG_RO_ENT_SRC_LOCK(DRBG_RO_ENT_SRC_LOCK_ENABLE) | + SE_RNG_SRC_CONFIG_RO_ENT_SRC(DRBG_RO_ENT_SRC_LOCK_ENABLE); + SE(SE_BLOCK_COUNT_REG_OFFSET) = 0; + + int res =_se_execute(OP_START, output_buf, 0x10, NULL, 0); + + free(output_buf); + return res; +} + +int se_generate_random(u32 ks, void *dst, u32 size) +{ + SE(SE_CONFIG_REG_OFFSET) = SE_CONFIG_ENC_ALG(ALG_RNG) | SE_CONFIG_DST(DST_MEMORY); + SE(SE_CRYPTO_REG_OFFSET) = SE_CRYPTO_KEY_INDEX(ks) | SE_CRYPTO_CORE_SEL(CORE_ENCRYPT) | + SE_CRYPTO_INPUT_SEL(INPUT_RANDOM); + SE(SE_RNG_CONFIG_REG_OFFSET) = SE_RNG_CONFIG_MODE(DRBG_MODE_NORMAL) | SE_RNG_CONFIG_SRC(DRBG_SRC_ENTROPY); + + u32 num_blocks = size >> 4; + u32 aligned_size = num_blocks << 4; + if (num_blocks) + { + SE(SE_BLOCK_COUNT_REG_OFFSET) = num_blocks - 1; + if (!_se_execute(OP_START, dst, aligned_size, NULL, 0)) + return 0; + } + if (size > aligned_size) + return _se_execute_one_block(OP_START, dst + aligned_size, size - aligned_size, NULL, 0); + return 1; +} + +int se_generate_random_key(u32 ks_dst, u32 ks_src) +{ + SE(SE_CONFIG_REG_OFFSET) = SE_CONFIG_ENC_ALG(ALG_RNG) | SE_CONFIG_DST(DST_MEMORY); + SE(SE_CRYPTO_REG_OFFSET) = SE_CRYPTO_KEY_INDEX(ks_src) | SE_CRYPTO_CORE_SEL(CORE_ENCRYPT) | + SE_CRYPTO_INPUT_SEL(INPUT_RANDOM); + SE(SE_RNG_CONFIG_REG_OFFSET) = SE_RNG_CONFIG_MODE(DRBG_MODE_NORMAL) | SE_RNG_CONFIG_SRC(DRBG_SRC_ENTROPY); + + SE(SE_CRYPTO_KEYTABLE_DST_REG_OFFSET) = SE_CRYPTO_KEYTABLE_DST_KEY_INDEX(ks_dst); + if (!_se_execute(OP_START, NULL, 0, NULL, 0)) + return 0; + SE(SE_CRYPTO_KEYTABLE_DST_REG_OFFSET) = SE_CRYPTO_KEYTABLE_DST_KEY_INDEX(ks_dst) | 1; + if (!_se_execute(OP_START, NULL, 0, NULL, 0)) + return 0; + + return 1; +} + +int se_aes_crypt_cbc(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size) +{ + if (enc) + { + SE(SE_CONFIG_REG_OFFSET) = SE_CONFIG_ENC_ALG(ALG_AES_ENC) | SE_CONFIG_DST(DST_MEMORY); + SE(SE_CRYPTO_REG_OFFSET) = SE_CRYPTO_KEY_INDEX(ks) | SE_CRYPTO_VCTRAM_SEL(VCTRAM_AESOUT) | + SE_CRYPTO_CORE_SEL(CORE_ENCRYPT) | SE_CRYPTO_XOR_POS(XOR_TOP) | SE_CRYPTO_INPUT_SEL(INPUT_AHB) | + SE_CRYPTO_IV_SEL(IV_ORIGINAL); + } + else + { + SE(SE_CONFIG_REG_OFFSET) = SE_CONFIG_DEC_ALG(ALG_AES_DEC) | SE_CONFIG_DST(DST_MEMORY); + SE(SE_CRYPTO_REG_OFFSET) = SE_CRYPTO_KEY_INDEX(ks) | SE_CRYPTO_VCTRAM_SEL(VCTRAM_PREVAHB) | + SE_CRYPTO_CORE_SEL(CORE_DECRYPT) | SE_CRYPTO_XOR_POS(XOR_BOTTOM) | SE_CRYPTO_INPUT_SEL(INPUT_AHB) | + SE_CRYPTO_IV_SEL(IV_ORIGINAL); + } + SE(SE_BLOCK_COUNT_REG_OFFSET) = (src_size >> 4) - 1; + return _se_execute(OP_START, dst, dst_size, src, src_size); +} + int se_aes_xts_crypt_sec(u32 ks1, u32 ks2, u32 enc, u64 sec, void *dst, const void *src, u32 secsize) { int res = 0; @@ -356,7 +443,8 @@ int se_aes_xts_crypt_sec(u32 ks1, u32 ks2, u32 enc, u64 sec, void *dst, const vo pdst = (u32 *)dst; memcpy(tweak, temptweak, 0x10); - for (u32 i = 0; i < secsize / 0x10; i++) { + for (u32 i = 0; i < secsize / 0x10; i++) + { for (u32 j = 0; j < 4; j++) pdst[j] = pdst[j] ^ ptweak[j]; _gf256_mul_x_le(tweak); @@ -404,17 +492,21 @@ int se_aes_cmac(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size) se_aes_key_iv_clear(ks); u32 num_blocks = (src_size + 0xf) >> 4; - if (num_blocks > 1) { + if (num_blocks > 1) + { SE(SE_BLOCK_COUNT_REG_OFFSET) = num_blocks - 2; if (!_se_execute(OP_START, NULL, 0, src, src_size)) goto out; SE(SE_CRYPTO_REG_OFFSET) |= SE_CRYPTO_IV_SEL(IV_UPDATED); } - if (src_size & 0xf) { + if (src_size & 0xf) + { memcpy(last_block, src + (src_size & ~0xf), src_size & 0xf); last_block[src_size & 0xf] = 0x80; - } else if (src_size >= 0x10) { + } + else if (src_size >= 0x10) + { memcpy(last_block, src + src_size - 0x10, 0x10); } @@ -461,7 +553,8 @@ int se_calc_sha256(void *dst, const void *src, u32 src_size) return res; } -int se_calc_hmac_sha256(void *dst, const void *src, u32 src_size, const void *key, u32 key_size) { +int se_calc_hmac_sha256(void *dst, const void *src, u32 src_size, const void *key, u32 key_size) +{ int res = 0; u8 *secret = (u8 *)malloc(0x40); u8 *ipad = (u8 *)malloc(0x40 + src_size); diff --git a/source/sec/se.h b/source/sec/se.h index 0d517c7..211c279 100644 --- a/source/sec/se.h +++ b/source/sec/se.h @@ -25,12 +25,17 @@ void se_rsa_key_clear(u32 ks); int se_rsa_exp_mod(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size); void se_key_acc_ctrl(u32 ks, u32 flags); void se_aes_key_set(u32 ks, const void *key, u32 size); +void se_aes_iv_set(u32 ks, const void *iv, u32 size); void se_aes_key_read(u32 ks, void *key, u32 size); void se_aes_key_clear(u32 ks); +int se_initialize_rng(u32 ks); +int se_generate_random(u32 ks, void *dst, u32 size); +int se_generate_random_key(u32 ks_dst, u32 ks_src); int se_aes_unwrap_key(u32 ks_dst, u32 ks_src, const void *input); int se_aes_crypt_ecb(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size); int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src); int se_aes_crypt_ctr(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size, void *ctr); +int se_aes_crypt_cbc(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size); int se_aes_xts_crypt_sec(u32 ks1, u32 ks2, u32 enc, u64 sec, void *dst, const void *src, u32 secsize); int se_aes_xts_crypt(u32 ks1, u32 ks2, u32 enc, u64 sec, void *dst, const void *src, u32 secsize, u32 num_secs); int se_aes_cmac(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size);