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)
This commit is contained in:
zhangzhilei 2023-03-12 14:53:01 +08:00 committed by Tomas Mraz
parent 6ec3d3125f
commit fdfa63dfd6

View File

@ -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 = {