From 8033ba461f47d8f41a5a1745e9f53f851c079717 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Thu, 12 Sep 2019 23:27:04 +0300 Subject: [PATCH] SE: Boost its speed while BPMP cache is on Plus add se_aes_crypt_ecb(). Thanks @shchmue for pointing out that speed bump --- bootloader/sec/se.c | 21 +++++++++++++-------- bootloader/sec/se.h | 1 + nyx/nyx_gui/sec/se.c | 21 +++++++++++++-------- nyx/nyx_gui/sec/se.h | 1 + 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/bootloader/sec/se.c b/bootloader/sec/se.c index 794c39d..e20eddf 100644 --- a/bootloader/sec/se.c +++ b/bootloader/sec/se.c @@ -74,8 +74,6 @@ static int _se_wait() static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src_size) { - bpmp_mmu_disable(); - se_ll_t *ll_dst = NULL, *ll_src = NULL; if (dst) @@ -94,17 +92,19 @@ static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src SE(SE_ERR_STATUS_0) = SE(SE_ERR_STATUS_0); SE(SE_INT_STATUS_REG_OFFSET) = SE(SE_INT_STATUS_REG_OFFSET); - SE(SE_OPERATION_REG_OFFSET) = SE_OPERATION(op); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + + SE(SE_OPERATION_REG_OFFSET) = SE_OPERATION(op); int res = _se_wait(); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + if (src) free(ll_src); if (dst) free(ll_dst); - bpmp_mmu_enable(); - return res; } @@ -178,7 +178,7 @@ int se_aes_unwrap_key(u32 ks_dst, u32 ks_src, const void *input) return _se_execute(OP_START, NULL, 0, input, 0x10); } -int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src) +int se_aes_crypt_ecb(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size) { if (enc) { @@ -190,8 +190,13 @@ int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src) 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_CORE_SEL(CORE_DECRYPT); } - SE(SE_BLOCK_COUNT_REG_OFFSET) = 0; - return _se_execute(OP_START, dst, 0x10, src, 0x10); + SE(SE_BLOCK_COUNT_REG_OFFSET) = (src_size >> 4) - 1; + return _se_execute(OP_START, dst, dst_size, src, src_size); +} + +int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src) +{ + return se_aes_crypt_ecb(ks, enc, dst, 0x10, src, 0x10); } int se_aes_crypt_ctr(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size, void *ctr) diff --git a/bootloader/sec/se.h b/bootloader/sec/se.h index 350463e..bd70b28 100644 --- a/bootloader/sec/se.h +++ b/bootloader/sec/se.h @@ -24,6 +24,7 @@ void se_key_acc_ctrl(u32 ks, u32 flags); void se_aes_key_set(u32 ks, void *key, u32 size); void se_aes_key_clear(u32 ks); 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_calc_sha256(void *dst, const void *src, u32 src_size); diff --git a/nyx/nyx_gui/sec/se.c b/nyx/nyx_gui/sec/se.c index 794c39d..e20eddf 100644 --- a/nyx/nyx_gui/sec/se.c +++ b/nyx/nyx_gui/sec/se.c @@ -74,8 +74,6 @@ static int _se_wait() static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src_size) { - bpmp_mmu_disable(); - se_ll_t *ll_dst = NULL, *ll_src = NULL; if (dst) @@ -94,17 +92,19 @@ static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src SE(SE_ERR_STATUS_0) = SE(SE_ERR_STATUS_0); SE(SE_INT_STATUS_REG_OFFSET) = SE(SE_INT_STATUS_REG_OFFSET); - SE(SE_OPERATION_REG_OFFSET) = SE_OPERATION(op); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + + SE(SE_OPERATION_REG_OFFSET) = SE_OPERATION(op); int res = _se_wait(); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + if (src) free(ll_src); if (dst) free(ll_dst); - bpmp_mmu_enable(); - return res; } @@ -178,7 +178,7 @@ int se_aes_unwrap_key(u32 ks_dst, u32 ks_src, const void *input) return _se_execute(OP_START, NULL, 0, input, 0x10); } -int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src) +int se_aes_crypt_ecb(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size) { if (enc) { @@ -190,8 +190,13 @@ int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src) 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_CORE_SEL(CORE_DECRYPT); } - SE(SE_BLOCK_COUNT_REG_OFFSET) = 0; - return _se_execute(OP_START, dst, 0x10, src, 0x10); + SE(SE_BLOCK_COUNT_REG_OFFSET) = (src_size >> 4) - 1; + return _se_execute(OP_START, dst, dst_size, src, src_size); +} + +int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src) +{ + return se_aes_crypt_ecb(ks, enc, dst, 0x10, src, 0x10); } int se_aes_crypt_ctr(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size, void *ctr) diff --git a/nyx/nyx_gui/sec/se.h b/nyx/nyx_gui/sec/se.h index 350463e..bd70b28 100644 --- a/nyx/nyx_gui/sec/se.h +++ b/nyx/nyx_gui/sec/se.h @@ -24,6 +24,7 @@ void se_key_acc_ctrl(u32 ks, u32 flags); void se_aes_key_set(u32 ks, void *key, u32 size); void se_aes_key_clear(u32 ks); 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_calc_sha256(void *dst, const void *src, u32 src_size);