mirror of
https://github.com/Decscots/Lockpick_RCM
synced 2024-11-15 08:46:33 +00:00
Add se functions, match Hekate brace style
This commit is contained in:
parent
0427c99176
commit
a5fe954ce7
6 changed files with 117 additions and 12 deletions
|
@ -216,7 +216,8 @@ void gfx_putc(char c)
|
||||||
cbuf++;
|
cbuf++;
|
||||||
}
|
}
|
||||||
gfx_con.x += 16;
|
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.x = 0;
|
||||||
gfx_con.y += 16;
|
gfx_con.y += 16;
|
||||||
}
|
}
|
||||||
|
@ -250,7 +251,8 @@ void gfx_putc(char c)
|
||||||
fb += gfx_ctxt.stride - 8;
|
fb += gfx_ctxt.stride - 8;
|
||||||
}
|
}
|
||||||
gfx_con.x += 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.x = 0;
|
||||||
gfx_con.y += 8;
|
gfx_con.y += 8;
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,7 +147,8 @@ void *tui_do_menu(menu_t *menu)
|
||||||
gfx_con_setcol(0xFF1B1B1B, 1, 0xFFCCCCCC);
|
gfx_con_setcol(0xFF1B1B1B, 1, 0xFFCCCCCC);
|
||||||
else
|
else
|
||||||
gfx_con_setcol(0xFFCCCCCC, 1, 0xFF1B1B1B);
|
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)
|
if (cnt == idx)
|
||||||
gfx_printf(" %s", menu->ents[cnt].caption);
|
gfx_printf(" %s", menu->ents[cnt].caption);
|
||||||
else
|
else
|
||||||
|
|
|
@ -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;
|
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);
|
free(tmp_cfg);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -320,7 +320,8 @@ void launch_tools()
|
||||||
|
|
||||||
if (file_sec)
|
if (file_sec)
|
||||||
{
|
{
|
||||||
if (memcmp("sd:/", file_sec, 4)) {
|
if (memcmp("sd:/", file_sec, 4))
|
||||||
|
{
|
||||||
memcpy(dir + strlen(dir), "/", 2);
|
memcpy(dir + strlen(dir), "/", 2);
|
||||||
memcpy(dir + strlen(dir), file_sec, strlen(file_sec) + 1);
|
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 };
|
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_t sdmmc;
|
||||||
sdmmc_storage_t storage;
|
sdmmc_storage_t storage;
|
||||||
sdmmc_storage_init_mmc(&storage, &sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, 4);
|
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)
|
if (pkg1_id)
|
||||||
sprintf(sysnand_label + 36, "% 3d", pkg1_id->kb);
|
sprintf(sysnand_label + 36, "% 3d", pkg1_id->kb);
|
||||||
ment_top[0].caption = sysnand_label;
|
ment_top[0].caption = sysnand_label;
|
||||||
if (h_cfg.emummc_force_disable) {
|
if (h_cfg.emummc_force_disable)
|
||||||
|
{
|
||||||
free(pkg1);
|
free(pkg1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
103
source/sec/se.c
103
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)
|
void se_aes_key_read(u32 ks, void *key, u32 size)
|
||||||
{
|
{
|
||||||
u32 *data = (u32 *)key;
|
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;
|
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 se_aes_xts_crypt_sec(u32 ks1, u32 ks2, u32 enc, u64 sec, void *dst, const void *src, u32 secsize)
|
||||||
{
|
{
|
||||||
int res = 0;
|
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;
|
pdst = (u32 *)dst;
|
||||||
|
|
||||||
memcpy(tweak, temptweak, 0x10);
|
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++)
|
for (u32 j = 0; j < 4; j++)
|
||||||
pdst[j] = pdst[j] ^ ptweak[j];
|
pdst[j] = pdst[j] ^ ptweak[j];
|
||||||
_gf256_mul_x_le(tweak);
|
_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);
|
se_aes_key_iv_clear(ks);
|
||||||
|
|
||||||
u32 num_blocks = (src_size + 0xf) >> 4;
|
u32 num_blocks = (src_size + 0xf) >> 4;
|
||||||
if (num_blocks > 1) {
|
if (num_blocks > 1)
|
||||||
|
{
|
||||||
SE(SE_BLOCK_COUNT_REG_OFFSET) = num_blocks - 2;
|
SE(SE_BLOCK_COUNT_REG_OFFSET) = num_blocks - 2;
|
||||||
if (!_se_execute(OP_START, NULL, 0, src, src_size))
|
if (!_se_execute(OP_START, NULL, 0, src, src_size))
|
||||||
goto out;
|
goto out;
|
||||||
SE(SE_CRYPTO_REG_OFFSET) |= SE_CRYPTO_IV_SEL(IV_UPDATED);
|
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);
|
memcpy(last_block, src + (src_size & ~0xf), src_size & 0xf);
|
||||||
last_block[src_size & 0xf] = 0x80;
|
last_block[src_size & 0xf] = 0x80;
|
||||||
} else if (src_size >= 0x10) {
|
}
|
||||||
|
else if (src_size >= 0x10)
|
||||||
|
{
|
||||||
memcpy(last_block, src + src_size - 0x10, 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;
|
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;
|
int res = 0;
|
||||||
u8 *secret = (u8 *)malloc(0x40);
|
u8 *secret = (u8 *)malloc(0x40);
|
||||||
u8 *ipad = (u8 *)malloc(0x40 + src_size);
|
u8 *ipad = (u8 *)malloc(0x40 + src_size);
|
||||||
|
|
|
@ -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);
|
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_key_acc_ctrl(u32 ks, u32 flags);
|
||||||
void se_aes_key_set(u32 ks, const void *key, u32 size);
|
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_read(u32 ks, void *key, u32 size);
|
||||||
void se_aes_key_clear(u32 ks);
|
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_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_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_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_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_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_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);
|
int se_aes_cmac(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size);
|
||||||
|
|
Loading…
Reference in a new issue