summaryrefslogtreecommitdiff
path: root/cipher/sm4.c
diff options
context:
space:
mode:
authorTianjia Zhang <tianjia.zhang@linux.alibaba.com>2022-07-28 16:26:54 +0800
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2022-07-31 18:03:36 +0300
commit8287dea8379fa9e43dc331c6bd444dd25a962e4b (patch)
tree22d8f1a243911d698c1dd2fb680ef53ad0774947 /cipher/sm4.c
parentdb5136c4d9331c001bbe91cfe6625ae7738f8575 (diff)
downloadlibgcrypt-8287dea8379fa9e43dc331c6bd444dd25a962e4b.tar.gz
sm4: add ARMv8 CE accelerated implementation for XTS mode
* cipher/sm4-armv8-aarch64-ce.S (_gcry_sm4_armv8_ce_xts_crypt): New. * cipher/sm4.c (_gcry_sm4_armv8_ce_xts_crypt): New. (_gcry_sm4_xts_crypt) [USE_ARM_CE]: Add ARMv8 CE implementation for XTS. -- Benchmark on T-Head Yitian-710 2.75 GHz: Before: SM4 | nanosecs/byte mebibytes/sec cycles/byte auto Mhz XTS enc | 0.373 ns/B 2560 MiB/s 1.02 c/B 2749 XTS dec | 0.372 ns/B 2562 MiB/s 1.02 c/B 2750 After (1.18x faster): SM4 | nanosecs/byte mebibytes/sec cycles/byte auto Mhz XTS enc | 0.314 ns/B 3038 MiB/s 0.863 c/B 2749 XTS dec | 0.314 ns/B 3037 MiB/s 0.863 c/B 2749 Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
Diffstat (limited to 'cipher/sm4.c')
-rw-r--r--cipher/sm4.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/cipher/sm4.c b/cipher/sm4.c
index b5d4691d..4cac3b6c 100644
--- a/cipher/sm4.c
+++ b/cipher/sm4.c
@@ -1,6 +1,6 @@
/* sm4.c - SM4 Cipher Algorithm
* Copyright (C) 2020 Alibaba Group.
- * Copyright (C) 2020 Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
+ * Copyright (C) 2020-2022 Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
* Copyright (C) 2020-2022 Jussi Kivilinna <jussi.kivilinna@iki.fi>
*
* This file is part of Libgcrypt.
@@ -539,6 +539,11 @@ extern void _gcry_sm4_armv8_ce_cfb_dec(const u32 *rk_enc, byte *out,
byte *iv,
size_t nblocks);
+extern void _gcry_sm4_armv8_ce_xts_crypt(const u32 *rk, byte *out,
+ const byte *in,
+ byte *tweak,
+ size_t nblocks);
+
extern void _gcry_sm4_armv8_ce_crypt_blk1_8(const u32 *rk, byte *out,
const byte *in,
size_t num_blocks);
@@ -1510,6 +1515,17 @@ _gcry_sm4_xts_crypt (void *context, unsigned char *tweak, void *outbuf_arg,
const unsigned char *inbuf = inbuf_arg;
int burn_stack_depth = 0;
+#ifdef USE_ARM_CE
+ if (ctx->use_arm_ce)
+ {
+ /* Process all blocks at a time. */
+ _gcry_sm4_armv8_ce_xts_crypt(encrypt ? ctx->rkey_enc : ctx->rkey_dec,
+ outbuf, inbuf, tweak, nblocks);
+
+ nblocks = 0;
+ }
+#endif
+
/* Process remaining blocks. */
if (nblocks)
{