summaryrefslogtreecommitdiff
path: root/providers
diff options
context:
space:
mode:
authorzhangzhilei <zhangzhilei@360.cn>2023-03-12 15:11:20 +0800
committerTomas Mraz <tomas@openssl.org>2023-03-15 12:59:04 +0100
commit738d43634a5192b1be0869f151682bb8e9157d5a (patch)
tree32c44232087aef8362c0644c3b93e77a14d7d037 /providers
parentb36e677f8f563301207ea658e29b3a8f88c2951b (diff)
downloadopenssl-new-738d43634a5192b1be0869f151682bb8e9157d5a.tar.gz
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 <pauli@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/20498)
Diffstat (limited to 'providers')
-rw-r--r--providers/implementations/ciphers/cipher_sm4_gcm_hw.c33
1 files changed, 21 insertions, 12 deletions
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;
}