summaryrefslogtreecommitdiff
path: root/providers
diff options
context:
space:
mode:
authorzhangzhilei <zhangzhilei@360.cn>2023-03-12 14:53:01 +0800
committerTomas Mraz <tomas@openssl.org>2023-03-21 08:20:37 +0100
commitfdfa63dfd6f1e6d7aff175fba56486a0cf79713f (patch)
treeecf7d1baf0ba5bd5887adbb1049084f49f5ccc3b /providers
parent6ec3d3125f76aa9f11c133333f868c42b9b585c4 (diff)
downloadopenssl-new-fdfa63dfd6f1e6d7aff175fba56486a0cf79713f.tar.gz
enable hardware acceleration for sm4-ccm
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)
Diffstat (limited to 'providers')
-rw-r--r--providers/implementations/ciphers/cipher_sm4_ccm_hw.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/providers/implementations/ciphers/cipher_sm4_ccm_hw.c b/providers/implementations/ciphers/cipher_sm4_ccm_hw.c
index 791daf3e46..468c1f3b8b 100644
--- a/providers/implementations/ciphers/cipher_sm4_ccm_hw.c
+++ b/providers/implementations/ciphers/cipher_sm4_ccm_hw.c
@@ -12,18 +12,42 @@
*/
#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 = {