DPDK patches and discussions
 help / color / mirror / Atom feed
From: Akhil Goyal <gakhil@marvell.com>
To: Brian Dooley <brian.dooley@intel.com>, Kai Ji <kai.ji@intel.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>
Subject: RE: [EXT] [PATCH v3] crypto/qat: default to IPsec MB for pre and post computes
Date: Thu, 25 May 2023 07:28:11 +0000	[thread overview]
Message-ID: <CO6PR18MB4484752360BE275C10CB3A1FD8469@CO6PR18MB4484.namprd18.prod.outlook.com> (raw)
In-Reply-To: <20230522143959.719233-1-brian.dooley@intel.com>

> Subject: [EXT] [PATCH v3] crypto/qat: default to IPsec MB for pre and post
> computes

Please reword the title to make it smaller.

And please rebase the patch. It does not apply to top of next-crypto
> 
> Pre and post computations currently use the OpenSSL library by default.
> This patch changes the default option to Intel IPsec MB library version
> 1.4 for the required computations. If this version of IPsec is not met
> it will fallback to use OpenSSL.
> 
> Added version checks for libipsecmb and libcrypto into meson build.
> Added directives for detecting IPsec MB or OpenSSL.
> 
> Signed-off-by: Brian Dooley <brian.dooley@intel.com>
> ---
> v3:
> Fix checkpatch warnings by replacing return with goto
> v2:
> OpenSSL code reintroduced as a fallback feature if Intel IPsec MB 1.4
> not available
> ---
>  doc/guides/cryptodevs/qat.rst                |  14 +-
>  drivers/common/qat/meson.build               |  30 +-
>  drivers/common/qat/qat_device.c              |   1 -
>  drivers/common/qat/qat_device.h              |   3 +-
>  drivers/crypto/qat/dev/qat_crypto_pmd_gens.h |  10 +
>  drivers/crypto/qat/qat_sym.c                 |   9 +-
>  drivers/crypto/qat/qat_sym.h                 |  27 +
>  drivers/crypto/qat/qat_sym_session.c         | 874 ++++++++++---------
>  drivers/crypto/qat/qat_sym_session.h         |  14 +
>  9 files changed, 542 insertions(+), 440 deletions(-)
> 
> diff --git a/doc/guides/cryptodevs/qat.rst b/doc/guides/cryptodevs/qat.rst
> index ef754106a8..91b32d9639 100644
> --- a/doc/guides/cryptodevs/qat.rst
> +++ b/doc/guides/cryptodevs/qat.rst
> @@ -294,18 +294,12 @@ by comma. When the same parameter is used more
> than once first occurrence of the
>  is used.
>  Maximum threshold that can be set is 32.
> 
> -Running QAT PMD with Intel IPSEC MB library for symmetric precomputes
> function
> +Running QAT PMD with Intel IPsec MB library for symmetric precomputes
> function
> 
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> ~~~~~~~~~~~~~
> 
> -The QAT PMD use Openssl library for partial hash calculation in symmetirc
> precomputes function by
> -default, the following parameter is allow QAT PMD switch over to multi-buffer
> job API if Intel
> -IPSEC MB library installed on system.
> -
> -- qat_ipsec_mb_lib
> -
> -To use this feature the user must set the parameter on process start as a device
> additional parameter::
> -
> -  -a 03:01.1,qat_ipsec_mb_lib=1
> +The QAT PMD uses Intel IPsec MB library for partial hash calculation in
> symmetric precomputes function by
> +default, the minimum required version of IPsec MB library is v1.4. If this version
> of IPsec is not met it
> +will fallback to use OpenSSL
> 
> 
>  Device and driver naming
> diff --git a/drivers/common/qat/meson.build
> b/drivers/common/qat/meson.build
> index b84e5b3c6c..9c5eb99acd 100644
> --- a/drivers/common/qat/meson.build
> +++ b/drivers/common/qat/meson.build
> @@ -28,30 +28,37 @@ if disable_drivers.contains(qat_compress_path)
>  endif
> 
>  libcrypto = dependency('libcrypto', required: false, method: 'pkg-config')
> -if qat_crypto and not libcrypto.found()
> -    qat_crypto = false
> -    dpdk_drvs_disabled += qat_crypto_path
> -    set_variable(qat_crypto_path.underscorify() + '_disable_reason',
> -            'missing dependency, libcrypto')
> -endif
> 
> -IMB_required_ver = '1.2.0'
> +IMB_required_ver = '1.4.0'
>  IMB_header = '#include<intel-ipsec-mb.h>'
>  if arch_subdir == 'arm'
>      IMB_header = '#include<ipsec-mb.h>'
>  endif
>  libipsecmb = cc.find_library('IPSec_MB', required: false)
> -libcrypto_3 = dependency('libcrypto', required: false,
> -    method: 'pkg-config', version : '>=3.0.0')
> -if libipsecmb.found() and libcrypto_3.found()
> +if libipsecmb.found()
>      # version comes with quotes, so we split based on " and take the middle
>      imb_ver = cc.get_define('IMB_VERSION_STR',
>          prefix : IMB_header).split('"')[1]
> 
>      if (imb_ver.version_compare('>=' + IMB_required_ver))
>          ext_deps += libipsecmb
> -        dpdk_conf.set('RTE_QAT_LIBIPSECMB', true)
> +    elif libcrypto.found()
> +        ext_deps += libcrypto
> +        dpdk_conf.set('RTE_QAT_OPENSSL', true)
> +    else
> +        qat_crypto = false
> +        dpdk_drvs_disabled += qat_crypto_path
> +        set_variable(qat_crypto_path.underscorify() + '_disable_reason',
> +            'missing dependency, libipsecmb or libcrypto')
>      endif
> +elif libcrypto.found()
> +    ext_deps += libcrypto
> +    dpdk_conf.set('RTE_QAT_OPENSSL', true)
> +else
> +    qat_crypto = false
> +    dpdk_drvs_disabled += qat_crypto_path
> +    set_variable(qat_crypto_path.underscorify() + '_disable_reason',
> +        'missing dependency, libipsecmb or libcrypto')
>  endif
> 
>  # The driver should not build if both compression and crypto are disabled
> @@ -103,6 +110,5 @@ if qat_crypto
>          sources += files(join_paths(qat_crypto_relpath, f))
>      endforeach
>      deps += ['security']
> -    ext_deps += libcrypto
>      cflags += ['-DBUILD_QAT_SYM', '-DBUILD_QAT_ASYM']
>  endif
> diff --git a/drivers/common/qat/qat_device.c
> b/drivers/common/qat/qat_device.c
> index 8bce2ac073..cf9a89dc0c 100644
> --- a/drivers/common/qat/qat_device.c
> +++ b/drivers/common/qat/qat_device.c
> @@ -365,7 +365,6 @@ static int qat_pci_probe(struct rte_pci_driver *pci_drv
> __rte_unused,
>  	struct qat_pci_device *qat_pci_dev;
>  	struct qat_dev_hw_spec_funcs *ops_hw;
>  	struct qat_dev_cmd_param qat_dev_cmd_param[] = {
> -			{ QAT_IPSEC_MB_LIB, 0 },
>  			{ SYM_ENQ_THRESHOLD_NAME, 0 },
>  			{ ASYM_ENQ_THRESHOLD_NAME, 0 },
>  			{ COMP_ENQ_THRESHOLD_NAME, 0 },
> diff --git a/drivers/common/qat/qat_device.h
> b/drivers/common/qat/qat_device.h
> index bc3da04238..873a5583ad 100644
> --- a/drivers/common/qat/qat_device.h
> +++ b/drivers/common/qat/qat_device.h
> @@ -17,12 +17,11 @@
> 
>  #define QAT_DEV_NAME_MAX_LEN	64
> 
> -#define QAT_IPSEC_MB_LIB "qat_ipsec_mb_lib"
>  #define SYM_ENQ_THRESHOLD_NAME "qat_sym_enq_threshold"
>  #define ASYM_ENQ_THRESHOLD_NAME "qat_asym_enq_threshold"
>  #define COMP_ENQ_THRESHOLD_NAME "qat_comp_enq_threshold"
>  #define QAT_CMD_SLICE_MAP "qat_cmd_slice_disable"
> -#define QAT_CMD_SLICE_MAP_POS	4
> +#define QAT_CMD_SLICE_MAP_POS	3
>  #define MAX_QP_THRESHOLD_SIZE	32
> 
>  /**
> diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
> b/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
> index 524c291340..b04de0e983 100644
> --- a/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
> +++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
> @@ -82,8 +82,13 @@ qat_bpicipher_preprocess(struct qat_sym_session *ctx,
>  			QAT_DP_HEXDUMP_LOG(DEBUG, "BPI: dst before pre-
> process:",
>  			dst, last_block_len);
>  #endif
> +#ifdef RTE_QAT_OPENSSL
>  		op_bpi_cipher_decrypt(last_block, dst, iv, block_len,
>  				last_block_len, ctx->bpi_ctx);
> +#else
> +		bpi_cipher_ipsec(last_block, dst, iv, last_block_len, ctx-
> >expkey,
> +			ctx->mb_mgr, ctx->docsis_key_len);
> +#endif
>  #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
>  		QAT_DP_HEXDUMP_LOG(DEBUG, "BPI: src after pre-process:",
>  			last_block, last_block_len);
> @@ -231,7 +236,12 @@ qat_sym_convert_op_to_vec_cipher(struct
> rte_crypto_op *op,
>  		cipher_ofs = op->sym->cipher.data.offset >> 3;
>  		break;
>  	case 0:
> +
> +#ifdef RTE_QAT_OPENSSL
>  		if (ctx->bpi_ctx) {
> +#else
> +		if (ctx->mb_mgr) {
> +#endif
>  			/* DOCSIS - only send complete blocks to device.
>  			 * Process any partial block using CFB mode.
>  			 * Even if 0 complete blocks, still send this to device
> diff --git a/drivers/crypto/qat/qat_sym.c b/drivers/crypto/qat/qat_sym.c
> index 08e92191a3..ac3a44395e 100644
> --- a/drivers/crypto/qat/qat_sym.c
> +++ b/drivers/crypto/qat/qat_sym.c
> @@ -1,5 +1,5 @@
>  /* SPDX-License-Identifier: BSD-3-Clause
> - * Copyright(c) 2015-2022 Intel Corporation
> + * Copyright(c) 2015-2023 Intel Corporation
>   */
> 
>  #include <openssl/evp.h>
> @@ -16,7 +16,6 @@
>  #include "qat_qp.h"
> 
>  uint8_t qat_sym_driver_id;
> -int qat_ipsec_mb_lib;
> 
>  struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[QAT_N_GENS];
> 
> @@ -110,7 +109,11 @@ qat_sym_build_request(void *in_op, uint8_t
> *out_msg,
>  			struct rte_cryptodev *cdev;
>  			struct qat_cryptodev_private *internals;
> 
> +#ifdef RTE_QAT_OPENSSL
>  			if (unlikely(ctx->bpi_ctx == NULL)) {
> +#else
> +			if (unlikely(ctx->mb_mgr == NULL)) {
> +#endif
>  				QAT_DP_LOG(ERR, "QAT PMD only supports
> security"
>  						" operation requests for"
>  						" DOCSIS, op (%p) is not for"
> @@ -279,8 +282,6 @@ qat_sym_dev_create(struct qat_pci_device
> *qat_pci_dev,
>  		if (!strcmp(qat_dev_cmd_param[i].name,
> SYM_ENQ_THRESHOLD_NAME))
>  			internals->min_enq_burst_threshold =
>  					qat_dev_cmd_param[i].val;
> -		if (!strcmp(qat_dev_cmd_param[i].name, QAT_IPSEC_MB_LIB))
> -			qat_ipsec_mb_lib = qat_dev_cmd_param[i].val;
>  		if (!strcmp(qat_dev_cmd_param[i].name,
> QAT_CMD_SLICE_MAP))
>  			slice_map = qat_dev_cmd_param[i].val;
>  		i++;
> diff --git a/drivers/crypto/qat/qat_sym.h b/drivers/crypto/qat/qat_sym.h
> index 9a4251e08b..a839f7ad7a 100644
> --- a/drivers/crypto/qat/qat_sym.h
> +++ b/drivers/crypto/qat/qat_sym.h
> @@ -163,6 +163,20 @@ bpi_cipher_encrypt(uint8_t *src, uint8_t *dst,
>  	return -EINVAL;
>  }
> 
> +#ifndef RTE_QAT_OPENSSL
> +static __rte_always_inline void
> +bpi_cipher_ipsec(uint8_t *src, uint8_t *dst, uint8_t *iv, int srclen,
> +		uint64_t *expkey, IMB_MGR *m, uint8_t docsis_key_len)
> +{
> +	if (docsis_key_len == ICP_QAT_HW_AES_128_KEY_SZ)
> +		IMB_AES128_CFB_ONE(m, dst, src, (uint64_t *)iv, expkey,
> srclen);
> +	else if (docsis_key_len == ICP_QAT_HW_AES_256_KEY_SZ)
> +		IMB_AES256_CFB_ONE(m, dst, src, (uint64_t *)iv, expkey,
> srclen);
> +	else if (docsis_key_len == ICP_QAT_HW_DES_KEY_SZ)
> +		des_cfb_one(dst, src, (uint64_t *)iv, expkey, srclen);
> +}
> +#endif
> +
>  static inline uint32_t
>  qat_bpicipher_postprocess(struct qat_sym_session *ctx,
>  				struct rte_crypto_op *op)
> @@ -207,8 +221,13 @@ qat_bpicipher_postprocess(struct qat_sym_session
> *ctx,
>  				"BPI: dst before post-process:",
>  				dst, last_block_len);
>  #endif
> +#ifdef RTE_QAT_OPENSSL
>  		bpi_cipher_encrypt(last_block, dst, iv, block_len,
>  				last_block_len, ctx->bpi_ctx);
> +#else
> +		bpi_cipher_ipsec(last_block, dst, iv, last_block_len, ctx-
> >expkey,
> +			ctx->mb_mgr, ctx->docsis_key_len);
> +#endif
>  #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
>  		QAT_DP_HEXDUMP_LOG(DEBUG, "BPI: src after post-process:",
>  				last_block, last_block_len);
> @@ -279,7 +298,11 @@ qat_sym_preprocess_requests(void **ops, uint16_t
> nb_ops)
>  		if (op->sess_type == RTE_CRYPTO_OP_SECURITY_SESSION) {
>  			ctx = SECURITY_GET_SESS_PRIV(op->sym->session);
> 
> +#ifdef RTE_QAT_OPENSSL
>  			if (ctx == NULL || ctx->bpi_ctx == NULL)
> +#else
> +			if (ctx == NULL || ctx->mb_mgr == NULL)
> +#endif
>  				continue;
> 
>  			qat_crc_generate(ctx, op);
> @@ -327,7 +350,11 @@ qat_sym_process_response(void **op, uint8_t *resp,
> void *op_cookie,
>  	} else {
>  		rx_op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
> 
> +#ifdef RTE_QAT_OPENSSL
>  		if (sess->bpi_ctx) {
> +#else
> +		if (sess->mb_mgr) {
> +#endif
>  			qat_bpicipher_postprocess(sess, rx_op);
>  #ifdef RTE_LIB_SECURITY
>  			if (is_docsis_sec)
> diff --git a/drivers/crypto/qat/qat_sym_session.c
> b/drivers/crypto/qat/qat_sym_session.c
> index 6ad6c7ee3a..07e01e8f60 100644
> --- a/drivers/crypto/qat/qat_sym_session.c
> +++ b/drivers/crypto/qat/qat_sym_session.c
> @@ -9,7 +9,7 @@
>  #include <openssl/md5.h>	/* Needed to calculate pre-compute values */
>  #include <openssl/evp.h>	/* Needed for bpi runt block processing */
> 
> -#ifdef RTE_QAT_LIBIPSECMB
> +#ifndef RTE_QAT_OPENSSL
>  #define NO_COMPAT_IMB_API_053
>  #if defined(RTE_ARCH_ARM)
>  #include <ipsec-mb.h>
> @@ -33,6 +33,7 @@
>  #include "qat_sym_session.h"
>  #include "qat_sym.h"
> 
> +#ifdef RTE_QAT_OPENSSL
>  #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
>  #include <openssl/provider.h>
> 
> @@ -65,8 +66,7 @@ static void ossl_legacy_provider_unload(void)
>  	OSSL_PROVIDER_unload(default_lib);
>  }
>  #endif
> -
> -extern int qat_ipsec_mb_lib;
> +#endif
> 
>  /* SHA1 - 20 bytes - Initialiser state can be found in FIPS stds 180-2 */
>  static const uint8_t sha1InitialState[] = {
> @@ -133,6 +133,7 @@ qat_sym_session_finalize(struct qat_sym_session
> *session)
>  	qat_sym_session_init_common_hdr(session);
>  }
> 
> +#ifdef RTE_QAT_OPENSSL
>  /** Frees a context previously created
>   *  Depends on openssl libcrypto
>   */
> @@ -183,6 +184,51 @@ bpi_cipher_ctx_init(enum rte_crypto_cipher_algorithm
> cryptodev_algo,
>  	}
>  	return ret;
>  }
> +#endif
> +
> +#ifndef RTE_QAT_OPENSSL
> +/** Creates a context in either AES or DES in ECB mode
> + */
> +static int
> +ipsec_mb_ctx_init(const uint8_t *key, uint16_t key_length,
> +		enum rte_crypto_cipher_algorithm cryptodev_algo,
> +		uint64_t *expkey, uint32_t *dust, IMB_MGR **m)
> +{
> +	int ret;
> +
> +	*m = alloc_mb_mgr(0);
> +	if (*m == NULL)
> +		return -ENOMEM;
> +
> +	init_mb_mgr_auto(*m, NULL);
> +
> +	if (cryptodev_algo == RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
> +		if (key_length == ICP_QAT_HW_AES_128_KEY_SZ)
> +			IMB_AES_KEYEXP_128(*m, key, expkey, dust);
> +		else if (key_length == ICP_QAT_HW_AES_256_KEY_SZ)
> +			IMB_AES_KEYEXP_256(*m, key, expkey, dust);
> +		else {
> +			ret = -EFAULT;
> +			goto error_out;
> +		}
> +	} else if (cryptodev_algo == RTE_CRYPTO_CIPHER_DES_DOCSISBPI) {
> +		if (key_length == ICP_QAT_HW_DES_KEY_SZ)
> +			IMB_DES_KEYSCHED(*m, (uint64_t *)expkey, key);
> +		else {
> +			ret = -EFAULT;
> +			goto error_out;
> +		}
> +	}
> +	return 0;
> +
> +error_out:
> +	if (*m) {
> +		free_mb_mgr(*m);
> +		*m = NULL;
> +	}
> +	return ret;
> +}
> +#endif
> 
>  static int
>  qat_is_cipher_alg_supported(enum rte_crypto_cipher_algorithm algo,
> @@ -232,8 +278,13 @@ qat_sym_session_clear(struct rte_cryptodev *dev
> __rte_unused,
>  {
>  	struct qat_sym_session *s = CRYPTODEV_GET_SYM_SESS_PRIV(sess);
> 
> +#ifdef RTE_QAT_OPENSSL
>  	if (s->bpi_ctx)
>  		bpi_cipher_ctx_free(s->bpi_ctx);
> +#else
> +	if (s->mb_mgr)
> +		free_mb_mgr(s->mb_mgr);
> +#endif
>  }
> 
>  static int
> @@ -396,12 +447,23 @@ qat_sym_session_configure_cipher(struct
> rte_cryptodev *dev,
>  		session->qat_mode = ICP_QAT_HW_CIPHER_CTR_MODE;
>  		break;
>  	case RTE_CRYPTO_CIPHER_DES_DOCSISBPI:
> +#ifdef RTE_QAT_OPENSSL
>  		ret = bpi_cipher_ctx_init(
>  					cipher_xform->algo,
>  					cipher_xform->op,
>  					cipher_xform->key.data,
>  					cipher_xform->key.length,
>  					&session->bpi_ctx);
> +#else
> +		session->docsis_key_len = cipher_xform->key.length;
> +		ret = ipsec_mb_ctx_init(
> +					cipher_xform->key.data,
> +					cipher_xform->key.length,
> +					cipher_xform->algo,
> +					session->expkey,
> +					session->dust,
> +					&session->mb_mgr);
> +#endif
>  		if (ret != 0) {
>  			QAT_LOG(ERR, "failed to create DES BPI ctx");
>  			goto error_out;
> @@ -415,12 +477,23 @@ qat_sym_session_configure_cipher(struct
> rte_cryptodev *dev,
>  		session->qat_mode = ICP_QAT_HW_CIPHER_CBC_MODE;
>  		break;
>  	case RTE_CRYPTO_CIPHER_AES_DOCSISBPI:
> +#ifdef RTE_QAT_OPENSSL
>  		ret = bpi_cipher_ctx_init(
>  					cipher_xform->algo,
>  					cipher_xform->op,
>  					cipher_xform->key.data,
>  					cipher_xform->key.length,
>  					&session->bpi_ctx);
> +#else
> +		session->docsis_key_len = cipher_xform->key.length;
> +		ret = ipsec_mb_ctx_init(
> +					cipher_xform->key.data,
> +					cipher_xform->key.length,
> +					cipher_xform->algo,
> +					session->expkey,
> +					session->dust,
> +					&session->mb_mgr);
> +#endif
>  		if (ret != 0) {
>  			QAT_LOG(ERR, "failed to create AES BPI ctx");
>  			goto error_out;
> @@ -506,10 +579,18 @@ qat_sym_session_configure_cipher(struct
> rte_cryptodev *dev,
>  	return 0;
> 
>  error_out:
> +#ifdef RTE_QAT_OPENSSL
>  	if (session->bpi_ctx) {
>  		bpi_cipher_ctx_free(session->bpi_ctx);
>  		session->bpi_ctx = NULL;
>  	}
> +#else
> +	if (session->mb_mgr) {
> +		free_mb_mgr(session->mb_mgr);
> +		session->mb_mgr = NULL;
> +	}
> +
> +#endif
>  	return ret;
>  }
> 
> @@ -520,8 +601,10 @@ qat_sym_session_configure(struct rte_cryptodev *dev,
>  {
>  	int ret;
> 
> +#ifdef RTE_QAT_OPENSSL
>  #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
>  	ossl_legacy_provider_load();
> +#endif
>  #endif
>  	ret = qat_sym_session_set_parameters(dev, xform,
>  			CRYPTODEV_GET_SYM_SESS_PRIV(sess),
> @@ -533,8 +616,10 @@ qat_sym_session_configure(struct rte_cryptodev *dev,
>  		return ret;
>  	}
> 
> +#ifdef RTE_QAT_OPENSSL
>  # if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
>  	ossl_legacy_provider_unload();
> +# endif
>  # endif
>  	return 0;
>  }
> @@ -1156,57 +1241,91 @@ static int qat_hash_get_block_size(enum
> icp_qat_hw_auth_algo qat_hash_alg)
>  #define HMAC_OPAD_VALUE	0x5c
>  #define HASH_XCBC_PRECOMP_KEY_NUM 3
> 
> -static const uint8_t AES_CMAC_SEED[ICP_QAT_HW_AES_128_KEY_SZ];
> +#ifdef RTE_QAT_OPENSSL
> +static int partial_hash_sha1(uint8_t *data_in, uint8_t *data_out)
> +{
> +	SHA_CTX ctx;
> 
> -#ifdef RTE_QAT_LIBIPSECMB
> -static int aes_ipsecmb_job(uint8_t *in, uint8_t *out, IMB_MGR *m,
> -		const uint8_t *key, uint16_t auth_keylen)
> +	if (!SHA1_Init(&ctx))
> +		return -EFAULT;
> +	SHA1_Transform(&ctx, data_in);
> +	rte_memcpy(data_out, &ctx, SHA_DIGEST_LENGTH);
> +	return 0;
> +}
> +
> +static int partial_hash_sha224(uint8_t *data_in, uint8_t *data_out)
>  {
> -	int err;
> -	struct IMB_JOB *job;
> -	DECLARE_ALIGNED(uint32_t expkey[4*15], 16);
> -	DECLARE_ALIGNED(uint32_t dust[4*15], 16);
> +	SHA256_CTX ctx;
> 
> -	if (auth_keylen == ICP_QAT_HW_AES_128_KEY_SZ)
> -		IMB_AES_KEYEXP_128(m, key, expkey, dust);
> -	else if (auth_keylen == ICP_QAT_HW_AES_192_KEY_SZ)
> -		IMB_AES_KEYEXP_192(m, key, expkey, dust);
> -	else if (auth_keylen == ICP_QAT_HW_AES_256_KEY_SZ)
> -		IMB_AES_KEYEXP_256(m, key, expkey, dust);
> -	else
> +	if (!SHA224_Init(&ctx))
>  		return -EFAULT;
> +	SHA256_Transform(&ctx, data_in);
> +	rte_memcpy(data_out, &ctx, SHA256_DIGEST_LENGTH);
> +	return 0;
> +}
> 
> -	job = IMB_GET_NEXT_JOB(m);
> +static int partial_hash_sha256(uint8_t *data_in, uint8_t *data_out)
> +{
> +	SHA256_CTX ctx;
> 
> -	job->src = in;
> -	job->dst = out;
> -	job->enc_keys = expkey;
> -	job->key_len_in_bytes = auth_keylen;
> -	job->msg_len_to_cipher_in_bytes = 16;
> -	job->iv_len_in_bytes = 0;
> -	job->cipher_direction = IMB_DIR_ENCRYPT;
> -	job->cipher_mode = IMB_CIPHER_ECB;
> -	job->hash_alg = IMB_AUTH_NULL;
> +	if (!SHA256_Init(&ctx))
> +		return -EFAULT;
> +	SHA256_Transform(&ctx, data_in);
> +	rte_memcpy(data_out, &ctx, SHA256_DIGEST_LENGTH);
> +	return 0;
> +}
> 
> -	while (IMB_FLUSH_JOB(m) != NULL)
> -		;
> +static int partial_hash_sha384(uint8_t *data_in, uint8_t *data_out)
> +{
> +	SHA512_CTX ctx;
> 
> -	job = IMB_SUBMIT_JOB(m);
> -	if (job) {
> -		if (job->status == IMB_STATUS_COMPLETED)
> -			return 0;
> -	}
> +	if (!SHA384_Init(&ctx))
> +		return -EFAULT;
> +	SHA512_Transform(&ctx, data_in);
> +	rte_memcpy(data_out, &ctx, SHA512_DIGEST_LENGTH);
> +	return 0;
> +}
> 
> -	err = imb_get_errno(m);
> -	if (err)
> -		QAT_LOG(ERR, "Error: %s!\n", imb_get_strerror(err));
> +static int partial_hash_sha512(uint8_t *data_in, uint8_t *data_out)
> +{
> +	SHA512_CTX ctx;
> 
> -	return -EFAULT;
> +	if (!SHA512_Init(&ctx))
> +		return -EFAULT;
> +	SHA512_Transform(&ctx, data_in);
> +	rte_memcpy(data_out, &ctx, SHA512_DIGEST_LENGTH);
> +	return 0;
> +}
> +
> +static int partial_hash_md5(uint8_t *data_in, uint8_t *data_out)
> +{
> +	MD5_CTX ctx;
> +
> +	if (!MD5_Init(&ctx))
> +		return -EFAULT;
> +	MD5_Transform(&ctx, data_in);
> +	rte_memcpy(data_out, &ctx, MD5_DIGEST_LENGTH);
> +
> +	return 0;
> +}
> +
> +static void aes_cmac_key_derive(uint8_t *base, uint8_t *derived)
> +{
> +	int i;
> +
> +	derived[0] = base[0] << 1;
> +	for (i = 1; i < ICP_QAT_HW_AES_BLK_SZ ; i++) {
> +		derived[i] = base[i] << 1;
> +		derived[i - 1] |= base[i] >> 7;
> +	}
> +
> +	if (base[0] & 0x80)
> +		derived[ICP_QAT_HW_AES_BLK_SZ - 1] ^=
> QAT_AES_CMAC_CONST_RB;
>  }
> 
>  static int
> -partial_hash_compute_ipsec_mb(enum icp_qat_hw_auth_algo hash_alg,
> -		uint8_t *data_in, uint8_t *data_out, IMB_MGR *m)
> +partial_hash_compute(enum icp_qat_hw_auth_algo hash_alg,
> +		uint8_t *data_in, uint8_t *data_out)
>  {
>  	int digest_size;
>  	uint8_t digest[qat_hash_get_digest_size(
> @@ -1227,37 +1346,43 @@ partial_hash_compute_ipsec_mb(enum
> icp_qat_hw_auth_algo hash_alg,
> 
>  	switch (hash_alg) {
>  	case ICP_QAT_HW_AUTH_ALGO_SHA1:
> -		IMB_SHA1_ONE_BLOCK(m, data_in, digest);
> +		if (partial_hash_sha1(data_in, digest))
> +			return -EFAULT;
>  		for (i = 0; i < digest_size >> 2; i++, hash_state_out_be32++)
>  			*hash_state_out_be32 =
>  				rte_bswap32(*(((uint32_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_SHA224:
> -		IMB_SHA224_ONE_BLOCK(m, data_in, digest);
> +		if (partial_hash_sha224(data_in, digest))
> +			return -EFAULT;
>  		for (i = 0; i < digest_size >> 2; i++, hash_state_out_be32++)
>  			*hash_state_out_be32 =
>  				rte_bswap32(*(((uint32_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_SHA256:
> -		IMB_SHA256_ONE_BLOCK(m, data_in, digest);
> +		if (partial_hash_sha256(data_in, digest))
> +			return -EFAULT;
>  		for (i = 0; i < digest_size >> 2; i++, hash_state_out_be32++)
>  			*hash_state_out_be32 =
>  				rte_bswap32(*(((uint32_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_SHA384:
> -		IMB_SHA384_ONE_BLOCK(m, data_in, digest);
> +		if (partial_hash_sha384(data_in, digest))
> +			return -EFAULT;
>  		for (i = 0; i < digest_size >> 3; i++, hash_state_out_be64++)
>  			*hash_state_out_be64 =
>  				rte_bswap64(*(((uint64_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_SHA512:
> -		IMB_SHA512_ONE_BLOCK(m, data_in, digest);
> +		if (partial_hash_sha512(data_in, digest))
> +			return -EFAULT;
>  		for (i = 0; i < digest_size >> 3; i++, hash_state_out_be64++)
>  			*hash_state_out_be64 =
>  				rte_bswap64(*(((uint64_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_MD5:
> -		IMB_MD5_ONE_BLOCK(m, data_in, data_out);
> +		if (partial_hash_md5(data_in, data_out))
> +			return -EFAULT;
>  		break;
>  	default:
>  		QAT_LOG(ERR, "invalid hash alg %u", hash_alg);
> @@ -1267,108 +1392,150 @@ partial_hash_compute_ipsec_mb(enum
> icp_qat_hw_auth_algo hash_alg,
>  	return 0;
>  }
> 
> -static int qat_sym_do_precomputes_ipsec_mb(enum icp_qat_hw_auth_algo
> hash_alg,
> +static const uint8_t AES_CMAC_SEED[ICP_QAT_HW_AES_128_KEY_SZ];
> +
> +static int qat_sym_do_precomputes(enum icp_qat_hw_auth_algo hash_alg,
>  				const uint8_t *auth_key,
>  				uint16_t auth_keylen,
>  				uint8_t *p_state_buf,
>  				uint16_t *p_state_len,
>  				uint8_t aes_cmac)
>  {
> -	int block_size = 0;
> +	int block_size;
>  	uint8_t
> ipad[qat_hash_get_block_size(ICP_QAT_HW_AUTH_ALGO_DELIMITER)];
>  	uint8_t
> opad[qat_hash_get_block_size(ICP_QAT_HW_AUTH_ALGO_DELIMITER)];
> -	int i, ret = 0;
> -	uint8_t in[ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ];
> -
> -	IMB_MGR *m;
> -	m = alloc_mb_mgr(0);
> -	if (m == NULL)
> -		return -ENOMEM;
> +	int i;
> 
> -	init_mb_mgr_auto(m, NULL);
> -	memset(in, 0, ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
>  	if (hash_alg == ICP_QAT_HW_AUTH_ALGO_AES_XCBC_MAC) {
> 
>  		/* CMAC */
>  		if (aes_cmac) {
> +			AES_KEY enc_key;
> +			uint8_t *in = NULL;
> +			uint8_t k0[ICP_QAT_HW_AES_128_KEY_SZ];
>  			uint8_t *k1, *k2;
> +
>  			auth_keylen = ICP_QAT_HW_AES_128_KEY_SZ;
> -			rte_memcpy(p_state_buf, auth_key, auth_keylen);
> 
> -			DECLARE_ALIGNED(uint32_t expkey[4*15], 16);
> -			DECLARE_ALIGNED(uint32_t dust[4*15], 16);
> -			IMB_AES_KEYEXP_128(m, p_state_buf, expkey, dust);
> -			k1 = p_state_buf +
> ICP_QAT_HW_AES_XCBC_MAC_STATE1_SZ;
> -			k2 = k1 + ICP_QAT_HW_AES_XCBC_MAC_STATE1_SZ;
> +			in = rte_zmalloc("AES CMAC K1",
> +					 ICP_QAT_HW_AES_128_KEY_SZ, 16);
> 
> -			IMB_AES_CMAC_SUBKEY_GEN_128(m, expkey, k1, k2);
> -			*p_state_len =
> ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ;
> -			goto out;
> -		}
> +			if (in == NULL) {
> +				QAT_LOG(ERR, "Failed to alloc memory");
> +				return -ENOMEM;
> +			}
> 
> -		static uint8_t qat_aes_xcbc_key_seed[
> -				ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ] = {
> -			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
> -			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
> -			0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
> -			0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
> -			0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
> -			0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
> -		};
> +			rte_memcpy(in, AES_CMAC_SEED,
> +				   ICP_QAT_HW_AES_128_KEY_SZ);
> +			rte_memcpy(p_state_buf, auth_key, auth_keylen);
> 
> -		uint8_t *input = in;
> -		uint8_t *out = p_state_buf;
> -		rte_memcpy(input, qat_aes_xcbc_key_seed,
> -				ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
> -		for (i = 0; i < HASH_XCBC_PRECOMP_KEY_NUM; i++) {
> -			if (aes_ipsecmb_job(input, out, m, auth_key,
> auth_keylen)) {
> -				memset(input -
> -				   (i * ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ),
> -				  0,
> ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
> -				ret = -EFAULT;
> -				goto out;
> +			if (AES_set_encrypt_key(auth_key, auth_keylen << 3,
> +				&enc_key) != 0) {
> +				rte_free(in);
> +				return -EFAULT;
>  			}
> 
> -			input += ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ;
> -			out += ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ;
> -		}
> -		*p_state_len = ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ;
> -		goto out;
> +			AES_encrypt(in, k0, &enc_key);
> 
> -	} else if ((hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_128) ||
> -		(hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_64)) {
> -		uint8_t *out = p_state_buf;
> +			k1 = p_state_buf +
> ICP_QAT_HW_AES_XCBC_MAC_STATE1_SZ;
> +			k2 = k1 + ICP_QAT_HW_AES_XCBC_MAC_STATE1_SZ;
> 
> -		memset(p_state_buf, 0, ICP_QAT_HW_GALOIS_H_SZ +
> -				ICP_QAT_HW_GALOIS_LEN_A_SZ +
> -				ICP_QAT_HW_GALOIS_E_CTR0_SZ);
> -		if (aes_ipsecmb_job(in, out, m, auth_key, auth_keylen)) {
> -			ret = -EFAULT;
> -			goto out;
> -		}
> +			aes_cmac_key_derive(k0, k1);
> +			aes_cmac_key_derive(k1, k2);
> 
> -		*p_state_len = ICP_QAT_HW_GALOIS_H_SZ +
> +			memset(k0, 0, ICP_QAT_HW_AES_128_KEY_SZ);
> +			*p_state_len =
> ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ;
> +			rte_free(in);
> +			goto out;
> +		} else {
> +			static uint8_t qat_aes_xcbc_key_seed[
> +
> 	ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ] = {
> +				0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
> +				0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
> +				0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
> +				0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
> +				0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
> +				0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
> +			};
> +
> +			uint8_t *in = NULL;
> +			uint8_t *out = p_state_buf;
> +			int x;
> +			AES_KEY enc_key;
> +
> +			in = rte_zmalloc("working mem for key",
> +
> 	ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ, 16);
> +			if (in == NULL) {
> +				QAT_LOG(ERR, "Failed to alloc memory");
> +				return -ENOMEM;
> +			}
> +
> +			rte_memcpy(in, qat_aes_xcbc_key_seed,
> +
> 	ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
> +			for (x = 0; x < HASH_XCBC_PRECOMP_KEY_NUM; x++) {
> +				if (AES_set_encrypt_key(auth_key,
> +							auth_keylen << 3,
> +							&enc_key) != 0) {
> +					rte_free(in -
> +					  (x *
> ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ));
> +					memset(out -
> +					   (x *
> ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ),
> +					  0,
> ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
> +					return -EFAULT;
> +				}
> +				AES_encrypt(in, out, &enc_key);
> +				in += ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ;
> +				out += ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ;
> +			}
> +			*p_state_len =
> ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ;
> +			rte_free(in - x*ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ);
> +			goto out;
> +		}
> +
> +	} else if ((hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_128) ||
> +		(hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_64)) {
> +		uint8_t *in = NULL;
> +		uint8_t *out = p_state_buf;
> +		AES_KEY enc_key;
> +
> +		memset(p_state_buf, 0, ICP_QAT_HW_GALOIS_H_SZ +
> +				ICP_QAT_HW_GALOIS_LEN_A_SZ +
> +				ICP_QAT_HW_GALOIS_E_CTR0_SZ);
> +		in = rte_zmalloc("working mem for key",
> +				ICP_QAT_HW_GALOIS_H_SZ, 16);
> +		if (in == NULL) {
> +			QAT_LOG(ERR, "Failed to alloc memory");
> +			return -ENOMEM;
> +		}
> +
> +		memset(in, 0, ICP_QAT_HW_GALOIS_H_SZ);
> +		if (AES_set_encrypt_key(auth_key, auth_keylen << 3,
> +			&enc_key) != 0) {
> +			return -EFAULT;
> +		}
> +		AES_encrypt(in, out, &enc_key);
> +		*p_state_len = ICP_QAT_HW_GALOIS_H_SZ +
>  				ICP_QAT_HW_GALOIS_LEN_A_SZ +
>  				ICP_QAT_HW_GALOIS_E_CTR0_SZ;
> -		goto out;
> +		rte_free(in);
> +		return 0;
>  	}
> 
>  	block_size = qat_hash_get_block_size(hash_alg);
> -	if (block_size < 0) {
> -		free_mb_mgr(m);
> +	if (block_size < 0)
>  		return block_size;
> -	}
> +	/* init ipad and opad from key and xor with fixed values */
> +	memset(ipad, 0, block_size);
> +	memset(opad, 0, block_size);
> 
>  	if (auth_keylen > (unsigned int)block_size) {
>  		QAT_LOG(ERR, "invalid keylen %u", auth_keylen);
> -		ret = -EFAULT;
> -		goto out;
> +		return -EFAULT;
>  	}
> -	/* init ipad and opad from key and xor with fixed values */
> -	memset(ipad, 0, block_size);
> -	memset(opad, 0, block_size);
> +
>  	RTE_VERIFY(auth_keylen <= sizeof(ipad));
>  	RTE_VERIFY(auth_keylen <= sizeof(opad));
> +
>  	rte_memcpy(ipad, auth_key, auth_keylen);
>  	rte_memcpy(opad, auth_key, auth_keylen);
> 
> @@ -1380,10 +1547,11 @@ static int
> qat_sym_do_precomputes_ipsec_mb(enum icp_qat_hw_auth_algo hash_alg,
>  	}
> 
>  	/* do partial hash of ipad and copy to state1 */
> -	if (partial_hash_compute_ipsec_mb(hash_alg, ipad, p_state_buf, m)) {
> +	if (partial_hash_compute(hash_alg, ipad, p_state_buf)) {
> +		memset(ipad, 0, block_size);
> +		memset(opad, 0, block_size);
>  		QAT_LOG(ERR, "ipad precompute failed");
> -		ret = -EFAULT;
> -		goto out;
> +		return -EFAULT;
>  	}
> 
>  	/*
> @@ -1391,105 +1559,70 @@ static int
> qat_sym_do_precomputes_ipsec_mb(enum icp_qat_hw_auth_algo hash_alg,
>  	 * Put the partial hash of opad state_len bytes after state1
>  	 */
>  	*p_state_len = qat_hash_get_state1_size(hash_alg);
> -	if (partial_hash_compute_ipsec_mb(hash_alg, opad,
> -				p_state_buf + *p_state_len, m)) {
> +	if (partial_hash_compute(hash_alg, opad, p_state_buf + *p_state_len)) {
> +		memset(ipad, 0, block_size);
> +		memset(opad, 0, block_size);
>  		QAT_LOG(ERR, "opad precompute failed");
> -		ret = -EFAULT;
> -		goto out;
> +		return -EFAULT;
>  	}
> 
> -out:
>  	/*  don't leave data lying around */
>  	memset(ipad, 0, block_size);
>  	memset(opad, 0, block_size);
> -	free_mb_mgr(m);
> -	return ret;
> -}
> -#endif
> -static int partial_hash_sha1(uint8_t *data_in, uint8_t *data_out)
> -{
> -	SHA_CTX ctx;
> -
> -	if (!SHA1_Init(&ctx))
> -		return -EFAULT;
> -	SHA1_Transform(&ctx, data_in);
> -	rte_memcpy(data_out, &ctx, SHA_DIGEST_LENGTH);
> -	return 0;
> -}
> -
> -static int partial_hash_sha224(uint8_t *data_in, uint8_t *data_out)
> -{
> -	SHA256_CTX ctx;
> -
> -	if (!SHA224_Init(&ctx))
> -		return -EFAULT;
> -	SHA256_Transform(&ctx, data_in);
> -	rte_memcpy(data_out, &ctx, SHA256_DIGEST_LENGTH);
> -	return 0;
> -}
> -
> -static int partial_hash_sha256(uint8_t *data_in, uint8_t *data_out)
> -{
> -	SHA256_CTX ctx;
> -
> -	if (!SHA256_Init(&ctx))
> -		return -EFAULT;
> -	SHA256_Transform(&ctx, data_in);
> -	rte_memcpy(data_out, &ctx, SHA256_DIGEST_LENGTH);
> +out:
>  	return 0;
>  }
> 
> -static int partial_hash_sha384(uint8_t *data_in, uint8_t *data_out)
> -{
> -	SHA512_CTX ctx;
> -
> -	if (!SHA384_Init(&ctx))
> -		return -EFAULT;
> -	SHA512_Transform(&ctx, data_in);
> -	rte_memcpy(data_out, &ctx, SHA512_DIGEST_LENGTH);
> -	return 0;
> -}
> +#else
> 
> -static int partial_hash_sha512(uint8_t *data_in, uint8_t *data_out)
> +static int aes_ipsecmb_job(uint8_t *in, uint8_t *out, IMB_MGR *m,
> +		const uint8_t *key, uint16_t auth_keylen)
>  {
> -	SHA512_CTX ctx;
> +	int err;
> +	struct IMB_JOB *job;
> +	DECLARE_ALIGNED(uint32_t expkey[4*15], 16);
> +	DECLARE_ALIGNED(uint32_t dust[4*15], 16);
> 
> -	if (!SHA512_Init(&ctx))
> +	if (auth_keylen == ICP_QAT_HW_AES_128_KEY_SZ)
> +		IMB_AES_KEYEXP_128(m, key, expkey, dust);
> +	else if (auth_keylen == ICP_QAT_HW_AES_192_KEY_SZ)
> +		IMB_AES_KEYEXP_192(m, key, expkey, dust);
> +	else if (auth_keylen == ICP_QAT_HW_AES_256_KEY_SZ)
> +		IMB_AES_KEYEXP_256(m, key, expkey, dust);
> +	else
>  		return -EFAULT;
> -	SHA512_Transform(&ctx, data_in);
> -	rte_memcpy(data_out, &ctx, SHA512_DIGEST_LENGTH);
> -	return 0;
> -}
> 
> -static int partial_hash_md5(uint8_t *data_in, uint8_t *data_out)
> -{
> -	MD5_CTX ctx;
> -
> -	if (!MD5_Init(&ctx))
> -		return -EFAULT;
> -	MD5_Transform(&ctx, data_in);
> -	rte_memcpy(data_out, &ctx, MD5_DIGEST_LENGTH);
> +	job = IMB_GET_NEXT_JOB(m);
> 
> -	return 0;
> -}
> +	job->src = in;
> +	job->dst = out;
> +	job->enc_keys = expkey;
> +	job->key_len_in_bytes = auth_keylen;
> +	job->msg_len_to_cipher_in_bytes = 16;
> +	job->iv_len_in_bytes = 0;
> +	job->cipher_direction = IMB_DIR_ENCRYPT;
> +	job->cipher_mode = IMB_CIPHER_ECB;
> +	job->hash_alg = IMB_AUTH_NULL;
> 
> -static void aes_cmac_key_derive(uint8_t *base, uint8_t *derived)
> -{
> -	int i;
> +	while (IMB_FLUSH_JOB(m) != NULL)
> +		;
> 
> -	derived[0] = base[0] << 1;
> -	for (i = 1; i < ICP_QAT_HW_AES_BLK_SZ ; i++) {
> -		derived[i] = base[i] << 1;
> -		derived[i - 1] |= base[i] >> 7;
> +	job = IMB_SUBMIT_JOB(m);
> +	if (job) {
> +		if (job->status == IMB_STATUS_COMPLETED)
> +			return 0;
>  	}
> 
> -	if (base[0] & 0x80)
> -		derived[ICP_QAT_HW_AES_BLK_SZ - 1] ^=
> QAT_AES_CMAC_CONST_RB;
> +	err = imb_get_errno(m);
> +	if (err)
> +		QAT_LOG(ERR, "Error: %s!\n", imb_get_strerror(err));
> +
> +	return -EFAULT;
>  }
> 
>  static int
> -partial_hash_compute(enum icp_qat_hw_auth_algo hash_alg,
> -		uint8_t *data_in, uint8_t *data_out)
> +partial_hash_compute_ipsec_mb(enum icp_qat_hw_auth_algo hash_alg,
> +		uint8_t *data_in, uint8_t *data_out, IMB_MGR *m)
>  {
>  	int digest_size;
>  	uint8_t digest[qat_hash_get_digest_size(
> @@ -1510,43 +1643,37 @@ partial_hash_compute(enum
> icp_qat_hw_auth_algo hash_alg,
> 
>  	switch (hash_alg) {
>  	case ICP_QAT_HW_AUTH_ALGO_SHA1:
> -		if (partial_hash_sha1(data_in, digest))
> -			return -EFAULT;
> +		IMB_SHA1_ONE_BLOCK(m, data_in, digest);
>  		for (i = 0; i < digest_size >> 2; i++, hash_state_out_be32++)
>  			*hash_state_out_be32 =
>  				rte_bswap32(*(((uint32_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_SHA224:
> -		if (partial_hash_sha224(data_in, digest))
> -			return -EFAULT;
> +		IMB_SHA224_ONE_BLOCK(m, data_in, digest);
>  		for (i = 0; i < digest_size >> 2; i++, hash_state_out_be32++)
>  			*hash_state_out_be32 =
>  				rte_bswap32(*(((uint32_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_SHA256:
> -		if (partial_hash_sha256(data_in, digest))
> -			return -EFAULT;
> +		IMB_SHA256_ONE_BLOCK(m, data_in, digest);
>  		for (i = 0; i < digest_size >> 2; i++, hash_state_out_be32++)
>  			*hash_state_out_be32 =
>  				rte_bswap32(*(((uint32_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_SHA384:
> -		if (partial_hash_sha384(data_in, digest))
> -			return -EFAULT;
> +		IMB_SHA384_ONE_BLOCK(m, data_in, digest);
>  		for (i = 0; i < digest_size >> 3; i++, hash_state_out_be64++)
>  			*hash_state_out_be64 =
>  				rte_bswap64(*(((uint64_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_SHA512:
> -		if (partial_hash_sha512(data_in, digest))
> -			return -EFAULT;
> +		IMB_SHA512_ONE_BLOCK(m, data_in, digest);
>  		for (i = 0; i < digest_size >> 3; i++, hash_state_out_be64++)
>  			*hash_state_out_be64 =
>  				rte_bswap64(*(((uint64_t *)digest)+i));
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_MD5:
> -		if (partial_hash_md5(data_in, data_out))
> -			return -EFAULT;
> +		IMB_MD5_ONE_BLOCK(m, data_in, data_out);
>  		break;
>  	default:
>  		QAT_LOG(ERR, "invalid hash alg %u", hash_alg);
> @@ -1556,148 +1683,108 @@ partial_hash_compute(enum
> icp_qat_hw_auth_algo hash_alg,
>  	return 0;
>  }
> 
> -static int qat_sym_do_precomputes(enum icp_qat_hw_auth_algo hash_alg,
> +static int qat_sym_do_precomputes_ipsec_mb(enum icp_qat_hw_auth_algo
> hash_alg,
>  				const uint8_t *auth_key,
>  				uint16_t auth_keylen,
>  				uint8_t *p_state_buf,
>  				uint16_t *p_state_len,
>  				uint8_t aes_cmac)
>  {
> -	int block_size;
> +	int block_size = 0;
>  	uint8_t
> ipad[qat_hash_get_block_size(ICP_QAT_HW_AUTH_ALGO_DELIMITER)];
>  	uint8_t
> opad[qat_hash_get_block_size(ICP_QAT_HW_AUTH_ALGO_DELIMITER)];
> -	int i;
> +	int i, ret = 0;
> +	uint8_t in[ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ];
> +
> +	IMB_MGR *m;
> +	m = alloc_mb_mgr(0);
> +	if (m == NULL)
> +		return -ENOMEM;
> 
> +	init_mb_mgr_auto(m, NULL);
> +	memset(in, 0, ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
>  	if (hash_alg == ICP_QAT_HW_AUTH_ALGO_AES_XCBC_MAC) {
> 
>  		/* CMAC */
>  		if (aes_cmac) {
> -			AES_KEY enc_key;
> -			uint8_t *in = NULL;
> -			uint8_t k0[ICP_QAT_HW_AES_128_KEY_SZ];
>  			uint8_t *k1, *k2;
> -
>  			auth_keylen = ICP_QAT_HW_AES_128_KEY_SZ;
> -
> -			in = rte_zmalloc("AES CMAC K1",
> -					 ICP_QAT_HW_AES_128_KEY_SZ, 16);
> -
> -			if (in == NULL) {
> -				QAT_LOG(ERR, "Failed to alloc memory");
> -				return -ENOMEM;
> -			}
> -
> -			rte_memcpy(in, AES_CMAC_SEED,
> -				   ICP_QAT_HW_AES_128_KEY_SZ);
>  			rte_memcpy(p_state_buf, auth_key, auth_keylen);
> 
> -			if (AES_set_encrypt_key(auth_key, auth_keylen << 3,
> -				&enc_key) != 0) {
> -				rte_free(in);
> -				return -EFAULT;
> -			}
> -
> -			AES_encrypt(in, k0, &enc_key);
> -
> +			DECLARE_ALIGNED(uint32_t expkey[4*15], 16);
> +			DECLARE_ALIGNED(uint32_t dust[4*15], 16);
> +			IMB_AES_KEYEXP_128(m, p_state_buf, expkey, dust);
>  			k1 = p_state_buf +
> ICP_QAT_HW_AES_XCBC_MAC_STATE1_SZ;
>  			k2 = k1 + ICP_QAT_HW_AES_XCBC_MAC_STATE1_SZ;
> 
> -			aes_cmac_key_derive(k0, k1);
> -			aes_cmac_key_derive(k1, k2);
> -
> -			memset(k0, 0, ICP_QAT_HW_AES_128_KEY_SZ);
> +			IMB_AES_CMAC_SUBKEY_GEN_128(m, expkey, k1, k2);
>  			*p_state_len =
> ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ;
> -			rte_free(in);
> -			return 0;
> -		} else {
> -			static uint8_t qat_aes_xcbc_key_seed[
> -
> 	ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ] = {
> -				0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
> -				0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
> -				0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
> -				0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
> -				0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
> -				0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
> -			};
> +			goto out;
> +		}
> 
> -			uint8_t *in = NULL;
> -			uint8_t *out = p_state_buf;
> -			int x;
> -			AES_KEY enc_key;
> +		static uint8_t qat_aes_xcbc_key_seed[
> +				ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ] = {
> +			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
> +			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
> +			0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
> +			0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
> +			0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
> +			0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
> +		};
> 
> -			in = rte_zmalloc("working mem for key",
> -
> 	ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ, 16);
> -			if (in == NULL) {
> -				QAT_LOG(ERR, "Failed to alloc memory");
> -				return -ENOMEM;
> +		uint8_t *input = in;
> +		uint8_t *out = p_state_buf;
> +		rte_memcpy(input, qat_aes_xcbc_key_seed,
> +				ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
> +		for (i = 0; i < HASH_XCBC_PRECOMP_KEY_NUM; i++) {
> +			if (aes_ipsecmb_job(input, out, m, auth_key,
> auth_keylen)) {
> +				memset(input -
> +				   (i * ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ),
> +				  0,
> ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
> +				ret = -EFAULT;
> +				goto out;
>  			}
> 
> -			rte_memcpy(in, qat_aes_xcbc_key_seed,
> -
> 	ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
> -			for (x = 0; x < HASH_XCBC_PRECOMP_KEY_NUM; x++) {
> -				if (AES_set_encrypt_key(auth_key,
> -							auth_keylen << 3,
> -							&enc_key) != 0) {
> -					rte_free(in -
> -					  (x *
> ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ));
> -					memset(out -
> -					   (x *
> ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ),
> -					  0,
> ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ);
> -					return -EFAULT;
> -				}
> -				AES_encrypt(in, out, &enc_key);
> -				in += ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ;
> -				out += ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ;
> -			}
> -			*p_state_len =
> ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ;
> -			rte_free(in - x*ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ);
> -			return 0;
> +			input += ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ;
> +			out += ICP_QAT_HW_AES_XCBC_MAC_KEY_SZ;
>  		}
> +		*p_state_len = ICP_QAT_HW_AES_XCBC_MAC_STATE2_SZ;
> +		goto out;
> 
>  	} else if ((hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_128) ||
>  		(hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_64)) {
> -		uint8_t *in = NULL;
>  		uint8_t *out = p_state_buf;
> -		AES_KEY enc_key;
> 
>  		memset(p_state_buf, 0, ICP_QAT_HW_GALOIS_H_SZ +
>  				ICP_QAT_HW_GALOIS_LEN_A_SZ +
>  				ICP_QAT_HW_GALOIS_E_CTR0_SZ);
> -		in = rte_zmalloc("working mem for key",
> -				ICP_QAT_HW_GALOIS_H_SZ, 16);
> -		if (in == NULL) {
> -			QAT_LOG(ERR, "Failed to alloc memory");
> -			return -ENOMEM;
> +		if (aes_ipsecmb_job(in, out, m, auth_key, auth_keylen)) {
> +			ret = -EFAULT;
> +			goto out;
>  		}
> 
> -		memset(in, 0, ICP_QAT_HW_GALOIS_H_SZ);
> -		if (AES_set_encrypt_key(auth_key, auth_keylen << 3,
> -			&enc_key) != 0) {
> -			return -EFAULT;
> -		}
> -		AES_encrypt(in, out, &enc_key);
>  		*p_state_len = ICP_QAT_HW_GALOIS_H_SZ +
>  				ICP_QAT_HW_GALOIS_LEN_A_SZ +
>  				ICP_QAT_HW_GALOIS_E_CTR0_SZ;
> -		rte_free(in);
> -		return 0;
> +		goto out;
>  	}
> 
>  	block_size = qat_hash_get_block_size(hash_alg);
> -	if (block_size < 0)
> +	if (block_size < 0) {
> +		free_mb_mgr(m);
>  		return block_size;
> -	/* init ipad and opad from key and xor with fixed values */
> -	memset(ipad, 0, block_size);
> -	memset(opad, 0, block_size);
> +	}
> 
>  	if (auth_keylen > (unsigned int)block_size) {
>  		QAT_LOG(ERR, "invalid keylen %u", auth_keylen);
> -		return -EFAULT;
> +		ret = -EFAULT;
> +		goto out;
>  	}
> -
> +	/* init ipad and opad from key and xor with fixed values */
> +	memset(ipad, 0, block_size);
> +	memset(opad, 0, block_size);
>  	RTE_VERIFY(auth_keylen <= sizeof(ipad));
>  	RTE_VERIFY(auth_keylen <= sizeof(opad));
> -
>  	rte_memcpy(ipad, auth_key, auth_keylen);
>  	rte_memcpy(opad, auth_key, auth_keylen);
> 
> @@ -1709,11 +1796,10 @@ static int qat_sym_do_precomputes(enum
> icp_qat_hw_auth_algo hash_alg,
>  	}
> 
>  	/* do partial hash of ipad and copy to state1 */
> -	if (partial_hash_compute(hash_alg, ipad, p_state_buf)) {
> -		memset(ipad, 0, block_size);
> -		memset(opad, 0, block_size);
> +	if (partial_hash_compute_ipsec_mb(hash_alg, ipad, p_state_buf, m)) {
>  		QAT_LOG(ERR, "ipad precompute failed");
> -		return -EFAULT;
> +		ret = -EFAULT;
> +		goto out;
>  	}
> 
>  	/*
> @@ -1721,18 +1807,21 @@ static int qat_sym_do_precomputes(enum
> icp_qat_hw_auth_algo hash_alg,
>  	 * Put the partial hash of opad state_len bytes after state1
>  	 */
>  	*p_state_len = qat_hash_get_state1_size(hash_alg);
> -	if (partial_hash_compute(hash_alg, opad, p_state_buf + *p_state_len)) {
> -		memset(ipad, 0, block_size);
> -		memset(opad, 0, block_size);
> +	if (partial_hash_compute_ipsec_mb(hash_alg, opad,
> +				p_state_buf + *p_state_len, m)) {
>  		QAT_LOG(ERR, "opad precompute failed");
> -		return -EFAULT;
> +		ret = -EFAULT;
> +		goto out;
>  	}
> 
> +out:
>  	/*  don't leave data lying around */
>  	memset(ipad, 0, block_size);
>  	memset(opad, 0, block_size);
> -	return 0;
> +	free_mb_mgr(m);
> +	return ret;
>  }
> +#endif
> 
>  static void
>  qat_sym_session_init_common_hdr(struct qat_sym_session *session)
> @@ -2124,20 +2213,16 @@ int qat_sym_cd_auth_set(struct qat_sym_session
> *cdesc,
>  			break;
>  		}
>  		/* SHA-1 HMAC */
> -		if (qat_ipsec_mb_lib) {
> -#ifdef RTE_QAT_LIBIPSECMB
> -			ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA1,
> -				authkey, authkeylen, cdesc->cd_cur_ptr,
> &state1_size,
> -				cdesc->aes_cmac);
> +#ifdef RTE_QAT_OPENSSL
> +		ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA1, authkey,
> +			authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
> +
>  #else
> -			QAT_LOG(ERR, "Intel IPSEC-MB LIB missing ?");
> -			return -EFAULT;
> +		ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA1,
> +			authkey, authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #endif
> -		} else {
> -			ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA1, authkey,
> -				authkeylen, cdesc->cd_cur_ptr, &state1_size,
> -				cdesc->aes_cmac);
> -		}
> 
>  		if (ret) {
>  			QAT_LOG(ERR, "(SHA)precompute failed");
> @@ -2155,21 +2240,15 @@ int qat_sym_cd_auth_set(struct qat_sym_session
> *cdesc,
>  			break;
>  		}
>  		/* SHA-224 HMAC */
> -		if (qat_ipsec_mb_lib) {
> -#ifdef RTE_QAT_LIBIPSECMB
> -			ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA224,
> -				authkey, authkeylen, cdesc->cd_cur_ptr,
> &state1_size,
> -				cdesc->aes_cmac);
> +#ifdef RTE_QAT_OPENSSL
> +		ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA224, authkey,
> +			authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #else
> -			QAT_LOG(ERR, "Intel IPSEC-MB LIB missing ?");
> -			return -EFAULT;
> +		ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA224,
> +			authkey, authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #endif
> -		} else {
> -			ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA224, authkey,
> -				authkeylen, cdesc->cd_cur_ptr, &state1_size,
> -				cdesc->aes_cmac);
> -		}
> -
>  		if (ret) {
>  			QAT_LOG(ERR, "(SHA)precompute failed");
>  			return -EFAULT;
> @@ -2186,21 +2265,15 @@ int qat_sym_cd_auth_set(struct qat_sym_session
> *cdesc,
>  			break;
>  		}
>  		/* SHA-256 HMAC */
> -		if (qat_ipsec_mb_lib) {
> -#ifdef RTE_QAT_LIBIPSECMB
> -			ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA256,
> -				authkey, authkeylen, cdesc->cd_cur_ptr,
> &state1_size,
> -				cdesc->aes_cmac);
> +#ifdef RTE_QAT_OPENSSL
> +		ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA256, authkey,
> +			authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #else
> -			QAT_LOG(ERR, "Intel IPSEC-MB LIB missing ?");
> -			return -EFAULT;
> +		ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA256,
> +			authkey, authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #endif
> -		} else {
> -			ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA256, authkey,
> -				authkeylen, cdesc->cd_cur_ptr, &state1_size,
> -				cdesc->aes_cmac);
> -		}
> -
>  		if (ret) {
>  			QAT_LOG(ERR, "(SHA)precompute failed");
>  			return -EFAULT;
> @@ -2217,21 +2290,15 @@ int qat_sym_cd_auth_set(struct qat_sym_session
> *cdesc,
>  			break;
>  		}
>  		/* SHA-384 HMAC */
> -		if (qat_ipsec_mb_lib) {
> -#ifdef RTE_QAT_LIBIPSECMB
> -			ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA384,
> -				authkey, authkeylen, cdesc->cd_cur_ptr,
> &state1_size,
> -				cdesc->aes_cmac);
> +#ifdef RTE_QAT_OPENSSL
> +		ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA384, authkey,
> +			authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #else
> -			QAT_LOG(ERR, "Intel IPSEC-MB LIB missing ?");
> -			return -EFAULT;
> +		ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA384,
> +			authkey, authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #endif
> -		} else {
> -			ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA384, authkey,
> -				authkeylen, cdesc->cd_cur_ptr, &state1_size,
> -				cdesc->aes_cmac);
> -		}
> -
>  		if (ret) {
>  			QAT_LOG(ERR, "(SHA)precompute failed");
>  			return -EFAULT;
> @@ -2248,21 +2315,15 @@ int qat_sym_cd_auth_set(struct qat_sym_session
> *cdesc,
>  			break;
>  		}
>  		/* SHA-512 HMAC */
> -		if (qat_ipsec_mb_lib) {
> -#ifdef RTE_QAT_LIBIPSECMB
> -			ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA512,
> -				authkey, authkeylen, cdesc->cd_cur_ptr,
> &state1_size,
> -				cdesc->aes_cmac);
> +#ifdef RTE_QAT_OPENSSL
> +		ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA512, authkey,
> +			authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #else
> -			QAT_LOG(ERR, "Intel IPSEC-MB LIB missing ?");
> -			return -EFAULT;
> +		ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_SHA512,
> +			authkey, authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #endif
> -		} else {
> -			ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_SHA512, authkey,
> -				authkeylen, cdesc->cd_cur_ptr, &state1_size,
> -				cdesc->aes_cmac);
> -		}
> -
>  		if (ret) {
>  			QAT_LOG(ERR, "(SHA)precompute failed");
>  			return -EFAULT;
> @@ -2298,22 +2359,16 @@ int qat_sym_cd_auth_set(struct qat_sym_session
> *cdesc,
> 
>  		if (cdesc->aes_cmac)
>  			memset(cdesc->cd_cur_ptr, 0, state1_size);
> -		if (qat_ipsec_mb_lib) {
> -#ifdef RTE_QAT_LIBIPSECMB
> -			ret = qat_sym_do_precomputes_ipsec_mb(
> -				ICP_QAT_HW_AUTH_ALGO_AES_XCBC_MAC,
> -				authkey, authkeylen, cdesc->cd_cur_ptr +
> state1_size,
> -				&state2_size, cdesc->aes_cmac);
> +#ifdef RTE_QAT_OPENSSL
> +		ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_AES_XCBC_MAC,
> +			authkey, authkeylen, cdesc->cd_cur_ptr + state1_size,
> +			&state2_size, cdesc->aes_cmac);
>  #else
> -			QAT_LOG(ERR, "Intel IPSEC-MB LIB missing ?");
> -			return -EFAULT;
> +		ret = qat_sym_do_precomputes_ipsec_mb(
> +			ICP_QAT_HW_AUTH_ALGO_AES_XCBC_MAC,
> +			authkey, authkeylen, cdesc->cd_cur_ptr + state1_size,
> +			&state2_size, cdesc->aes_cmac);
>  #endif
> -		} else {
> -			ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_AES_XCBC_MAC,
> -				authkey, authkeylen, cdesc->cd_cur_ptr +
> state1_size,
> -				&state2_size, cdesc->aes_cmac);
> -		}
> -
>  		if (ret) {
>  			cdesc->aes_cmac ? QAT_LOG(ERR,
>  						  "(CMAC)precompute failed")
> @@ -2326,21 +2381,15 @@ int qat_sym_cd_auth_set(struct qat_sym_session
> *cdesc,
>  	case ICP_QAT_HW_AUTH_ALGO_GALOIS_64:
>  		cdesc->qat_proto_flag = QAT_CRYPTO_PROTO_FLAG_GCM;
>  		state1_size = ICP_QAT_HW_GALOIS_128_STATE1_SZ;
> -		if (qat_ipsec_mb_lib) {
> -#ifdef RTE_QAT_LIBIPSECMB
> -			ret = qat_sym_do_precomputes_ipsec_mb(cdesc-
> >qat_hash_alg, authkey,
> -				authkeylen, cdesc->cd_cur_ptr + state1_size,
> -				&state2_size, cdesc->aes_cmac);
> +#ifdef RTE_QAT_OPENSSL
> +		ret = qat_sym_do_precomputes(cdesc->qat_hash_alg, authkey,
> +			authkeylen, cdesc->cd_cur_ptr + state1_size,
> +			&state2_size, cdesc->aes_cmac);
>  #else
> -			QAT_LOG(ERR, "Intel IPSEC-MB LIB missing ?");
> -			return -EFAULT;
> +		ret = qat_sym_do_precomputes_ipsec_mb(cdesc-
> >qat_hash_alg, authkey,
> +			authkeylen, cdesc->cd_cur_ptr + state1_size,
> +			&state2_size, cdesc->aes_cmac);
>  #endif
> -		} else {
> -			ret = qat_sym_do_precomputes(cdesc->qat_hash_alg,
> authkey,
> -				authkeylen, cdesc->cd_cur_ptr + state1_size,
> -				&state2_size, cdesc->aes_cmac);
> -		}
> -
>  		if (ret) {
>  			QAT_LOG(ERR, "(GCM)precompute failed");
>  			return -EFAULT;
> @@ -2397,21 +2446,15 @@ int qat_sym_cd_auth_set(struct qat_sym_session
> *cdesc,
> 
>  		break;
>  	case ICP_QAT_HW_AUTH_ALGO_MD5:
> -		if (qat_ipsec_mb_lib) {
> -#ifdef RTE_QAT_LIBIPSECMB
> -			ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_MD5,
> -				authkey, authkeylen, cdesc->cd_cur_ptr,
> &state1_size,
> -				cdesc->aes_cmac);
> +#ifdef RTE_QAT_OPENSSL
> +		ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_MD5, authkey,
> +			authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #else
> -			QAT_LOG(ERR, "Intel IPSEC-MB LIB missing");
> -			return -EFAULT;
> +		ret =
> qat_sym_do_precomputes_ipsec_mb(ICP_QAT_HW_AUTH_ALGO_MD5,
> +			authkey, authkeylen, cdesc->cd_cur_ptr, &state1_size,
> +			cdesc->aes_cmac);
>  #endif
> -		} else {
> -			ret =
> qat_sym_do_precomputes(ICP_QAT_HW_AUTH_ALGO_MD5, authkey,
> -				authkeylen, cdesc->cd_cur_ptr, &state1_size,
> -				cdesc->aes_cmac);
> -		}
> -
>  		if (ret) {
>  			QAT_LOG(ERR, "(MD5)precompute failed");
>  			return -EFAULT;
> @@ -2708,9 +2751,11 @@ qat_security_session_create(void *dev,
>  		return -EINVAL;
>  	}
> 
> +#ifdef RTE_QAT_OPENSSL
>  #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
>  	if (ossl_legacy_provider_load())
>  		return -EINVAL;
> +#endif
>  #endif
>  	ret = qat_sec_session_set_docsis_parameters(cdev, conf,
>  			sess_private_data,
> SECURITY_GET_SESS_PRIV_IOVA(sess));
> @@ -2719,8 +2764,10 @@ qat_security_session_create(void *dev,
>  		return ret;
>  	}
> 
> +#ifdef RTE_QAT_OPENSSL
>  #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
>  	ossl_legacy_provider_unload();
> +#endif
>  #endif
>  	return 0;
>  }
> @@ -2733,8 +2780,13 @@ qat_security_session_destroy(void *dev
> __rte_unused,
>  	struct qat_sym_session *s = (struct qat_sym_session *)sess_priv;
> 
>  	if (sess_priv) {
> +#ifdef RTE_QAT_OPENSSL
>  		if (s->bpi_ctx)
>  			bpi_cipher_ctx_free(s->bpi_ctx);
> +#else
> +		if (s->mb_mgr)
> +			free_mb_mgr(s->mb_mgr);
> +#endif
>  		memset(s, 0, qat_sym_session_get_private_size(dev));
>  	}
> 
> diff --git a/drivers/crypto/qat/qat_sym_session.h
> b/drivers/crypto/qat/qat_sym_session.h
> index 6322d7e3bc..c0b6fc14ea 100644
> --- a/drivers/crypto/qat/qat_sym_session.h
> +++ b/drivers/crypto/qat/qat_sym_session.h
> @@ -15,6 +15,14 @@
>  #include "icp_qat_fw.h"
>  #include "icp_qat_fw_la.h"
> 
> +#ifndef RTE_QAT_OPENSSL
> +#if defined(RTE_ARCH_ARM)
> +#include <ipsec-mb.h>
> +#else
> +#include <intel-ipsec-mb.h>
> +#endif
> +#endif
> +
>  /*
>   * Key Modifier (KM) value used in KASUMI algorithm in F9 mode to XOR
>   * Integrity Key (IK)
> @@ -118,6 +126,12 @@ struct qat_sym_session {
>  	uint32_t slice_types;
>  	enum qat_sym_proto_flag qat_proto_flag;
>  	qat_sym_build_request_t build_request[2];
> +#ifndef RTE_QAT_OPENSSL
> +	IMB_MGR *mb_mgr;
> +#endif
> +	uint64_t expkey[4*15];
> +	uint32_t dust[4*15];
> +	uint8_t docsis_key_len;
>  };
> 
>  int
> --
> 2.25.1


  parent reply	other threads:[~2023-05-25  7:28 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-18 15:23 [PATCH v1] crypto/qat: add IPsec MB AES and DES Docsis support Brian Dooley
2023-05-19 10:50 ` [PATCH v2] crypto/qat: default to IPsec MB for pre and post computes Brian Dooley
2023-05-22 14:39   ` [PATCH v3] " Brian Dooley
2023-05-23 14:10     ` Ji, Kai
2023-05-25  7:28     ` Akhil Goyal [this message]
2023-05-26 10:26     ` [PATCH v4] crypto/qat: default to IPsec MB for computations Brian Dooley
2023-06-02 11:24       ` De Lara Guarch, Pablo
2023-06-06 10:28       ` [PATCH v5] " Brian Dooley
2023-06-08 12:25         ` Power, Ciara
2023-06-14 18:23         ` [EXT] " Akhil Goyal
2023-06-16 16:02         ` [PATCH v6] " Brian Dooley
2023-06-20 10:56           ` [PATCH v7] " Brian Dooley
2023-06-20 12:43             ` [EXT] " Akhil Goyal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CO6PR18MB4484752360BE275C10CB3A1FD8469@CO6PR18MB4484.namprd18.prod.outlook.com \
    --to=gakhil@marvell.com \
    --cc=brian.dooley@intel.com \
    --cc=dev@dpdk.org \
    --cc=kai.ji@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).