From 9f93757dac745e733a7bbed70ab77d36968a8d69 Mon Sep 17 00:00:00 2001 From: Lin Jinhan Date: Wed, 25 Dec 2024 16:01:55 +0800 Subject: [PATCH] crypto: rockchip: optimize the compatibility of ECC/PKA 1. Ensure that the PKA and ECC modules can be switched over. 2. Improve the security of verify to prevent all zeros from being treated as the correct result in some exceptions. Signed-off-by: Lin Jinhan Change-Id: If7cdc418cb3285fa7fb905381bfea51587750ee5 --- drivers/crypto/rockchip/rk_crypto_ecc.c | 4 +++- drivers/crypto/rockchip/rk_crypto_v2_pka.c | 6 +++--- drivers/crypto/rockchip/rk_crypto_v2_reg.h | 5 ++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/crypto/rockchip/rk_crypto_ecc.c b/drivers/crypto/rockchip/rk_crypto_ecc.c index 050df55882e7..73bab4c61018 100644 --- a/drivers/crypto/rockchip/rk_crypto_ecc.c +++ b/drivers/crypto/rockchip/rk_crypto_ecc.c @@ -406,7 +406,9 @@ int rockchip_ecc_verify(int group_id, uint8_t *hash, uint32_t hash_len, ret = rockchip_ecc_request_trigger(); exit: - if (ret || rk_word_cmp_zero(ecc_st->v, RK_ECP_MAX_WORDS)) { + if (ret || + rk_word_cmp_zero(ecc_st->v, RK_ECP_MAX_WORDS) || + rk_word_cmp_zero(ecc_st->r_, RK_ECP_MAX_WORDS) == 0) { ret = -EKEYREJECTED; dump_ecc_sram(); } diff --git a/drivers/crypto/rockchip/rk_crypto_v2_pka.c b/drivers/crypto/rockchip/rk_crypto_v2_pka.c index 569800857f75..9916d4732639 100644 --- a/drivers/crypto/rockchip/rk_crypto_v2_pka.c +++ b/drivers/crypto/rockchip/rk_crypto_v2_pka.c @@ -85,11 +85,11 @@ enum pka_opcode { #define PKA_BIGNUM_WORDS(x) (rk_bn_get_size(x) / sizeof(u32)) -#define PKA_RAM_FOR_PKA() PKA_WRITE((CRYPTO_RAM_PKA_RDY << CRYPTO_WRITE_MASK_SHIFT) | \ - CRYPTO_RAM_PKA_RDY, CRYPTO_RAM_CTL) +#define PKA_RAM_FOR_PKA() PKA_WRITE(CRYPTO_RAM_CTL_SEL_MASK | CRYPTO_RAM_CTL_PKA, \ + CRYPTO_RAM_CTL) #define PKA_RAM_FOR_CPU() do { \ - PKA_WRITE((CRYPTO_RAM_PKA_RDY << CRYPTO_WRITE_MASK_SHIFT), CRYPTO_RAM_CTL); \ + PKA_WRITE(CRYPTO_RAM_CTL_SEL_MASK | CRYPTO_RAM_CTL_CPU, CRYPTO_RAM_CTL); \ while ((PKA_READ(CRYPTO_RAM_ST) & 0x01) != CRYPTO_CLK_RAM_RDY) \ cpu_relax(); \ } while (0) diff --git a/drivers/crypto/rockchip/rk_crypto_v2_reg.h b/drivers/crypto/rockchip/rk_crypto_v2_reg.h index 7338ef1a9832..a03e3dd97895 100644 --- a/drivers/crypto/rockchip/rk_crypto_v2_reg.h +++ b/drivers/crypto/rockchip/rk_crypto_v2_reg.h @@ -301,7 +301,10 @@ #define CRYPTO_PKA_BASE_OFFSET 0x0480 #define CRYPTO_RAM_CTL (0x0480 - CRYPTO_PKA_BASE_OFFSET) -#define CRYPTO_RAM_PKA_RDY BIT(0) +#define CRYPTO_RAM_CTL_SEL_MASK _SBF(16, 3) +#define CRYPTO_RAM_CTL_CPU _SBF(0, 0) +#define CRYPTO_RAM_CTL_PKA _SBF(0, 1) +#define CRYPTO_RAM_CTL_ECC _SBF(0, 2) #define CRYPTO_RAM_ST (0x0484 - CRYPTO_PKA_BASE_OFFSET) #define CRYPTO_CLK_RAM_RDY BIT(0)