diff options
author | zhangzhilei <zhangzhilei@360.cn> | 2023-03-12 15:11:20 +0800 |
---|---|---|
committer | Tomas Mraz <tomas@openssl.org> | 2023-03-15 12:59:04 +0100 |
commit | 738d43634a5192b1be0869f151682bb8e9157d5a (patch) | |
tree | 32c44232087aef8362c0644c3b93e77a14d7d037 /providers | |
parent | b36e677f8f563301207ea658e29b3a8f88c2951b (diff) | |
download | openssl-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.c | 33 |
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; } |