mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
crypto: rockchip: cryptodev_linux: add rk algo support
Signed-off-by: Lin Jinhan <troy.lin@rock-chips.com> Change-Id: I1d1f4214b29546eed2d1c29da8f375ec30a9bac3
This commit is contained in:
@@ -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 */
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user