summaryrefslogtreecommitdiff
path: root/Backport-Further-acceleration-for-SM4-GCM-on-ARM.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Backport-Further-acceleration-for-SM4-GCM-on-ARM.patch')
-rw-r--r--Backport-Further-acceleration-for-SM4-GCM-on-ARM.patch73
1 files changed, 73 insertions, 0 deletions
diff --git a/Backport-Further-acceleration-for-SM4-GCM-on-ARM.patch b/Backport-Further-acceleration-for-SM4-GCM-on-ARM.patch
new file mode 100644
index 0000000..11129d9
--- /dev/null
+++ b/Backport-Further-acceleration-for-SM4-GCM-on-ARM.patch
@@ -0,0 +1,73 @@
+From 98da8a58f964e279decc1bbbe8f07d807de05f7f Mon Sep 17 00:00:00 2001
+From: Daniel Hu <Daniel.Hu@arm.com>
+Date: Wed, 2 Mar 2022 12:55:39 +0000
+Subject: [PATCH 06/13] Further acceleration for SM4-GCM on ARM
+
+This patch will allow the SM4-GCM function to leverage the SM4
+high-performance CTR crypto interface already implemented for ARM,
+which is faster than current single block cipher routine used
+for GCM
+
+It does not address the acceleration of GHASH function of GCM,
+which can be a future task, still we can see immediate uplift of
+performance (up to 4X)
+
+Before this patch:
+type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
+SM4-GCM 186432.92k 394234.05k 587916.46k 639365.12k 648486.91k 652924.25k
+
+After the patch:
+SM4-GCM 193924.87k 860940.35k 1696083.71k 2302548.31k 2580411.73k 2607398.91k
+
+Signed-off-by: Daniel Hu <Daniel.Hu@arm.com>
+
+Reviewed-by: Tomas Mraz <tomas@openssl.org>
+Reviewed-by: Paul Dale <pauli@openssl.org>
+(Merged from https://github.com/openssl/openssl/pull/17814)
+---
+ .../ciphers/cipher_sm4_gcm_hw.c | 25 ++++++++++++++++++-
+ 1 file changed, 24 insertions(+), 1 deletion(-)
+
+diff --git a/providers/implementations/ciphers/cipher_sm4_gcm_hw.c b/providers/implementations/ciphers/cipher_sm4_gcm_hw.c
+index c0c9b22bd3..b9633f83ed 100644
+--- a/providers/implementations/ciphers/cipher_sm4_gcm_hw.c
++++ b/providers/implementations/ciphers/cipher_sm4_gcm_hw.c
+@@ -42,11 +42,34 @@ static int sm4_gcm_initkey(PROV_GCM_CTX *ctx, const unsigned char *key,
+ return 1;
+ }
+
++static int hw_gcm_cipher_update(PROV_GCM_CTX *ctx, const unsigned char *in,
++ size_t len, unsigned char *out)
++{
++ if (ctx->enc) {
++ if (ctx->ctr != NULL) {
++ if (CRYPTO_gcm128_encrypt_ctr32(&ctx->gcm, in, out, len, ctx->ctr))
++ return 0;
++ } else {
++ if (CRYPTO_gcm128_encrypt(&ctx->gcm, in, out, len))
++ return 0;
++ }
++ } else {
++ if (ctx->ctr != NULL) {
++ if (CRYPTO_gcm128_decrypt_ctr32(&ctx->gcm, in, out, len, ctx->ctr))
++ return 0;
++ } else {
++ if (CRYPTO_gcm128_decrypt(&ctx->gcm, in, out, len))
++ return 0;
++ }
++ }
++ return 1;
++}
++
+ static const PROV_GCM_HW sm4_gcm = {
+ sm4_gcm_initkey,
+ ossl_gcm_setiv,
+ ossl_gcm_aad_update,
+- ossl_gcm_cipher_update,
++ hw_gcm_cipher_update,
+ ossl_gcm_cipher_final,
+ ossl_gcm_one_shot
+ };
+--
+2.37.3.windows.1
+