From 738d43634a5192b1be0869f151682bb8e9157d5a Mon Sep 17 00:00:00 2001 From: zhangzhilei Date: Sun, 12 Mar 2023 15:11:20 +0800 Subject: enable VPSM4_EX_CAPABLE for sm4_gcm 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 Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/20498) --- .../implementations/ciphers/cipher_sm4_gcm_hw.c | 33 ++++++++++++++-------- 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'providers') diff --git a/providers/implementations/ciphers/cipher_sm4_gcm_hw.c b/providers/implementations/ciphers/cipher_sm4_gcm_hw.c index 268d47f65d..e2d225036d 100644 --- a/providers/implementations/ciphers/cipher_sm4_gcm_hw.c +++ b/providers/implementations/ciphers/cipher_sm4_gcm_hw.c @@ -14,37 +14,46 @@ #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; } -- cgit v1.2.1