]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
enable VPSM4_EX_CAPABLE for sm4_gcm
authorzhangzhilei <zhangzhilei@360.cn>
Sun, 12 Mar 2023 07:11:20 +0000 (15:11 +0800)
committerTomas Mraz <tomas@openssl.org>
Wed, 15 Mar 2023 11:59:04 +0000 (12:59 +0100)
type     16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
before:
SM4-GCM  71134.38k    81512.39k    83432.11k    83808.60k    85183.15k    86199.57k
after:
SM4-GCM  30656.22k   108801.82k   196005.97k   198715.73k   199349.59k   199387.82k

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

providers/implementations/ciphers/cipher_sm4_gcm_hw.c

index 268d47f65d1d39a978e2919e46afd8bfb021dc63..e2d225036db9c41f2139c2061e77281d724b131f 100644 (file)
 #include "cipher_sm4_gcm.h"
 #include "crypto/sm4_platform.h"
 
+# define SM4_GCM_HW_SET_KEY_CTR_FN(ks, fn_set_enc_key, fn_block, fn_ctr)       \
+    ctx->ks = ks;                                                              \
+    fn_set_enc_key(key, ks);                                                   \
+    CRYPTO_gcm128_init(&ctx->gcm, ks, (block128_f)fn_block);                   \
+    ctx->ctr = (ctr128_f)fn_ctr;                                               \
+    ctx->key_set = 1;
+
 static int sm4_gcm_initkey(PROV_GCM_CTX *ctx, const unsigned char *key,
                            size_t keylen)
 {
     PROV_SM4_GCM_CTX *actx = (PROV_SM4_GCM_CTX *)ctx;
     SM4_KEY *ks = &actx->ks.ks;
 
-    ctx->ks = ks;
 # ifdef HWSM4_CAPABLE
     if (HWSM4_CAPABLE) {
-        HWSM4_set_encrypt_key(key, ks);
-        CRYPTO_gcm128_init(&ctx->gcm, ks, (block128_f) HWSM4_encrypt);
 #  ifdef HWSM4_ctr32_encrypt_blocks
-        ctx->ctr = (ctr128_f) HWSM4_ctr32_encrypt_blocks;
+        SM4_GCM_HW_SET_KEY_CTR_FN(ks, HWSM4_set_encrypt_key, HWSM4_encrypt,
+                                  HWSM4_ctr32_encrypt_blocks);
 #  else /* HWSM4_ctr32_encrypt_blocks */
-        ctx->ctr = (ctr128_f)NULL;
+        SM4_GCM_HW_SET_KEY_CTR_FN(ks, HWSM4_set_encrypt_key, HWSM4_encrypt, NULL);
 #  endif
     } else
 # endif /* HWSM4_CAPABLE */
+
+#ifdef VPSM4_EX_CAPABLE
+    if (VPSM4_EX_CAPABLE) {
+        SM4_GCM_HW_SET_KEY_CTR_FN(ks, vpsm4_ex_set_decrypt_key, vpsm4_ex_encrypt,
+                                  vpsm4_ex_ctr32_encrypt_blocks);
+    } else
+#endif /* VPSM4_EX_CAPABLE */
+
 # ifdef VPSM4_CAPABLE
     if (VPSM4_CAPABLE) {
-        vpsm4_set_encrypt_key(key, ks);
-        CRYPTO_gcm128_init(&ctx->gcm, ks, (block128_f) vpsm4_encrypt);
-        ctx->ctr = (ctr128_f) vpsm4_ctr32_encrypt_blocks;
+        SM4_GCM_HW_SET_KEY_CTR_FN(ks, vpsm4_set_encrypt_key, vpsm4_encrypt,
+                                  vpsm4_ctr32_encrypt_blocks);
     } else
 # endif /* VPSM4_CAPABLE */
     {
-        ossl_sm4_set_key(key, ks);
-        CRYPTO_gcm128_init(&ctx->gcm, ks, (block128_f)ossl_sm4_encrypt);
-        ctx->ctr = (ctr128_f)NULL;
+        SM4_GCM_HW_SET_KEY_CTR_FN(ks, ossl_sm4_set_key, ossl_sm4_encrypt, NULL);
     }
-    ctx->key_set = 1;
 
     return 1;
 }