[][kernel][mt7988][eip197][Add aes-sha256 IPSec inline mode]
[Description]
Add aes-sha256 IPSec inline mode
[Release-log]
N/A
Change-Id: I7a4d95ff25be76eba3abcd0e94ac89bff2af9429
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7141816
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_ipsec.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_ipsec.c
index 4d85f50..ff61b90 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_ipsec.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_ipsec.c
@@ -204,10 +204,41 @@
key_len += SHA1_DIGEST_SIZE;
memcpy(context->data + SIZE_IN_WORDS(key_len),
&xs->id.spi, 4);
+ } else if (strcmp(xs->aalg->alg_name, "hmac(sha256)") == 0) {
+ key_aalg = &xs->aalg->alg_key[0];
+ hmac_setkey("sha256-generic", key_aalg,
+ xs->aalg->alg_key_len / 8,
+ &istate.state, &ostate.state);
+ key_ealg = &xs->ealg->alg_key[0];
+ key_len = xs->ealg->alg_key_len / 8;
+ write_state_le(context->data, (const u32 *)key_ealg, key_len);
+ write_state_be(context->data + SIZE_IN_WORDS(key_len),
+ (const u32 *)&istate.state, SHA256_DIGEST_SIZE);
+
+ key_len += SHA256_DIGEST_SIZE;
+ write_state_be(context->data + SIZE_IN_WORDS(key_len),
+ (const u32 *)&ostate.state, SHA256_DIGEST_SIZE);
+
+ key_len += SHA256_DIGEST_SIZE;
+ memcpy(context->data + SIZE_IN_WORDS(key_len),
+ &xs->id.spi, 4);
+
+ if (xs->xso.flags & XFRM_OFFLOAD_INBOUND) {
+ /* rx path */
+ context->control0 = CTRL_WORD0_IN_SHA256;
+ context->control1 = CTRL_WORD1_IN_SHA256;
+ context->data[50] = 0x07041010;
+ context->data[52] = 0xdd070010;
+ context->data[53] = 0xe4561820;
+ } else {
+ /* tx path */
+ context->control0 = CTRL_WORD0_OUT_SHA256;
+ context->control1 = CTRL_WORD1_OUT_SHA256;
+ context->data[50] = 0x01021010;
+ context->data[53] = 0xe1560817;
+ context->data[55] = 0x0000004d;
+ }
}
- //TODO: sha256
- //else if (strcmp(xs->aalg->alg_name, "hmac(sha256)") == 0) {
- //}
/**
* Set CDRT for inline IPSec
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_ipsec.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_ipsec.h
index 5d7635a..a662dc3 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_ipsec.h
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_ipsec.h
@@ -8,6 +8,10 @@
#define CTRL_WORD1_OUT 0x51400001
#define CTRL_WORD0_IN 0x096ba20f
#define CTRL_WORD1_IN 0x00010001
+#define CTRL_WORD0_OUT_SHA256 0x19eb1606
+#define CTRL_WORD1_OUT_SHA256 0x57400001
+#define CTRL_WORD0_IN_SHA256 0x09eba20f
+#define CTRL_WORD1_IN_SHA256 0x00010001
#define SIZE_IN_WORDS(x) ((x) >> 2)
/* Global memory */