libwd/0039-uadk-cipher-support-sm4-xts-GB-standard.patch
2023-10-31 16:59:15 +08:00

126 lines
4.0 KiB
Diff

From 083fb5b4ad2e4deeea7bc35603b45e834aeac3d8 Mon Sep 17 00:00:00 2001
From: Weili Qian <qianweili@huawei.com>
Date: Thu, 26 Oct 2023 16:17:42 +0800
Subject: [PATCH 39/42] uadk/cipher: support sm4-xts GB standard.
Support sm4-xts GB standard.
Signed-off-by: Weili Qian <qianweili@huawei.com>
---
drv/hisi_sec.c | 8 +++++++-
include/wd_cipher.h | 3 +++
wd_alg.c | 3 +++
wd_cipher.c | 9 +++++----
4 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c
index 507f48b..03e7037 100644
--- a/drv/hisi_sec.c
+++ b/drv/hisi_sec.c
@@ -45,6 +45,8 @@
#define SEC_CALG_OFFSET_V3 4
#define SEC_AKEY_OFFSET_V3 9
#define SEC_MAC_OFFSET_V3 4
+#define SEC_SM4_XTS_STD_V3 25
+#define SEC_SM4_XTS_GB_V3 0x1
#define SEC_AUTH_ALG_OFFSET_V3 15
#define SEC_SVA_PREFETCH_OFFSET 27
#define SEC_ENABLE_SVA_PREFETCH 0x1
@@ -927,7 +929,7 @@ static int cipher_len_check(struct wd_cipher_msg *msg)
msg->mode == WD_CIPHER_CTR)
return 0;
- if (msg->mode == WD_CIPHER_XTS) {
+ if (msg->mode == WD_CIPHER_XTS || msg->mode == WD_CIPHER_XTS_GB) {
if (msg->in_bytes < AES_BLOCK_SIZE) {
WD_ERR("input cipher length is too small, size = %u\n",
msg->in_bytes);
@@ -1217,6 +1219,10 @@ static int fill_cipher_bd3_mode(struct wd_cipher_msg *msg,
case WD_CIPHER_XTS:
c_mode = C_MODE_XTS;
break;
+ case WD_CIPHER_XTS_GB:
+ c_mode = C_MODE_XTS;
+ sqe->auth_mac_key |= (__u32)(SEC_SM4_XTS_GB_V3 << SEC_SM4_XTS_STD_V3);
+ break;
case WD_CIPHER_CFB:
c_mode = C_MODE_CFB;
break;
diff --git a/include/wd_cipher.h b/include/wd_cipher.h
index 8f043fd..7e63402 100644
--- a/include/wd_cipher.h
+++ b/include/wd_cipher.h
@@ -50,6 +50,8 @@ enum wd_cipher_alg {
/**
* wd_cipher_mode - Algorithm mode of cipher
+ * WD_CIPHER_XTS for xts specified by IEEE Std 1619-2007.
+ * WD_CIPHER_XTS_GB for xts specified by GB/T 17964-2021.
*/
enum wd_cipher_mode {
WD_CIPHER_ECB,
@@ -63,6 +65,7 @@ enum wd_cipher_mode {
WD_CIPHER_CBC_CS3,
WD_CIPHER_CCM,
WD_CIPHER_GCM,
+ WD_CIPHER_XTS_GB,
WD_CIPHER_MODE_TYPE_MAX,
};
diff --git a/wd_alg.c b/wd_alg.c
index be38e52..8d88316 100644
--- a/wd_alg.c
+++ b/wd_alg.c
@@ -213,6 +213,9 @@ bool wd_drv_alg_support(const char *alg_name,
struct wd_alg_list *head = &alg_list_head;
struct wd_alg_list *pnext = head->next;
+ if (!alg_name)
+ return false;
+
while (pnext) {
if (!strcmp(alg_name, pnext->alg_name) &&
!strcmp(drv->drv_name, pnext->drv_name)) {
diff --git a/wd_cipher.c b/wd_cipher.c
index 2eaa77b..58d34f7 100644
--- a/wd_cipher.c
+++ b/wd_cipher.c
@@ -46,7 +46,8 @@ static const unsigned char des_weak_keys[DES_WEAK_KEY_NUM][DES_KEY_SIZE] = {
static char *wd_cipher_alg_name[WD_CIPHER_ALG_TYPE_MAX][WD_CIPHER_MODE_TYPE_MAX] = {
{"ecb(sm4)", "cbc(sm4)", "ctr(sm4)", "xts(sm4)", "ofb(sm4)",
- "cfb(sm4)", "cbc-cs1(sm4)", "cbc-cs2(sm4)", "cbc-cs3(sm4)"},
+ "cfb(sm4)", "cbc-cs1(sm4)", "cbc-cs2(sm4)", "cbc-cs3(sm4)",
+ "", "", "xts(sm4)"},
{"ecb(aes)", "cbc(aes)", "ctr(aes)", "xts(aes)", "ofb(aes)",
"cfb(aes)", "cbc-cs1(aes)", "cbc-cs2(aes)", "cbc-cs3(aes)"},
{"ecb(des)", "cbc(des)",},
@@ -145,7 +146,7 @@ static int cipher_key_len_check(struct wd_cipher_sess *sess, __u32 length)
__u32 key_len = length;
int ret = 0;
- if (sess->mode == WD_CIPHER_XTS) {
+ if (sess->mode == WD_CIPHER_XTS || sess->mode == WD_CIPHER_XTS_GB) {
if (length & XTS_MODE_KEY_LEN_MASK) {
WD_ERR("invalid: unsupported XTS key length, length = %u!\n", length);
return -WD_EINVAL;
@@ -250,13 +251,13 @@ handle_t wd_cipher_alloc_sess(struct wd_cipher_sess_setup *setup)
}
sess->alg_name = wd_cipher_alg_name[setup->alg][setup->mode];
- sess->alg = setup->alg;
- sess->mode = setup->mode;
ret = wd_drv_alg_support(sess->alg_name, wd_cipher_setting.driver);
if (!ret) {
WD_ERR("failed to support this algorithm: %s!\n", sess->alg_name);
goto err_sess;
}
+ sess->alg = setup->alg;
+ sess->mode = setup->mode;
/* Some simple scheduler don't need scheduling parameters */
sess->sched_key = (void *)wd_cipher_setting.sched.sched_init(
--
2.25.1