From 77ef9507ad3cd56e63fb6672707c9697b1e80706 Mon Sep 17 00:00:00 2001 From: Lin Jinhan Date: Mon, 3 Jan 2022 16:44:48 +0800 Subject: [PATCH] crypto: rockchip: cryptodev_linux: add rk algo support Signed-off-by: Lin Jinhan Change-Id: I1d1f4214b29546eed2d1c29da8f375ec30a9bac3 --- .../cryptodev_linux/crypto/cryptodev.h | 44 +++++++++ .../crypto/rockchip/cryptodev_linux/ioctl.c | 16 +++- .../rockchip/cryptodev_linux/rk_cryptodev.c | 96 +++++++++++++++++++ .../cryptodev_linux/rk_cryptodev_int.h | 4 + 4 files changed, 156 insertions(+), 4 deletions(-) diff --git a/drivers/crypto/rockchip/cryptodev_linux/crypto/cryptodev.h b/drivers/crypto/rockchip/cryptodev_linux/crypto/cryptodev.h index 9bc8deb328ee..88d7584c23c8 100644 --- a/drivers/crypto/rockchip/cryptodev_linux/crypto/cryptodev.h +++ b/drivers/crypto/rockchip/cryptodev_linux/crypto/cryptodev.h @@ -55,6 +55,50 @@ enum cryptodev_crypto_op_t { CRYPTO_SHA2_224_HMAC, CRYPTO_TLS11_AES_CBC_HMAC_SHA1, CRYPTO_TLS12_AES_CBC_HMAC_SHA256, + + CRYPTO_RK_DES_ECB = 150, + CRYPTO_RK_DES_CBC, + CRYPTO_RK_DES_CFB, + CRYPTO_RK_DES_OFB, + CRYPTO_RK_3DES_ECB, + CRYPTO_RK_3DES_CBC, + CRYPTO_RK_3DES_CFB, + CRYPTO_RK_3DES_OFB, + CRYPTO_RK_SM4_ECB, + CRYPTO_RK_SM4_CBC, + CRYPTO_RK_SM4_CFB, + CRYPTO_RK_SM4_OFB, + CRYPTO_RK_SM4_CTS, + CRYPTO_RK_SM4_CTR, + CRYPTO_RK_SM4_XTS, + CRYPTO_RK_SM4_CCM, + CRYPTO_RK_SM4_GCM, + CRYPTO_RK_SM4_CMAC, + CRYPTO_RK_SM4_CBC_MAC, + CRYPTO_RK_AES_ECB, + CRYPTO_RK_AES_CBC, + CRYPTO_RK_AES_CFB, + CRYPTO_RK_AES_OFB, + CRYPTO_RK_AES_CTS, + CRYPTO_RK_AES_CTR, + CRYPTO_RK_AES_XTS, + CRYPTO_RK_AES_CCM, + CRYPTO_RK_AES_GCM, + CRYPTO_RK_AES_CMAC, + CRYPTO_RK_AES_CBC_MAC, + CRYPTO_RK_MD5, + CRYPTO_RK_SHA1, + CRYPTO_RK_SHA224, + CRYPTO_RK_SHA256, + CRYPTO_RK_SHA384, + CRYPTO_RK_SHA512, + CRYPTO_RK_SHA512_224, + CRYPTO_RK_SHA512_256, + CRYPTO_RK_MD5_HMAC, + CRYPTO_RK_SHA1_HMAC, + CRYPTO_RK_SHA256_HMAC, + CRYPTO_RK_SHA512_HMAC, + CRYPTO_ALGORITHM_ALL, /* Keep updated - see below */ }; diff --git a/drivers/crypto/rockchip/cryptodev_linux/ioctl.c b/drivers/crypto/rockchip/cryptodev_linux/ioctl.c index 3c575585e4e8..07ed97967edc 100644 --- a/drivers/crypto/rockchip/cryptodev_linux/ioctl.c +++ b/drivers/crypto/rockchip/cryptodev_linux/ioctl.c @@ -179,8 +179,12 @@ crypto_create_session(struct fcrypt *fcr, struct session_op *sop) stream = 1; break; default: - ddebug(1, "bad cipher: %d", sop->cipher); - return -EINVAL; + alg_name = rk_get_cipher_name(sop->cipher, &stream, &aead); + if (!alg_name) { + ddebug(1, "bad cipher: %d", sop->cipher); + return -EINVAL; + } + break; } switch (sop->mac) { @@ -239,8 +243,12 @@ crypto_create_session(struct fcrypt *fcr, struct session_op *sop) hmac_mode = 0; break; default: - ddebug(1, "bad mac: %d", sop->mac); - return -EINVAL; + hash_name = rk_get_hash_name(sop->mac, &hmac_mode); + if (!hash_name) { + ddebug(1, "bad mac: %d", sop->mac); + return -EINVAL; + } + break; } /* Create a session and put it to the list. Zeroing the structure helps diff --git a/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev.c b/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev.c index 54eb1ecb9ab9..3f40838d1572 100644 --- a/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev.c +++ b/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev.c @@ -856,3 +856,99 @@ rk_compat_cryptodev_ioctl(struct fcrypt *fcr, unsigned int cmd, unsigned long ar #endif /* CONFIG_COMPAT */ +struct cipher_algo_name_map { + uint32_t id; + const char *name; + int is_stream; + int is_aead; +}; + +struct hash_algo_name_map { + uint32_t id; + const char *name; + int is_hmac; +}; + +static const struct cipher_algo_name_map c_algo_map_tbl[] = { + {CRYPTO_RK_DES_ECB, "ecb-des-rk", 0, 0}, + {CRYPTO_RK_DES_CBC, "cbc-des-rk", 0, 0}, + {CRYPTO_RK_DES_CFB, "cfb-des-rk", 0, 0}, + {CRYPTO_RK_DES_OFB, "ofb-des-rk", 0, 0}, + {CRYPTO_RK_3DES_ECB, "ecb-des3_ede-rk", 0, 0}, + {CRYPTO_RK_3DES_CBC, "cbc-des3_ede-rk", 0, 0}, + {CRYPTO_RK_3DES_CFB, "cfb-des3_ede-rk", 0, 0}, + {CRYPTO_RK_3DES_OFB, "ofb-des3_ede-rk", 0, 0}, + {CRYPTO_RK_SM4_ECB, "ecb-sm4-rk", 0, 0}, + {CRYPTO_RK_SM4_CBC, "cbc-sm4-rk", 0, 0}, + {CRYPTO_RK_SM4_CFB, "cfb-sm4-rk", 0, 0}, + {CRYPTO_RK_SM4_OFB, "ofb-sm4-rk", 0, 0}, + {CRYPTO_RK_SM4_CTS, "cts-sm4-rk", 0, 0}, + {CRYPTO_RK_SM4_CTR, "ctr-sm4-rk", 1, 0}, + {CRYPTO_RK_SM4_XTS, "xts-sm4-rk", 0, 0}, + {CRYPTO_RK_SM4_CCM, "ccm-sm4-rk", 1, 1}, + {CRYPTO_RK_SM4_GCM, "gcm-sm4-rk", 1, 1}, + {CRYPTO_RK_SM4_CMAC, NULL, 0, 0}, + {CRYPTO_RK_SM4_CBC_MAC, NULL, 0, 0}, + {CRYPTO_RK_AES_ECB, "ecb-aes-rk", 0, 0}, + {CRYPTO_RK_AES_CBC, "cbc-aes-rk", 0, 0}, + {CRYPTO_RK_AES_CFB, "cfb-aes-rk", 0, 0}, + {CRYPTO_RK_AES_OFB, "ofb-aes-rk", 0, 0}, + {CRYPTO_RK_AES_CTS, "cts-aes-rk", 0, 0}, + {CRYPTO_RK_AES_CTR, "ctr-aes-rk", 1, 0}, + {CRYPTO_RK_AES_XTS, "xts-aes-rk", 0, 0}, + {CRYPTO_RK_AES_CCM, "ccm-aes-rk", 1, 1}, + {CRYPTO_RK_AES_GCM, "gcm-aes-rk", 1, 1}, + {CRYPTO_RK_AES_CMAC, NULL, 0, 0}, + {CRYPTO_RK_AES_CBC_MAC, NULL, 0, 0}, +}; + +static const struct hash_algo_name_map h_algo_map_tbl[] = { + + {CRYPTO_RK_MD5, "md5-rk", 0}, + {CRYPTO_RK_SHA1, "sha1-rk", 0}, + {CRYPTO_RK_SHA224, "sha224-rk", 0}, + {CRYPTO_RK_SHA256, "sha256-rk", 0}, + {CRYPTO_RK_SHA384, "sha384-rk", 0}, + {CRYPTO_RK_SHA512, "sha512-rk", 0}, + {CRYPTO_RK_SHA512_224, "sha512_224-rk", 0}, + {CRYPTO_RK_SHA512_256, "sha512_256-rk", 0}, + {CRYPTO_RK_MD5_HMAC, "hmac-md5-rk", 1}, + {CRYPTO_RK_SHA1_HMAC, "hmac-sha1-rk", 1}, + {CRYPTO_RK_SHA256_HMAC, "hmac-sha256-rk", 1}, + {CRYPTO_RK_SHA512_HMAC, "hmac-sha512-rk", 1}, +}; + +const char *rk_get_cipher_name(uint32_t id, int *is_stream, int *is_aead) +{ + uint32_t i; + + *is_stream = 0; + *is_aead = 0; + + for (i = 0; i < ARRAY_SIZE(c_algo_map_tbl); i++) { + if (id == c_algo_map_tbl[i].id) { + *is_stream = c_algo_map_tbl[i].is_stream; + *is_aead = c_algo_map_tbl[i].is_aead; + return c_algo_map_tbl[i].name; + } + } + + return NULL; +} + +const char *rk_get_hash_name(uint32_t id, int *is_hmac) +{ + uint32_t i; + + *is_hmac = 0; + + for (i = 0; i < ARRAY_SIZE(h_algo_map_tbl); i++) { + if (id == h_algo_map_tbl[i].id) { + *is_hmac = h_algo_map_tbl[i].is_hmac; + return h_algo_map_tbl[i].name; + } + } + + return NULL; +} + diff --git a/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev_int.h b/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev_int.h index a855f9052e0f..0da8e207f887 100644 --- a/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev_int.h +++ b/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev_int.h @@ -81,4 +81,8 @@ rk_cryptodev_ioctl(struct fcrypt *fcr, unsigned int cmd, unsigned long arg_); long rk_compat_cryptodev_ioctl(struct fcrypt *fcr, unsigned int cmd, unsigned long arg_); +const char *rk_get_cipher_name(uint32_t id, int *is_stream, int *is_aead); + +const char *rk_get_hash_name(uint32_t id, int *is_hmac); + #endif