]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
enable hardware acceleration for sm4-ccm
authorzhangzhilei <zhangzhilei@360.cn>
Sun, 12 Mar 2023 06:53:01 +0000 (14:53 +0800)
committerTomas Mraz <tomas@openssl.org>
Tue, 21 Mar 2023 07:20:37 +0000 (08:20 +0100)
benchmark data test on KunPeng920

before:
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
SM4-CCM          20401.16k    33739.97k    40476.08k    42326.70k    43373.91k    43220.99k

after:
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
SM4-CCM           8050.11k    13011.29k    15407.10k    16147.80k    16378.54k    16449.76k

Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/20499)

providers/implementations/ciphers/cipher_sm4_ccm_hw.c

index 791daf3e46f3c72950172e7cf15a04fabba63604..468c1f3b8b927df5370d0cd8fe5f7ceba040949d 100644 (file)
  */
 
 #include "cipher_sm4_ccm.h"
+#include "crypto/sm4_platform.h"
+
+#define SM4_HW_CCM_SET_KEY_FN(fn_set_enc_key, fn_blk, fn_ccm_enc, fn_ccm_dec)  \
+    fn_set_enc_key(key, &actx->ks.ks);                                         \
+    CRYPTO_ccm128_init(&ctx->ccm_ctx, ctx->m, ctx->l, &actx->ks.ks,            \
+                       (block128_f)fn_blk);                                    \
+    ctx->str = ctx->enc ? (ccm128_f)fn_ccm_enc : (ccm128_f)fn_ccm_dec;         \
+    ctx->key_set = 1;
 
 static int ccm_sm4_initkey(PROV_CCM_CTX *ctx,
                            const unsigned char *key, size_t keylen)
 {
     PROV_SM4_CCM_CTX *actx = (PROV_SM4_CCM_CTX *)ctx;
 
-    ossl_sm4_set_key(key, &actx->ks.ks);
-    CRYPTO_ccm128_init(&ctx->ccm_ctx, ctx->m, ctx->l, &actx->ks.ks,
-                       (block128_f)ossl_sm4_encrypt);
-    ctx->str = NULL;
-    ctx->key_set = 1;
-    return 1;
+#ifdef HWSM4_CAPABLE
+    if (HWSM4_CAPABLE) {
+        SM4_HW_CCM_SET_KEY_FN(HWSM4_set_encrypt_key, HWSM4_encrypt, NULL, NULL);
+    } else
+#endif /* HWSM4_CAPABLE */
+
+#ifdef VPSM4_EX_CAPABLE
+    if (VPSM4_EX_CAPABLE) {
+        SM4_HW_CCM_SET_KEY_FN(vpsm4_ex_set_encrypt_key, vpsm4_ex_encrypt, NULL,
+                              NULL);
+    } else
+#endif /* VPSM4_EX_CAPABLE */
+
+#ifdef VPSM4_CAPABLE
+    if (VPSM4_CAPABLE) {
+        SM4_HW_CCM_SET_KEY_FN(vpsm4_set_encrypt_key, vpsm4_encrypt, NULL, NULL);
+    } else
+#endif /* VPSM4_CAPABLE */
+    {
+        SM4_HW_CCM_SET_KEY_FN(ossl_sm4_set_key, ossl_sm4_encrypt, NULL, NULL);
+    }
+  return 1;
 }
 
 static const PROV_CCM_HW ccm_sm4 = {