xref: /dpdk/drivers/crypto/qat/qat_asym.c (revision 20e633b0ca15539b682539a665e8d3dc0dc2c899)
1f81cbc20SArek Kusztal /* SPDX-License-Identifier: BSD-3-Clause
2a2343302SKai Ji  * Copyright(c) 2019 - 2022 Intel Corporation
3f81cbc20SArek Kusztal  */
4f81cbc20SArek Kusztal 
5f81cbc20SArek Kusztal #include <stdarg.h>
6f81cbc20SArek Kusztal 
7a2343302SKai Ji #include <cryptodev_pmd.h>
8a2343302SKai Ji 
93b78aa7bSArek Kusztal #include "qat_device.h"
103b78aa7bSArek Kusztal #include "qat_logs.h"
113b78aa7bSArek Kusztal 
123b78aa7bSArek Kusztal #include "qat_asym.h"
13f81cbc20SArek Kusztal #include "icp_qat_fw_pke.h"
14f81cbc20SArek Kusztal #include "icp_qat_fw.h"
153b78aa7bSArek Kusztal #include "qat_pke.h"
167b012789SArek Kusztal #include "qat_ec.h"
17f81cbc20SArek Kusztal 
1899ab2806SArkadiusz Kusztal #define ASYM_ENQ_THRESHOLD_NAME "qat_asym_enq_threshold"
19cffb726bSVikash Poddar #define RSA_MODULUS_2048_BITS 2048
20cffb726bSVikash Poddar 
21a2343302SKai Ji uint8_t qat_asym_driver_id;
22f81cbc20SArek Kusztal 
23a2343302SKai Ji struct qat_crypto_gen_dev_ops qat_asym_gen_dev_ops[QAT_N_GENS];
24f81cbc20SArek Kusztal 
2599ab2806SArkadiusz Kusztal 
2699ab2806SArkadiusz Kusztal static const char *const arguments[] = {
2799ab2806SArkadiusz Kusztal 	ASYM_ENQ_THRESHOLD_NAME,
2899ab2806SArkadiusz Kusztal 	NULL
2999ab2806SArkadiusz Kusztal };
3099ab2806SArkadiusz Kusztal 
31a2343302SKai Ji /* An rte_driver is needed in the registration of both the device and the driver
32a2343302SKai Ji  * with cryptodev.
33a2343302SKai Ji  * The actual qat pci's rte_driver can't be used as its name represents
34a2343302SKai Ji  * the whole pci device with all services. Think of this as a holder for a name
35a2343302SKai Ji  * for the crypto part of the pci device.
36a2343302SKai Ji  */
37a2343302SKai Ji static const char qat_asym_drv_name[] = RTE_STR(CRYPTODEV_NAME_QAT_ASYM_PMD);
38a2343302SKai Ji static const struct rte_driver cryptodev_qat_asym_driver = {
39a2343302SKai Ji 	.name = qat_asym_drv_name,
40a2343302SKai Ji 	.alias = qat_asym_drv_name
41a2343302SKai Ji };
42e1ed5a73SArek Kusztal 
43b5324d38SArek Kusztal /*
44b5324d38SArek Kusztal  * Macros with suffix _F are used with some of predefinded identifiers:
45b5324d38SArek Kusztal  * - cookie->input_buffer
46fde2e2f1SArek Kusztal  * - qat_func_alignsize
47b5324d38SArek Kusztal  */
483b78aa7bSArek Kusztal #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
493b78aa7bSArek Kusztal #define HEXDUMP(name, where, size) QAT_DP_HEXDUMP_LOG(DEBUG, name, \
503b78aa7bSArek Kusztal 			where, size)
513b78aa7bSArek Kusztal #define HEXDUMP_OFF(name, where, size, idx) QAT_DP_HEXDUMP_LOG(DEBUG, name, \
523b78aa7bSArek Kusztal 			&where[idx * size], size)
53b5324d38SArek Kusztal 
54b5324d38SArek Kusztal #define HEXDUMP_OFF_F(name, idx) QAT_DP_HEXDUMP_LOG(DEBUG, name, \
55fde2e2f1SArek Kusztal 			&cookie->input_buffer[idx * qat_func_alignsize], \
56fde2e2f1SArek Kusztal 			qat_func_alignsize)
573b78aa7bSArek Kusztal #else
583b78aa7bSArek Kusztal #define HEXDUMP(name, where, size)
593b78aa7bSArek Kusztal #define HEXDUMP_OFF(name, where, size, idx)
60b5324d38SArek Kusztal #define HEXDUMP_OFF_F(name, idx)
613b78aa7bSArek Kusztal #endif
62f81cbc20SArek Kusztal 
633b78aa7bSArek Kusztal #define CHECK_IF_NOT_EMPTY(param, name, pname, status) \
643b78aa7bSArek Kusztal 	do { \
653b78aa7bSArek Kusztal 		if (param.length == 0) {	\
663b78aa7bSArek Kusztal 			QAT_LOG(ERR,			\
673b78aa7bSArek Kusztal 				"Invalid " name	\
683b78aa7bSArek Kusztal 				" input parameter, zero length " pname	\
693b78aa7bSArek Kusztal 			);	\
703b78aa7bSArek Kusztal 			status = -EINVAL;	\
713b78aa7bSArek Kusztal 		} else if (check_zero(param)) { \
723b78aa7bSArek Kusztal 			QAT_LOG(ERR,	\
733b78aa7bSArek Kusztal 				"Invalid " name " input parameter, empty " \
743b78aa7bSArek Kusztal 				pname ", length = %d", \
753b78aa7bSArek Kusztal 				(int)param.length \
763b78aa7bSArek Kusztal 			); \
773b78aa7bSArek Kusztal 			status = -EINVAL;	\
783b78aa7bSArek Kusztal 		} \
793b78aa7bSArek Kusztal 	} while (0)
803b78aa7bSArek Kusztal 
81fde2e2f1SArek Kusztal #define SET_PKE_LN(what, how, idx) \
82fde2e2f1SArek Kusztal 	rte_memcpy(cookie->input_array[idx] + how - \
833b78aa7bSArek Kusztal 		what.length, \
843b78aa7bSArek Kusztal 		what.data, \
853b78aa7bSArek Kusztal 		what.length)
863b78aa7bSArek Kusztal 
87fde2e2f1SArek Kusztal #define SET_PKE_LN_EC(curve, p, idx) \
88fde2e2f1SArek Kusztal 	rte_memcpy(cookie->input_array[idx] + \
89fde2e2f1SArek Kusztal 		qat_func_alignsize - curve.bytesize, \
90fde2e2f1SArek Kusztal 		curve.p.data, curve.bytesize)
917b012789SArek Kusztal 
92fde2e2f1SArek Kusztal #define SET_PKE_9A_IN(what, idx) \
93fde2e2f1SArek Kusztal 	rte_memcpy(&cookie->input_buffer[idx * \
94fde2e2f1SArek Kusztal 		qat_func_alignsize] + \
95fde2e2f1SArek Kusztal 		qat_func_alignsize - what.length, \
96b5324d38SArek Kusztal 		what.data, what.length)
97b5324d38SArek Kusztal 
98fde2e2f1SArek Kusztal #define SET_PKE_9A_EC(curve, p, idx) \
99b5324d38SArek Kusztal 	rte_memcpy(&cookie->input_buffer[idx * \
100fde2e2f1SArek Kusztal 		qat_func_alignsize] + \
101fde2e2f1SArek Kusztal 		qat_func_alignsize - curve.bytesize, \
102fde2e2f1SArek Kusztal 		curve.p.data, curve.bytesize)
103b5324d38SArek Kusztal 
104841cea1cSArek Kusztal #define PARAM_CLR(what) \
105841cea1cSArek Kusztal 	do { \
106841cea1cSArek Kusztal 		memset(what.data, 0, what.length); \
107841cea1cSArek Kusztal 		rte_free(what.data);	\
108841cea1cSArek Kusztal 	} while (0)
109841cea1cSArek Kusztal 
1103b78aa7bSArek Kusztal static void
1113b78aa7bSArek Kusztal request_init(struct icp_qat_fw_pke_request *qat_req)
1123b78aa7bSArek Kusztal {
1133b78aa7bSArek Kusztal 	memset(qat_req, 0, sizeof(*qat_req));
1143b78aa7bSArek Kusztal 	qat_req->pke_hdr.service_type = ICP_QAT_FW_COMN_REQ_CPM_FW_PKE;
1153b78aa7bSArek Kusztal 	qat_req->pke_hdr.hdr_flags =
1163b78aa7bSArek Kusztal 		ICP_QAT_FW_COMN_HDR_FLAGS_BUILD
1173b78aa7bSArek Kusztal 		(ICP_QAT_FW_COMN_REQ_FLAG_SET);
1183b78aa7bSArek Kusztal }
1193b78aa7bSArek Kusztal 
1203b78aa7bSArek Kusztal static void
1213b78aa7bSArek Kusztal cleanup_arrays(struct qat_asym_op_cookie *cookie,
122867ba300SArek Kusztal 		int in_count, int out_count, int alg_size)
123f81cbc20SArek Kusztal {
124f81cbc20SArek Kusztal 	int i;
125f81cbc20SArek Kusztal 
126f81cbc20SArek Kusztal 	for (i = 0; i < in_count; i++)
127867ba300SArek Kusztal 		memset(cookie->input_array[i], 0x0, alg_size);
128f81cbc20SArek Kusztal 	for (i = 0; i < out_count; i++)
129867ba300SArek Kusztal 		memset(cookie->output_array[i], 0x0, alg_size);
130867ba300SArek Kusztal }
131867ba300SArek Kusztal 
1323b78aa7bSArek Kusztal static void
1333b78aa7bSArek Kusztal cleanup_crt(struct qat_asym_op_cookie *cookie,
134867ba300SArek Kusztal 		int alg_size)
135867ba300SArek Kusztal {
136867ba300SArek Kusztal 	int i;
137867ba300SArek Kusztal 
138867ba300SArek Kusztal 	memset(cookie->input_array[0], 0x0, alg_size);
139867ba300SArek Kusztal 	for (i = 1; i < QAT_ASYM_RSA_QT_NUM_IN_PARAMS; i++)
140867ba300SArek Kusztal 		memset(cookie->input_array[i], 0x0, alg_size / 2);
141867ba300SArek Kusztal 	for (i = 0; i < QAT_ASYM_RSA_NUM_OUT_PARAMS; i++)
142867ba300SArek Kusztal 		memset(cookie->output_array[i], 0x0, alg_size);
143f81cbc20SArek Kusztal }
144f81cbc20SArek Kusztal 
1453b78aa7bSArek Kusztal static void
1463b78aa7bSArek Kusztal cleanup(struct qat_asym_op_cookie *cookie,
147d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
148e1ed5a73SArek Kusztal {
149867ba300SArek Kusztal 	if (xform->xform_type == RTE_CRYPTO_ASYM_XFORM_MODEX)
1503b78aa7bSArek Kusztal 		cleanup_arrays(cookie, QAT_ASYM_MODEXP_NUM_IN_PARAMS,
151fdf9cdacSArek Kusztal 				QAT_ASYM_MODEXP_NUM_OUT_PARAMS,
152fdf9cdacSArek Kusztal 				cookie->alg_bytesize);
153867ba300SArek Kusztal 	else if (xform->xform_type == RTE_CRYPTO_ASYM_XFORM_MODINV)
1543b78aa7bSArek Kusztal 		cleanup_arrays(cookie, QAT_ASYM_MODINV_NUM_IN_PARAMS,
155fdf9cdacSArek Kusztal 				QAT_ASYM_MODINV_NUM_OUT_PARAMS,
156fdf9cdacSArek Kusztal 				cookie->alg_bytesize);
157867ba300SArek Kusztal 	else if (xform->xform_type == RTE_CRYPTO_ASYM_XFORM_RSA) {
1583387912fSArek Kusztal 		if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_QT)
159fdf9cdacSArek Kusztal 			cleanup_crt(cookie, cookie->alg_bytesize);
160867ba300SArek Kusztal 		else {
1613b78aa7bSArek Kusztal 			cleanup_arrays(cookie, QAT_ASYM_RSA_NUM_IN_PARAMS,
162fdf9cdacSArek Kusztal 				QAT_ASYM_RSA_NUM_OUT_PARAMS,
163fdf9cdacSArek Kusztal 				cookie->alg_bytesize);
164867ba300SArek Kusztal 		}
1654c1a91b2SArek Kusztal 	} else {
1664c1a91b2SArek Kusztal 		cleanup_arrays(cookie, QAT_ASYM_MAX_PARAMS,
1674c1a91b2SArek Kusztal 				QAT_ASYM_MAX_PARAMS,
1684c1a91b2SArek Kusztal 				QAT_PKE_MAX_LN_SIZE);
169867ba300SArek Kusztal 	}
170e1ed5a73SArek Kusztal }
171e1ed5a73SArek Kusztal 
172a2343302SKai Ji static int
1733b78aa7bSArek Kusztal check_zero(rte_crypto_param n)
174a2343302SKai Ji {
1753b78aa7bSArek Kusztal 	int i, len = n.length;
176a2343302SKai Ji 
1773b78aa7bSArek Kusztal 	if (len < 8) {
1783b78aa7bSArek Kusztal 		for (i = len - 1; i >= 0; i--) {
1793b78aa7bSArek Kusztal 			if (n.data[i] != 0x0)
180a2343302SKai Ji 				return 0;
181a2343302SKai Ji 		}
1823b78aa7bSArek Kusztal 	} else if (len == 8 && *(uint64_t *)&n.data[len - 8] == 0) {
1833b78aa7bSArek Kusztal 		return 1;
1843b78aa7bSArek Kusztal 	} else if (*(uint64_t *)&n.data[len - 8] == 0) {
1853b78aa7bSArek Kusztal 		for (i = len - 9; i >= 0; i--) {
186f81cbc20SArek Kusztal 			if (n.data[i] != 0x0)
187f81cbc20SArek Kusztal 				return 0;
188f81cbc20SArek Kusztal 		}
1893b78aa7bSArek Kusztal 	} else
1903b78aa7bSArek Kusztal 		return 0;
1913b78aa7bSArek Kusztal 
1923b78aa7bSArek Kusztal 	return 1;
1933b78aa7bSArek Kusztal }
1943b78aa7bSArek Kusztal 
1953b78aa7bSArek Kusztal static struct qat_asym_function
196d4f17d6bSArek Kusztal get_asym_function(const struct rte_crypto_asym_xform *xform)
1973b78aa7bSArek Kusztal {
1983b78aa7bSArek Kusztal 	struct qat_asym_function qat_function;
1993b78aa7bSArek Kusztal 
2003b78aa7bSArek Kusztal 	switch (xform->xform_type) {
2013b78aa7bSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
2023b78aa7bSArek Kusztal 		qat_function = get_modexp_function(xform);
2033b78aa7bSArek Kusztal 		break;
2043b78aa7bSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
2053b78aa7bSArek Kusztal 		qat_function = get_modinv_function(xform);
2063b78aa7bSArek Kusztal 		break;
2073b78aa7bSArek Kusztal 	default:
2083b78aa7bSArek Kusztal 		qat_function.func_id = 0;
2093b78aa7bSArek Kusztal 		break;
2103b78aa7bSArek Kusztal 	}
2113b78aa7bSArek Kusztal 
2123b78aa7bSArek Kusztal 	return qat_function;
2133b78aa7bSArek Kusztal }
214f81cbc20SArek Kusztal 
215e1ed5a73SArek Kusztal static int
216d4f17d6bSArek Kusztal modexp_set_input(struct icp_qat_fw_pke_request *qat_req,
217e1ed5a73SArek Kusztal 		struct qat_asym_op_cookie *cookie,
218d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
219d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
220e1ed5a73SArek Kusztal {
2213b78aa7bSArek Kusztal 	struct qat_asym_function qat_function;
2228545c6d2SArek Kusztal 	uint32_t alg_bytesize, func_id, in_bytesize;
2233b78aa7bSArek Kusztal 	int status = 0;
224e1ed5a73SArek Kusztal 
2253b78aa7bSArek Kusztal 	CHECK_IF_NOT_EMPTY(xform->modex.modulus, "mod exp",
2263b78aa7bSArek Kusztal 			"modulus", status);
2273b78aa7bSArek Kusztal 	CHECK_IF_NOT_EMPTY(xform->modex.exponent, "mod exp",
2283b78aa7bSArek Kusztal 				"exponent", status);
2293b78aa7bSArek Kusztal 	if (status)
2303b78aa7bSArek Kusztal 		return status;
2313b78aa7bSArek Kusztal 
2328545c6d2SArek Kusztal 	if (asym_op->modex.base.length > xform->modex.exponent.length &&
2338545c6d2SArek Kusztal 		asym_op->modex.base.length > xform->modex.modulus.length) {
2348545c6d2SArek Kusztal 		in_bytesize = asym_op->modex.base.length;
2358545c6d2SArek Kusztal 	} else if (xform->modex.exponent.length > xform->modex.modulus.length)
2368545c6d2SArek Kusztal 		in_bytesize = xform->modex.exponent.length;
2378545c6d2SArek Kusztal 	else
2388545c6d2SArek Kusztal 		in_bytesize = xform->modex.modulus.length;
2398545c6d2SArek Kusztal 
2408545c6d2SArek Kusztal 	qat_function = get_modexp_function2(in_bytesize);
2413b78aa7bSArek Kusztal 	func_id = qat_function.func_id;
2423b78aa7bSArek Kusztal 	if (qat_function.func_id == 0) {
2433b78aa7bSArek Kusztal 		QAT_LOG(ERR, "Cannot obtain functionality id");
2443b78aa7bSArek Kusztal 		return -EINVAL;
245e1ed5a73SArek Kusztal 	}
2463b78aa7bSArek Kusztal 	alg_bytesize = qat_function.bytesize;
247e1ed5a73SArek Kusztal 
248fde2e2f1SArek Kusztal 	SET_PKE_LN(asym_op->modex.base, alg_bytesize, 0);
249fde2e2f1SArek Kusztal 	SET_PKE_LN(xform->modex.exponent, alg_bytesize, 1);
250fde2e2f1SArek Kusztal 	SET_PKE_LN(xform->modex.modulus, alg_bytesize, 2);
251e1ed5a73SArek Kusztal 
2523b78aa7bSArek Kusztal 	cookie->alg_bytesize = alg_bytesize;
253e1ed5a73SArek Kusztal 	qat_req->pke_hdr.cd_pars.func_id = func_id;
254e1ed5a73SArek Kusztal 	qat_req->input_param_count = QAT_ASYM_MODEXP_NUM_IN_PARAMS;
255e1ed5a73SArek Kusztal 	qat_req->output_param_count = QAT_ASYM_MODEXP_NUM_OUT_PARAMS;
2563b78aa7bSArek Kusztal 
2573b78aa7bSArek Kusztal 	HEXDUMP("ModExp base", cookie->input_array[0], alg_bytesize);
2583b78aa7bSArek Kusztal 	HEXDUMP("ModExp exponent", cookie->input_array[1], alg_bytesize);
2593b78aa7bSArek Kusztal 	HEXDUMP("ModExp modulus", cookie->input_array[2], alg_bytesize);
2603b78aa7bSArek Kusztal 
2613b78aa7bSArek Kusztal 	return status;
262e1ed5a73SArek Kusztal }
263e1ed5a73SArek Kusztal 
2643b78aa7bSArek Kusztal static uint8_t
2653b78aa7bSArek Kusztal modexp_collect(struct rte_crypto_asym_op *asym_op,
266d4f17d6bSArek Kusztal 		const struct qat_asym_op_cookie *cookie,
267d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
2683b78aa7bSArek Kusztal {
2693b78aa7bSArek Kusztal 	rte_crypto_param n = xform->modex.modulus;
2703b78aa7bSArek Kusztal 	uint32_t alg_bytesize = cookie->alg_bytesize;
2713b78aa7bSArek Kusztal 	uint8_t *modexp_result = asym_op->modex.result.data;
272e1ed5a73SArek Kusztal 
2735b4d317dSArek Kusztal 	if (n.length > alg_bytesize) {
2745b4d317dSArek Kusztal 		QAT_LOG(ERR, "Incorrect length of modexp modulus");
2755b4d317dSArek Kusztal 		return RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
2765b4d317dSArek Kusztal 	}
2773b78aa7bSArek Kusztal 	rte_memcpy(modexp_result,
2783b78aa7bSArek Kusztal 		cookie->output_array[0] + alg_bytesize
2793b78aa7bSArek Kusztal 		- n.length, n.length);
2805b2fe7efSArkadiusz Kusztal 	asym_op->modex.result.length = alg_bytesize;
2813b78aa7bSArek Kusztal 	HEXDUMP("ModExp result", cookie->output_array[0],
2823b78aa7bSArek Kusztal 			alg_bytesize);
2833b78aa7bSArek Kusztal 	return RTE_CRYPTO_OP_STATUS_SUCCESS;
284e1ed5a73SArek Kusztal }
285e1ed5a73SArek Kusztal 
2863b78aa7bSArek Kusztal static int
287d4f17d6bSArek Kusztal modinv_set_input(struct icp_qat_fw_pke_request *qat_req,
2883b78aa7bSArek Kusztal 		struct qat_asym_op_cookie *cookie,
289d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
290d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
2913b78aa7bSArek Kusztal {
2923b78aa7bSArek Kusztal 	struct qat_asym_function qat_function;
2933b78aa7bSArek Kusztal 	uint32_t alg_bytesize, func_id;
2943b78aa7bSArek Kusztal 	int status = 0;
2953b78aa7bSArek Kusztal 
2963b78aa7bSArek Kusztal 	CHECK_IF_NOT_EMPTY(xform->modex.modulus, "mod inv",
2973b78aa7bSArek Kusztal 			"modulus", status);
2983b78aa7bSArek Kusztal 	if (status)
2993b78aa7bSArek Kusztal 		return status;
3003b78aa7bSArek Kusztal 
3013b78aa7bSArek Kusztal 	qat_function = get_asym_function(xform);
3023b78aa7bSArek Kusztal 	func_id = qat_function.func_id;
3033b78aa7bSArek Kusztal 	if (func_id == 0) {
3043b78aa7bSArek Kusztal 		QAT_LOG(ERR, "Cannot obtain functionality id");
3053b78aa7bSArek Kusztal 		return -EINVAL;
3063b78aa7bSArek Kusztal 	}
3073b78aa7bSArek Kusztal 	alg_bytesize = qat_function.bytesize;
3083b78aa7bSArek Kusztal 
309fde2e2f1SArek Kusztal 	SET_PKE_LN(asym_op->modinv.base, alg_bytesize, 0);
310fde2e2f1SArek Kusztal 	SET_PKE_LN(xform->modinv.modulus, alg_bytesize, 1);
3113b78aa7bSArek Kusztal 
3123b78aa7bSArek Kusztal 	cookie->alg_bytesize = alg_bytesize;
313e1ed5a73SArek Kusztal 	qat_req->pke_hdr.cd_pars.func_id = func_id;
314e1ed5a73SArek Kusztal 	qat_req->input_param_count =
315e1ed5a73SArek Kusztal 			QAT_ASYM_MODINV_NUM_IN_PARAMS;
316e1ed5a73SArek Kusztal 	qat_req->output_param_count =
317e1ed5a73SArek Kusztal 			QAT_ASYM_MODINV_NUM_OUT_PARAMS;
3183b78aa7bSArek Kusztal 
3193b78aa7bSArek Kusztal 	HEXDUMP("ModInv base", cookie->input_array[0], alg_bytesize);
3203b78aa7bSArek Kusztal 	HEXDUMP("ModInv modulus", cookie->input_array[1], alg_bytesize);
3213b78aa7bSArek Kusztal 
3223b78aa7bSArek Kusztal 	return 0;
323e2c5f4eaSArek Kusztal }
324e2c5f4eaSArek Kusztal 
3253b78aa7bSArek Kusztal static uint8_t
3263b78aa7bSArek Kusztal modinv_collect(struct rte_crypto_asym_op *asym_op,
327d4f17d6bSArek Kusztal 		const struct qat_asym_op_cookie *cookie,
328d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
3293b78aa7bSArek Kusztal {
3303b78aa7bSArek Kusztal 	rte_crypto_param n = xform->modinv.modulus;
3313b78aa7bSArek Kusztal 	uint8_t *modinv_result = asym_op->modinv.result.data;
3323b78aa7bSArek Kusztal 	uint32_t alg_bytesize = cookie->alg_bytesize;
333e2c5f4eaSArek Kusztal 
3345b4d317dSArek Kusztal 	if (n.length > alg_bytesize) {
3355b4d317dSArek Kusztal 		QAT_LOG(ERR, "Incorrect length of modinv modulus");
3365b4d317dSArek Kusztal 		return RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
3375b4d317dSArek Kusztal 	}
3383b78aa7bSArek Kusztal 	rte_memcpy(modinv_result + (asym_op->modinv.result.length
3393b78aa7bSArek Kusztal 		- n.length),
3403b78aa7bSArek Kusztal 		cookie->output_array[0] + alg_bytesize
3413b78aa7bSArek Kusztal 		- n.length, n.length);
3425b2fe7efSArkadiusz Kusztal 	asym_op->modinv.result.length = alg_bytesize;
3433b78aa7bSArek Kusztal 	HEXDUMP("ModInv result", cookie->output_array[0],
3443b78aa7bSArek Kusztal 			alg_bytesize);
3453b78aa7bSArek Kusztal 	return RTE_CRYPTO_OP_STATUS_SUCCESS;
346e2c5f4eaSArek Kusztal }
3473b78aa7bSArek Kusztal 
3483b78aa7bSArek Kusztal static int
349d4f17d6bSArek Kusztal rsa_set_pub_input(struct icp_qat_fw_pke_request *qat_req,
3503b78aa7bSArek Kusztal 		struct qat_asym_op_cookie *cookie,
351d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
352d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
3533b78aa7bSArek Kusztal {
3543b78aa7bSArek Kusztal 	struct qat_asym_function qat_function;
3553b78aa7bSArek Kusztal 	uint32_t alg_bytesize, func_id;
3563b78aa7bSArek Kusztal 	int status = 0;
3573b78aa7bSArek Kusztal 
3583b78aa7bSArek Kusztal 	qat_function = get_rsa_enc_function(xform);
3593b78aa7bSArek Kusztal 	func_id = qat_function.func_id;
3603b78aa7bSArek Kusztal 	if (func_id == 0) {
3613b78aa7bSArek Kusztal 		QAT_LOG(ERR, "Cannot obtain functionality id");
3623b78aa7bSArek Kusztal 		return -EINVAL;
3633b78aa7bSArek Kusztal 	}
3643b78aa7bSArek Kusztal 	alg_bytesize = qat_function.bytesize;
3653b78aa7bSArek Kusztal 
366e2c5f4eaSArek Kusztal 	if (asym_op->rsa.op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT) {
3678a97564bSGowrishankar Muthukrishnan 		switch (xform->rsa.padding.type) {
368e2c5f4eaSArek Kusztal 		case RTE_CRYPTO_RSA_PADDING_NONE:
369fde2e2f1SArek Kusztal 			SET_PKE_LN(asym_op->rsa.message, alg_bytesize, 0);
370e2c5f4eaSArek Kusztal 			break;
371e2c5f4eaSArek Kusztal 		default:
372e2c5f4eaSArek Kusztal 			QAT_LOG(ERR,
3733b78aa7bSArek Kusztal 				"Invalid RSA padding (Encryption)"
3743b78aa7bSArek Kusztal 				);
3753b78aa7bSArek Kusztal 			return -EINVAL;
376e2c5f4eaSArek Kusztal 		}
3773b78aa7bSArek Kusztal 		HEXDUMP("RSA Message", cookie->input_array[0], alg_bytesize);
378e2c5f4eaSArek Kusztal 	} else {
3798a97564bSGowrishankar Muthukrishnan 		switch (xform->rsa.padding.type) {
380e2c5f4eaSArek Kusztal 		case RTE_CRYPTO_RSA_PADDING_NONE:
381fde2e2f1SArek Kusztal 			SET_PKE_LN(asym_op->rsa.sign, alg_bytesize, 0);
382e2c5f4eaSArek Kusztal 			break;
383e2c5f4eaSArek Kusztal 		default:
384e2c5f4eaSArek Kusztal 			QAT_LOG(ERR,
385e2c5f4eaSArek Kusztal 				"Invalid RSA padding (Verify)");
3863b78aa7bSArek Kusztal 			return -EINVAL;
3873b78aa7bSArek Kusztal 		}
3883b78aa7bSArek Kusztal 		HEXDUMP("RSA Signature", cookie->input_array[0],
3893b78aa7bSArek Kusztal 				alg_bytesize);
390e2c5f4eaSArek Kusztal 	}
391e2c5f4eaSArek Kusztal 
392fde2e2f1SArek Kusztal 	SET_PKE_LN(xform->rsa.e, alg_bytesize, 1);
393fde2e2f1SArek Kusztal 	SET_PKE_LN(xform->rsa.n, alg_bytesize, 2);
394e2c5f4eaSArek Kusztal 
3953b78aa7bSArek Kusztal 	cookie->alg_bytesize = alg_bytesize;
396e2c5f4eaSArek Kusztal 	qat_req->pke_hdr.cd_pars.func_id = func_id;
397e2c5f4eaSArek Kusztal 
3983b78aa7bSArek Kusztal 	HEXDUMP("RSA Public Key", cookie->input_array[1], alg_bytesize);
3993b78aa7bSArek Kusztal 	HEXDUMP("RSA Modulus", cookie->input_array[2], alg_bytesize);
4003b78aa7bSArek Kusztal 
4013b78aa7bSArek Kusztal 	return status;
4023b78aa7bSArek Kusztal }
4033b78aa7bSArek Kusztal 
4043b78aa7bSArek Kusztal static int
405d4f17d6bSArek Kusztal rsa_set_priv_input(struct icp_qat_fw_pke_request *qat_req,
4063b78aa7bSArek Kusztal 		struct qat_asym_op_cookie *cookie,
407d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
408d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
4093b78aa7bSArek Kusztal {
4103b78aa7bSArek Kusztal 	struct qat_asym_function qat_function;
4113b78aa7bSArek Kusztal 	uint32_t alg_bytesize, func_id;
4123b78aa7bSArek Kusztal 	int status = 0;
4133b78aa7bSArek Kusztal 
4143b78aa7bSArek Kusztal 	if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_QT) {
4153b78aa7bSArek Kusztal 		qat_function = get_rsa_crt_function(xform);
4163b78aa7bSArek Kusztal 		func_id = qat_function.func_id;
4173b78aa7bSArek Kusztal 		if (func_id == 0) {
4183b78aa7bSArek Kusztal 			QAT_LOG(ERR, "Cannot obtain functionality id");
4193b78aa7bSArek Kusztal 			return -EINVAL;
4203b78aa7bSArek Kusztal 		}
4213b78aa7bSArek Kusztal 		alg_bytesize = qat_function.bytesize;
4223b78aa7bSArek Kusztal 		qat_req->input_param_count =
4233b78aa7bSArek Kusztal 				QAT_ASYM_RSA_QT_NUM_IN_PARAMS;
4243b78aa7bSArek Kusztal 
425fde2e2f1SArek Kusztal 		SET_PKE_LN(xform->rsa.qt.p, (alg_bytesize >> 1), 1);
426fde2e2f1SArek Kusztal 		SET_PKE_LN(xform->rsa.qt.q, (alg_bytesize >> 1), 2);
427fde2e2f1SArek Kusztal 		SET_PKE_LN(xform->rsa.qt.dP, (alg_bytesize >> 1), 3);
428fde2e2f1SArek Kusztal 		SET_PKE_LN(xform->rsa.qt.dQ, (alg_bytesize >> 1), 4);
429fde2e2f1SArek Kusztal 		SET_PKE_LN(xform->rsa.qt.qInv, (alg_bytesize >> 1), 5);
4303b78aa7bSArek Kusztal 
4313b78aa7bSArek Kusztal 		HEXDUMP("RSA p", cookie->input_array[1],
4323b78aa7bSArek Kusztal 				alg_bytesize);
4333b78aa7bSArek Kusztal 		HEXDUMP("RSA q", cookie->input_array[2],
4343b78aa7bSArek Kusztal 				alg_bytesize);
4353b78aa7bSArek Kusztal 		HEXDUMP("RSA dP", cookie->input_array[3],
4363b78aa7bSArek Kusztal 				alg_bytesize);
4373b78aa7bSArek Kusztal 		HEXDUMP("RSA dQ", cookie->input_array[4],
4383b78aa7bSArek Kusztal 				alg_bytesize);
4393b78aa7bSArek Kusztal 		HEXDUMP("RSA qInv", cookie->input_array[5],
4403b78aa7bSArek Kusztal 				alg_bytesize);
4413b78aa7bSArek Kusztal 	} else if (xform->rsa.key_type ==
4423b78aa7bSArek Kusztal 			RTE_RSA_KEY_TYPE_EXP) {
4433b78aa7bSArek Kusztal 		qat_function = get_rsa_dec_function(xform);
4443b78aa7bSArek Kusztal 		func_id = qat_function.func_id;
4453b78aa7bSArek Kusztal 		if (func_id == 0) {
4463b78aa7bSArek Kusztal 			QAT_LOG(ERR, "Cannot obtain functionality id");
4473b78aa7bSArek Kusztal 			return -EINVAL;
4483b78aa7bSArek Kusztal 		}
4493b78aa7bSArek Kusztal 		alg_bytesize = qat_function.bytesize;
4503b78aa7bSArek Kusztal 
451fde2e2f1SArek Kusztal 		SET_PKE_LN(xform->rsa.d, alg_bytesize, 1);
452fde2e2f1SArek Kusztal 		SET_PKE_LN(xform->rsa.n, alg_bytesize, 2);
4533b78aa7bSArek Kusztal 
4543b78aa7bSArek Kusztal 		HEXDUMP("RSA d", cookie->input_array[1],
4553b78aa7bSArek Kusztal 				alg_bytesize);
4563b78aa7bSArek Kusztal 		HEXDUMP("RSA n", cookie->input_array[2],
4573b78aa7bSArek Kusztal 				alg_bytesize);
458e2c5f4eaSArek Kusztal 	} else {
4593b78aa7bSArek Kusztal 		QAT_LOG(ERR, "Invalid RSA key type");
4603b78aa7bSArek Kusztal 		return -EINVAL;
4613b78aa7bSArek Kusztal 	}
4623b78aa7bSArek Kusztal 
463e2c5f4eaSArek Kusztal 	if (asym_op->rsa.op_type ==
464e2c5f4eaSArek Kusztal 			RTE_CRYPTO_ASYM_OP_DECRYPT) {
4658a97564bSGowrishankar Muthukrishnan 		switch (xform->rsa.padding.type) {
466e2c5f4eaSArek Kusztal 		case RTE_CRYPTO_RSA_PADDING_NONE:
467fde2e2f1SArek Kusztal 			SET_PKE_LN(asym_op->rsa.cipher,	alg_bytesize, 0);
4683b78aa7bSArek Kusztal 			HEXDUMP("RSA ciphertext", cookie->input_array[0],
4693b78aa7bSArek Kusztal 				alg_bytesize);
470e2c5f4eaSArek Kusztal 			break;
471e2c5f4eaSArek Kusztal 		default:
472e2c5f4eaSArek Kusztal 			QAT_LOG(ERR,
473e2c5f4eaSArek Kusztal 				"Invalid padding of RSA (Decrypt)");
474e2c5f4eaSArek Kusztal 			return -(EINVAL);
475e2c5f4eaSArek Kusztal 		}
476e2c5f4eaSArek Kusztal 
477e2c5f4eaSArek Kusztal 	} else if (asym_op->rsa.op_type ==
478e2c5f4eaSArek Kusztal 			RTE_CRYPTO_ASYM_OP_SIGN) {
4798a97564bSGowrishankar Muthukrishnan 		switch (xform->rsa.padding.type) {
480e2c5f4eaSArek Kusztal 		case RTE_CRYPTO_RSA_PADDING_NONE:
481fde2e2f1SArek Kusztal 			SET_PKE_LN(asym_op->rsa.message, alg_bytesize, 0);
4823b78aa7bSArek Kusztal 			HEXDUMP("RSA text to be signed", cookie->input_array[0],
4833b78aa7bSArek Kusztal 				alg_bytesize);
484e2c5f4eaSArek Kusztal 			break;
485e2c5f4eaSArek Kusztal 		default:
486e2c5f4eaSArek Kusztal 			QAT_LOG(ERR,
487e2c5f4eaSArek Kusztal 				"Invalid padding of RSA (Signature)");
488e2c5f4eaSArek Kusztal 			return -(EINVAL);
489e2c5f4eaSArek Kusztal 		}
490e2c5f4eaSArek Kusztal 	}
491539a3216SArek Kusztal 
4923b78aa7bSArek Kusztal 	cookie->alg_bytesize = alg_bytesize;
4933b78aa7bSArek Kusztal 	qat_req->pke_hdr.cd_pars.func_id = func_id;
4943b78aa7bSArek Kusztal 	return status;
4953b78aa7bSArek Kusztal }
4963b78aa7bSArek Kusztal 
4973b78aa7bSArek Kusztal static int
498d4f17d6bSArek Kusztal rsa_set_input(struct icp_qat_fw_pke_request *qat_req,
4993b78aa7bSArek Kusztal 		struct qat_asym_op_cookie *cookie,
500d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
501d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
5023b78aa7bSArek Kusztal {
503539a3216SArek Kusztal 	qat_req->input_param_count =
5043b78aa7bSArek Kusztal 			QAT_ASYM_RSA_NUM_IN_PARAMS;
5053b78aa7bSArek Kusztal 	qat_req->output_param_count =
5063b78aa7bSArek Kusztal 			QAT_ASYM_RSA_NUM_OUT_PARAMS;
507539a3216SArek Kusztal 
5083b78aa7bSArek Kusztal 	if (asym_op->rsa.op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT ||
5093b78aa7bSArek Kusztal 			asym_op->rsa.op_type ==
5103b78aa7bSArek Kusztal 				RTE_CRYPTO_ASYM_OP_VERIFY) {
511d4f17d6bSArek Kusztal 		return rsa_set_pub_input(qat_req, cookie, asym_op, xform);
512e2c5f4eaSArek Kusztal 	} else {
513d4f17d6bSArek Kusztal 		return rsa_set_priv_input(qat_req, cookie, asym_op, xform);
5143b78aa7bSArek Kusztal 	}
5153b78aa7bSArek Kusztal }
5163b78aa7bSArek Kusztal 
5173b78aa7bSArek Kusztal static uint8_t
5183b78aa7bSArek Kusztal rsa_collect(struct rte_crypto_asym_op *asym_op,
5198a97564bSGowrishankar Muthukrishnan 		const struct qat_asym_op_cookie *cookie,
5208a97564bSGowrishankar Muthukrishnan 		const struct rte_crypto_asym_xform *xform)
5213b78aa7bSArek Kusztal {
5223b78aa7bSArek Kusztal 	uint32_t alg_bytesize = cookie->alg_bytesize;
5233b78aa7bSArek Kusztal 
5243b78aa7bSArek Kusztal 	if (asym_op->rsa.op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT ||
5253b78aa7bSArek Kusztal 		asym_op->rsa.op_type ==	RTE_CRYPTO_ASYM_OP_VERIFY) {
5263b78aa7bSArek Kusztal 
5273b78aa7bSArek Kusztal 		if (asym_op->rsa.op_type ==
5283b78aa7bSArek Kusztal 				RTE_CRYPTO_ASYM_OP_ENCRYPT) {
529112b6215SArek Kusztal 			rte_memcpy(asym_op->rsa.cipher.data,
5303b78aa7bSArek Kusztal 					cookie->output_array[0],
5313b78aa7bSArek Kusztal 					alg_bytesize);
532112b6215SArek Kusztal 			asym_op->rsa.cipher.length = alg_bytesize;
5333b78aa7bSArek Kusztal 			HEXDUMP("RSA Encrypted data", cookie->output_array[0],
5343b78aa7bSArek Kusztal 				alg_bytesize);
5353b78aa7bSArek Kusztal 		} else {
5368a97564bSGowrishankar Muthukrishnan 			switch (xform->rsa.padding.type) {
5373b78aa7bSArek Kusztal 			case RTE_CRYPTO_RSA_PADDING_NONE:
538112b6215SArek Kusztal 				rte_memcpy(asym_op->rsa.cipher.data,
5393b78aa7bSArek Kusztal 						cookie->output_array[0],
5403b78aa7bSArek Kusztal 						alg_bytesize);
541112b6215SArek Kusztal 				asym_op->rsa.cipher.length = alg_bytesize;
5423b78aa7bSArek Kusztal 				HEXDUMP("RSA signature",
5433b78aa7bSArek Kusztal 					cookie->output_array[0],
5443b78aa7bSArek Kusztal 					alg_bytesize);
5453b78aa7bSArek Kusztal 				break;
5463b78aa7bSArek Kusztal 			default:
5473b78aa7bSArek Kusztal 				QAT_LOG(ERR, "Padding not supported");
5483b78aa7bSArek Kusztal 				return RTE_CRYPTO_OP_STATUS_ERROR;
549e2c5f4eaSArek Kusztal 			}
550e2c5f4eaSArek Kusztal 		}
551e1ed5a73SArek Kusztal 	} else {
5523b78aa7bSArek Kusztal 		if (asym_op->rsa.op_type == RTE_CRYPTO_ASYM_OP_DECRYPT) {
5538a97564bSGowrishankar Muthukrishnan 			switch (xform->rsa.padding.type) {
5543b78aa7bSArek Kusztal 			case RTE_CRYPTO_RSA_PADDING_NONE:
555112b6215SArek Kusztal 				rte_memcpy(asym_op->rsa.message.data,
5563b78aa7bSArek Kusztal 					cookie->output_array[0],
5573b78aa7bSArek Kusztal 					alg_bytesize);
558112b6215SArek Kusztal 				asym_op->rsa.message.length = alg_bytesize;
5593b78aa7bSArek Kusztal 				HEXDUMP("RSA Decrypted Message",
5603b78aa7bSArek Kusztal 					cookie->output_array[0],
5613b78aa7bSArek Kusztal 					alg_bytesize);
5623b78aa7bSArek Kusztal 				break;
5633b78aa7bSArek Kusztal 			default:
5643b78aa7bSArek Kusztal 				QAT_LOG(ERR, "Padding not supported");
5653b78aa7bSArek Kusztal 				return RTE_CRYPTO_OP_STATUS_ERROR;
566e1ed5a73SArek Kusztal 			}
5673b78aa7bSArek Kusztal 		} else {
568112b6215SArek Kusztal 			rte_memcpy(asym_op->rsa.sign.data,
5693b78aa7bSArek Kusztal 				cookie->output_array[0],
5703b78aa7bSArek Kusztal 				alg_bytesize);
571112b6215SArek Kusztal 			asym_op->rsa.sign.length = alg_bytesize;
5723b78aa7bSArek Kusztal 			HEXDUMP("RSA Signature", cookie->output_array[0],
5733b78aa7bSArek Kusztal 				alg_bytesize);
5743b78aa7bSArek Kusztal 		}
5753b78aa7bSArek Kusztal 	}
5763b78aa7bSArek Kusztal 	return RTE_CRYPTO_OP_STATUS_SUCCESS;
577e1ed5a73SArek Kusztal }
578e1ed5a73SArek Kusztal 
579b5324d38SArek Kusztal static int
580d4f17d6bSArek Kusztal ecdsa_set_input(struct icp_qat_fw_pke_request *qat_req,
581b5324d38SArek Kusztal 		struct qat_asym_op_cookie *cookie,
582d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
583d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
584b5324d38SArek Kusztal {
585b5324d38SArek Kusztal 	struct qat_asym_function qat_function;
586fde2e2f1SArek Kusztal 	uint32_t qat_func_alignsize, func_id;
587b5324d38SArek Kusztal 	int curve_id;
588b5324d38SArek Kusztal 
589b5324d38SArek Kusztal 	curve_id = pick_curve(xform);
590b5324d38SArek Kusztal 	if (curve_id < 0) {
591fde2e2f1SArek Kusztal 		QAT_LOG(DEBUG, "Incorrect elliptic curve");
592b5324d38SArek Kusztal 		return -EINVAL;
593b5324d38SArek Kusztal 	}
594b5324d38SArek Kusztal 
595b5324d38SArek Kusztal 	switch (asym_op->ecdsa.op_type) {
596b5324d38SArek Kusztal 	case RTE_CRYPTO_ASYM_OP_SIGN:
597b5324d38SArek Kusztal 		qat_function = get_ecdsa_function(xform);
598b5324d38SArek Kusztal 		func_id = qat_function.func_id;
599b5324d38SArek Kusztal 		if (func_id == 0) {
600b5324d38SArek Kusztal 			QAT_LOG(ERR, "Cannot obtain functionality id");
601b5324d38SArek Kusztal 			return -EINVAL;
602b5324d38SArek Kusztal 		}
603fde2e2f1SArek Kusztal 		qat_func_alignsize =
604fde2e2f1SArek Kusztal 			RTE_ALIGN_CEIL(qat_function.bytesize, 8);
605b5324d38SArek Kusztal 
606badc0c6fSGowrishankar Muthukrishnan 		SET_PKE_9A_IN(xform->ec.pkey, 0);
607fde2e2f1SArek Kusztal 		SET_PKE_9A_IN(asym_op->ecdsa.message, 1);
608fde2e2f1SArek Kusztal 		SET_PKE_9A_IN(asym_op->ecdsa.k, 2);
609fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], b, 3);
610fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], a, 4);
611fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], p, 5);
612fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], n, 6);
613fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], y, 7);
614fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], x, 8);
615b5324d38SArek Kusztal 
616fde2e2f1SArek Kusztal 		cookie->alg_bytesize = curve[curve_id].bytesize;
617fde2e2f1SArek Kusztal 		cookie->qat_func_alignsize = qat_func_alignsize;
618b5324d38SArek Kusztal 		qat_req->pke_hdr.cd_pars.func_id = func_id;
619b5324d38SArek Kusztal 		qat_req->input_param_count =
620b5324d38SArek Kusztal 				QAT_ASYM_ECDSA_RS_SIGN_IN_PARAMS;
621b5324d38SArek Kusztal 		qat_req->output_param_count =
622b5324d38SArek Kusztal 				QAT_ASYM_ECDSA_RS_SIGN_OUT_PARAMS;
623b5324d38SArek Kusztal 
624b5324d38SArek Kusztal 		HEXDUMP_OFF_F("ECDSA d", 0);
625b5324d38SArek Kusztal 		HEXDUMP_OFF_F("ECDSA e", 1);
626b5324d38SArek Kusztal 		HEXDUMP_OFF_F("ECDSA k", 2);
627b5324d38SArek Kusztal 		HEXDUMP_OFF_F("ECDSA b", 3);
628b5324d38SArek Kusztal 		HEXDUMP_OFF_F("ECDSA a", 4);
629b5324d38SArek Kusztal 		HEXDUMP_OFF_F("ECDSA n", 5);
630b5324d38SArek Kusztal 		HEXDUMP_OFF_F("ECDSA y", 6);
631b5324d38SArek Kusztal 		HEXDUMP_OFF_F("ECDSA x", 7);
632b5324d38SArek Kusztal 		break;
633b5324d38SArek Kusztal 	case RTE_CRYPTO_ASYM_OP_VERIFY:
634b5324d38SArek Kusztal 		qat_function = get_ecdsa_verify_function(xform);
635b5324d38SArek Kusztal 		func_id = qat_function.func_id;
636b5324d38SArek Kusztal 		if (func_id == 0) {
637b5324d38SArek Kusztal 			QAT_LOG(ERR, "Cannot obtain functionality id");
638b5324d38SArek Kusztal 			return -EINVAL;
639b5324d38SArek Kusztal 		}
640fde2e2f1SArek Kusztal 		qat_func_alignsize = RTE_ALIGN_CEIL(qat_function.bytesize, 8);
641b5324d38SArek Kusztal 
642fde2e2f1SArek Kusztal 		SET_PKE_9A_IN(asym_op->ecdsa.message, 10);
643fde2e2f1SArek Kusztal 		SET_PKE_9A_IN(asym_op->ecdsa.s, 9);
644fde2e2f1SArek Kusztal 		SET_PKE_9A_IN(asym_op->ecdsa.r, 8);
645fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], n, 7);
646fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], x, 6);
647fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], y, 5);
648badc0c6fSGowrishankar Muthukrishnan 		SET_PKE_9A_IN(xform->ec.q.x, 4);
649badc0c6fSGowrishankar Muthukrishnan 		SET_PKE_9A_IN(xform->ec.q.y, 3);
650fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], a, 2);
651fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], b, 1);
652fde2e2f1SArek Kusztal 		SET_PKE_9A_EC(curve[curve_id], p, 0);
653b5324d38SArek Kusztal 
654fde2e2f1SArek Kusztal 		cookie->alg_bytesize = curve[curve_id].bytesize;
655fde2e2f1SArek Kusztal 		cookie->qat_func_alignsize = qat_func_alignsize;
656b5324d38SArek Kusztal 		qat_req->pke_hdr.cd_pars.func_id = func_id;
657b5324d38SArek Kusztal 		qat_req->input_param_count =
658b5324d38SArek Kusztal 				QAT_ASYM_ECDSA_RS_VERIFY_IN_PARAMS;
659b5324d38SArek Kusztal 		qat_req->output_param_count =
660b5324d38SArek Kusztal 				QAT_ASYM_ECDSA_RS_VERIFY_OUT_PARAMS;
661b5324d38SArek Kusztal 
662002486dbSArek Kusztal 		HEXDUMP_OFF_F("p", 0);
663002486dbSArek Kusztal 		HEXDUMP_OFF_F("b", 1);
664002486dbSArek Kusztal 		HEXDUMP_OFF_F("a", 2);
665002486dbSArek Kusztal 		HEXDUMP_OFF_F("y", 3);
666002486dbSArek Kusztal 		HEXDUMP_OFF_F("x", 4);
667b5324d38SArek Kusztal 		HEXDUMP_OFF_F("yG", 5);
668002486dbSArek Kusztal 		HEXDUMP_OFF_F("xG", 6);
669002486dbSArek Kusztal 		HEXDUMP_OFF_F("n", 7);
670002486dbSArek Kusztal 		HEXDUMP_OFF_F("r", 8);
671002486dbSArek Kusztal 		HEXDUMP_OFF_F("s", 9);
672002486dbSArek Kusztal 		HEXDUMP_OFF_F("e", 10);
673b5324d38SArek Kusztal 		break;
674b5324d38SArek Kusztal 	default:
675b5324d38SArek Kusztal 		return -1;
676b5324d38SArek Kusztal 	}
677b5324d38SArek Kusztal 
678b5324d38SArek Kusztal 	return 0;
679b5324d38SArek Kusztal }
680b5324d38SArek Kusztal 
681b5324d38SArek Kusztal static uint8_t
682b5324d38SArek Kusztal ecdsa_collect(struct rte_crypto_asym_op *asym_op,
683d4f17d6bSArek Kusztal 		const struct qat_asym_op_cookie *cookie)
684b5324d38SArek Kusztal {
685002486dbSArek Kusztal 	uint32_t alg_bytesize = cookie->alg_bytesize;
686fde2e2f1SArek Kusztal 	uint32_t qat_func_alignsize = cookie->qat_func_alignsize;
687fde2e2f1SArek Kusztal 	uint32_t ltrim = qat_func_alignsize - alg_bytesize;
688b5324d38SArek Kusztal 
689b5324d38SArek Kusztal 	if (asym_op->rsa.op_type == RTE_CRYPTO_ASYM_OP_SIGN) {
690b5324d38SArek Kusztal 		uint8_t *r = asym_op->ecdsa.r.data;
691b5324d38SArek Kusztal 		uint8_t *s = asym_op->ecdsa.s.data;
692b5324d38SArek Kusztal 
693b5324d38SArek Kusztal 		asym_op->ecdsa.r.length = alg_bytesize;
694b5324d38SArek Kusztal 		asym_op->ecdsa.s.length = alg_bytesize;
695002486dbSArek Kusztal 		rte_memcpy(r, &cookie->output_array[0][ltrim], alg_bytesize);
696002486dbSArek Kusztal 		rte_memcpy(s, &cookie->output_array[1][ltrim], alg_bytesize);
697002486dbSArek Kusztal 
698b5324d38SArek Kusztal 		HEXDUMP("R", cookie->output_array[0],
699fde2e2f1SArek Kusztal 			qat_func_alignsize);
700b5324d38SArek Kusztal 		HEXDUMP("S", cookie->output_array[1],
701fde2e2f1SArek Kusztal 			qat_func_alignsize);
702b5324d38SArek Kusztal 	}
703b5324d38SArek Kusztal 	return RTE_CRYPTO_OP_STATUS_SUCCESS;
704b5324d38SArek Kusztal }
7053b78aa7bSArek Kusztal 
7063b78aa7bSArek Kusztal static int
707d4f17d6bSArek Kusztal ecpm_set_input(struct icp_qat_fw_pke_request *qat_req,
7086c25a68aSArek Kusztal 		struct qat_asym_op_cookie *cookie,
709d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
710d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
7116c25a68aSArek Kusztal {
7126c25a68aSArek Kusztal 	struct qat_asym_function qat_function;
713fde2e2f1SArek Kusztal 	uint32_t qat_func_alignsize, func_id;
7146c25a68aSArek Kusztal 	int curve_id;
7156c25a68aSArek Kusztal 
7166c25a68aSArek Kusztal 	curve_id = pick_curve(xform);
7176c25a68aSArek Kusztal 	if (curve_id < 0) {
718fde2e2f1SArek Kusztal 		QAT_LOG(DEBUG, "Incorrect elliptic curve");
7196c25a68aSArek Kusztal 		return -EINVAL;
7206c25a68aSArek Kusztal 	}
7216c25a68aSArek Kusztal 
7226c25a68aSArek Kusztal 	qat_function = get_ecpm_function(xform);
7236c25a68aSArek Kusztal 	func_id = qat_function.func_id;
7246c25a68aSArek Kusztal 	if (func_id == 0) {
7256c25a68aSArek Kusztal 		QAT_LOG(ERR, "Cannot obtain functionality id");
7266c25a68aSArek Kusztal 		return -EINVAL;
7276c25a68aSArek Kusztal 	}
728fde2e2f1SArek Kusztal 	qat_func_alignsize = RTE_ALIGN_CEIL(qat_function.bytesize, 8);
7296c25a68aSArek Kusztal 
730fde2e2f1SArek Kusztal 	SET_PKE_LN(asym_op->ecpm.scalar, qat_func_alignsize, 0);
731fde2e2f1SArek Kusztal 	SET_PKE_LN(asym_op->ecpm.p.x, qat_func_alignsize, 1);
732fde2e2f1SArek Kusztal 	SET_PKE_LN(asym_op->ecpm.p.y, qat_func_alignsize, 2);
733fde2e2f1SArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], a, 3);
734fde2e2f1SArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], b, 4);
735fde2e2f1SArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], p, 5);
736fde2e2f1SArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], h, 6);
7376c25a68aSArek Kusztal 
738fde2e2f1SArek Kusztal 	cookie->alg_bytesize = curve[curve_id].bytesize;
739fde2e2f1SArek Kusztal 	cookie->qat_func_alignsize = qat_func_alignsize;
7406c25a68aSArek Kusztal 	qat_req->pke_hdr.cd_pars.func_id = func_id;
7416c25a68aSArek Kusztal 	qat_req->input_param_count =
7426c25a68aSArek Kusztal 			QAT_ASYM_ECPM_IN_PARAMS;
7436c25a68aSArek Kusztal 	qat_req->output_param_count =
7446c25a68aSArek Kusztal 			QAT_ASYM_ECPM_OUT_PARAMS;
7456c25a68aSArek Kusztal 
746fde2e2f1SArek Kusztal 	HEXDUMP("k", cookie->input_array[0], qat_func_alignsize);
747fde2e2f1SArek Kusztal 	HEXDUMP("xG", cookie->input_array[1], qat_func_alignsize);
748fde2e2f1SArek Kusztal 	HEXDUMP("yG", cookie->input_array[2], qat_func_alignsize);
749fde2e2f1SArek Kusztal 	HEXDUMP("a", cookie->input_array[3], qat_func_alignsize);
750fde2e2f1SArek Kusztal 	HEXDUMP("b", cookie->input_array[4], qat_func_alignsize);
751fde2e2f1SArek Kusztal 	HEXDUMP("q", cookie->input_array[5], qat_func_alignsize);
752fde2e2f1SArek Kusztal 	HEXDUMP("h", cookie->input_array[6], qat_func_alignsize);
7536c25a68aSArek Kusztal 
7546c25a68aSArek Kusztal 	return 0;
7556c25a68aSArek Kusztal }
7566c25a68aSArek Kusztal 
7576c25a68aSArek Kusztal static uint8_t
7586c25a68aSArek Kusztal ecpm_collect(struct rte_crypto_asym_op *asym_op,
759d4f17d6bSArek Kusztal 		const struct qat_asym_op_cookie *cookie)
7606c25a68aSArek Kusztal {
761002486dbSArek Kusztal 	uint8_t *x = asym_op->ecpm.r.x.data;
762002486dbSArek Kusztal 	uint8_t *y = asym_op->ecpm.r.y.data;
7636c25a68aSArek Kusztal 	uint32_t alg_bytesize = cookie->alg_bytesize;
764fde2e2f1SArek Kusztal 	uint32_t qat_func_alignsize = cookie->qat_func_alignsize;
765fde2e2f1SArek Kusztal 	uint32_t ltrim = qat_func_alignsize - alg_bytesize;
7666c25a68aSArek Kusztal 
7676c25a68aSArek Kusztal 	asym_op->ecpm.r.x.length = alg_bytesize;
7686c25a68aSArek Kusztal 	asym_op->ecpm.r.y.length = alg_bytesize;
769002486dbSArek Kusztal 	rte_memcpy(x, &cookie->output_array[0][ltrim], alg_bytesize);
770002486dbSArek Kusztal 	rte_memcpy(y, &cookie->output_array[1][ltrim], alg_bytesize);
7716c25a68aSArek Kusztal 
7726c25a68aSArek Kusztal 	HEXDUMP("rX", cookie->output_array[0],
773fde2e2f1SArek Kusztal 		qat_func_alignsize);
7746c25a68aSArek Kusztal 	HEXDUMP("rY", cookie->output_array[1],
775fde2e2f1SArek Kusztal 		qat_func_alignsize);
7766c25a68aSArek Kusztal 	return RTE_CRYPTO_OP_STATUS_SUCCESS;
7776c25a68aSArek Kusztal }
7786c25a68aSArek Kusztal 
7796c25a68aSArek Kusztal static int
780305e1f85SArek Kusztal ecdh_set_input(struct icp_qat_fw_pke_request *qat_req,
781305e1f85SArek Kusztal 		struct qat_asym_op_cookie *cookie,
782305e1f85SArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
783305e1f85SArek Kusztal 		const struct rte_crypto_asym_xform *xform)
784305e1f85SArek Kusztal {
785305e1f85SArek Kusztal 	struct qat_asym_function qat_function;
786305e1f85SArek Kusztal 	uint32_t qat_func_alignsize, func_id;
787305e1f85SArek Kusztal 	int curve_id;
788305e1f85SArek Kusztal 
789305e1f85SArek Kusztal 	curve_id = pick_curve(xform);
790305e1f85SArek Kusztal 	if (curve_id < 0) {
791305e1f85SArek Kusztal 		QAT_LOG(DEBUG, "Incorrect elliptic curve");
792305e1f85SArek Kusztal 		return -EINVAL;
793305e1f85SArek Kusztal 	}
794305e1f85SArek Kusztal 
795305e1f85SArek Kusztal 	qat_function = get_ecpm_function(xform);
796305e1f85SArek Kusztal 	func_id = qat_function.func_id;
797305e1f85SArek Kusztal 	if (func_id == 0) {
798305e1f85SArek Kusztal 		QAT_LOG(ERR, "Cannot obtain functionality id");
799305e1f85SArek Kusztal 		return -EINVAL;
800305e1f85SArek Kusztal 	}
801305e1f85SArek Kusztal 	qat_func_alignsize = RTE_ALIGN_CEIL(qat_function.bytesize, 8);
802305e1f85SArek Kusztal 
803305e1f85SArek Kusztal 	if (asym_op->ecdh.ke_type == RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE) {
804305e1f85SArek Kusztal 		SET_PKE_LN(asym_op->ecdh.priv_key, qat_func_alignsize, 0);
805305e1f85SArek Kusztal 		SET_PKE_LN_EC(curve[curve_id], x, 1);
806305e1f85SArek Kusztal 		SET_PKE_LN_EC(curve[curve_id], y, 2);
807305e1f85SArek Kusztal 	} else {
808305e1f85SArek Kusztal 		SET_PKE_LN(asym_op->ecdh.priv_key, qat_func_alignsize, 0);
809305e1f85SArek Kusztal 		SET_PKE_LN(asym_op->ecdh.pub_key.x, qat_func_alignsize, 1);
810305e1f85SArek Kusztal 		SET_PKE_LN(asym_op->ecdh.pub_key.y, qat_func_alignsize, 2);
811305e1f85SArek Kusztal 	}
812305e1f85SArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], a, 3);
813305e1f85SArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], b, 4);
814305e1f85SArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], p, 5);
815305e1f85SArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], h, 6);
816305e1f85SArek Kusztal 
817305e1f85SArek Kusztal 	cookie->alg_bytesize = curve[curve_id].bytesize;
818305e1f85SArek Kusztal 	cookie->qat_func_alignsize = qat_func_alignsize;
819305e1f85SArek Kusztal 	qat_req->pke_hdr.cd_pars.func_id = func_id;
820305e1f85SArek Kusztal 	qat_req->input_param_count =
821305e1f85SArek Kusztal 			QAT_ASYM_ECPM_IN_PARAMS;
822305e1f85SArek Kusztal 	qat_req->output_param_count =
823305e1f85SArek Kusztal 			QAT_ASYM_ECPM_OUT_PARAMS;
824305e1f85SArek Kusztal 
825305e1f85SArek Kusztal 	HEXDUMP("k", cookie->input_array[0], qat_func_alignsize);
826305e1f85SArek Kusztal 	HEXDUMP("xG", cookie->input_array[1], qat_func_alignsize);
827305e1f85SArek Kusztal 	HEXDUMP("yG", cookie->input_array[2], qat_func_alignsize);
828305e1f85SArek Kusztal 	HEXDUMP("a", cookie->input_array[3], qat_func_alignsize);
829305e1f85SArek Kusztal 	HEXDUMP("b", cookie->input_array[4], qat_func_alignsize);
830305e1f85SArek Kusztal 	HEXDUMP("q", cookie->input_array[5], qat_func_alignsize);
831305e1f85SArek Kusztal 	HEXDUMP("h", cookie->input_array[6], qat_func_alignsize);
832305e1f85SArek Kusztal 
833305e1f85SArek Kusztal 	return 0;
834305e1f85SArek Kusztal }
835305e1f85SArek Kusztal 
83660fe006fSArek Kusztal static int
83760fe006fSArek Kusztal ecdh_verify_set_input(struct icp_qat_fw_pke_request *qat_req,
83860fe006fSArek Kusztal 		struct qat_asym_op_cookie *cookie,
83960fe006fSArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
84060fe006fSArek Kusztal 		const struct rte_crypto_asym_xform *xform)
84160fe006fSArek Kusztal {
84260fe006fSArek Kusztal 	struct qat_asym_function qat_function;
84360fe006fSArek Kusztal 	uint32_t qat_func_alignsize, func_id;
84460fe006fSArek Kusztal 	int curve_id;
84560fe006fSArek Kusztal 
84660fe006fSArek Kusztal 	curve_id = pick_curve(xform);
84760fe006fSArek Kusztal 	if (curve_id < 0) {
84860fe006fSArek Kusztal 		QAT_LOG(DEBUG, "Incorrect elliptic curve");
84960fe006fSArek Kusztal 		return -EINVAL;
85060fe006fSArek Kusztal 	}
85160fe006fSArek Kusztal 
85260fe006fSArek Kusztal 	qat_function = get_ec_verify_function(xform);
85360fe006fSArek Kusztal 	func_id = qat_function.func_id;
85460fe006fSArek Kusztal 	if (func_id == 0) {
85560fe006fSArek Kusztal 		QAT_LOG(ERR, "Cannot obtain functionality id");
85660fe006fSArek Kusztal 		return -EINVAL;
85760fe006fSArek Kusztal 	}
85860fe006fSArek Kusztal 	qat_func_alignsize = RTE_ALIGN_CEIL(qat_function.bytesize, 8);
85960fe006fSArek Kusztal 
86060fe006fSArek Kusztal 	SET_PKE_LN(asym_op->ecdh.pub_key.x, qat_func_alignsize, 0);
86160fe006fSArek Kusztal 	SET_PKE_LN(asym_op->ecdh.pub_key.y, qat_func_alignsize, 1);
86260fe006fSArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], p, 2);
86360fe006fSArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], a, 3);
86460fe006fSArek Kusztal 	SET_PKE_LN_EC(curve[curve_id], b, 4);
86560fe006fSArek Kusztal 
86660fe006fSArek Kusztal 	cookie->alg_bytesize = curve[curve_id].bytesize;
86760fe006fSArek Kusztal 	cookie->qat_func_alignsize = qat_func_alignsize;
86860fe006fSArek Kusztal 	qat_req->pke_hdr.cd_pars.func_id = func_id;
86960fe006fSArek Kusztal 	qat_req->input_param_count =
87060fe006fSArek Kusztal 			5;
87160fe006fSArek Kusztal 	qat_req->output_param_count =
87260fe006fSArek Kusztal 			0;
87360fe006fSArek Kusztal 
87460fe006fSArek Kusztal 	HEXDUMP("x", cookie->input_array[0], qat_func_alignsize);
87560fe006fSArek Kusztal 	HEXDUMP("y", cookie->input_array[1], qat_func_alignsize);
87660fe006fSArek Kusztal 	HEXDUMP("p", cookie->input_array[2], qat_func_alignsize);
87760fe006fSArek Kusztal 	HEXDUMP("a", cookie->input_array[3], qat_func_alignsize);
87860fe006fSArek Kusztal 	HEXDUMP("b", cookie->input_array[4], qat_func_alignsize);
87960fe006fSArek Kusztal 
88060fe006fSArek Kusztal 	return 0;
88160fe006fSArek Kusztal }
88260fe006fSArek Kusztal 
883305e1f85SArek Kusztal static uint8_t
884305e1f85SArek Kusztal ecdh_collect(struct rte_crypto_asym_op *asym_op,
885305e1f85SArek Kusztal 		const struct qat_asym_op_cookie *cookie)
886305e1f85SArek Kusztal {
887305e1f85SArek Kusztal 	uint8_t *x, *y;
888305e1f85SArek Kusztal 	uint32_t alg_bytesize = cookie->alg_bytesize;
889305e1f85SArek Kusztal 	uint32_t qat_func_alignsize = cookie->qat_func_alignsize;
890305e1f85SArek Kusztal 	uint32_t ltrim = qat_func_alignsize - alg_bytesize;
891305e1f85SArek Kusztal 
89260fe006fSArek Kusztal 	if (asym_op->ecdh.ke_type == RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY)
89360fe006fSArek Kusztal 		return RTE_CRYPTO_OP_STATUS_SUCCESS;
89460fe006fSArek Kusztal 
895305e1f85SArek Kusztal 	if (asym_op->ecdh.ke_type == RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE) {
896305e1f85SArek Kusztal 		asym_op->ecdh.pub_key.x.length = alg_bytesize;
897305e1f85SArek Kusztal 		asym_op->ecdh.pub_key.y.length = alg_bytesize;
898305e1f85SArek Kusztal 		x = asym_op->ecdh.pub_key.x.data;
899305e1f85SArek Kusztal 		y = asym_op->ecdh.pub_key.y.data;
900305e1f85SArek Kusztal 	} else {
901305e1f85SArek Kusztal 		asym_op->ecdh.shared_secret.x.length = alg_bytesize;
902305e1f85SArek Kusztal 		asym_op->ecdh.shared_secret.y.length = alg_bytesize;
903305e1f85SArek Kusztal 		x = asym_op->ecdh.shared_secret.x.data;
904305e1f85SArek Kusztal 		y = asym_op->ecdh.shared_secret.y.data;
905305e1f85SArek Kusztal 	}
906305e1f85SArek Kusztal 
907305e1f85SArek Kusztal 	rte_memcpy(x, &cookie->output_array[0][ltrim], alg_bytesize);
908305e1f85SArek Kusztal 	rte_memcpy(y, &cookie->output_array[1][ltrim], alg_bytesize);
909305e1f85SArek Kusztal 
910305e1f85SArek Kusztal 	HEXDUMP("X", cookie->output_array[0],
911305e1f85SArek Kusztal 		qat_func_alignsize);
912305e1f85SArek Kusztal 	HEXDUMP("Y", cookie->output_array[1],
913305e1f85SArek Kusztal 		qat_func_alignsize);
914305e1f85SArek Kusztal 	return RTE_CRYPTO_OP_STATUS_SUCCESS;
915305e1f85SArek Kusztal }
916305e1f85SArek Kusztal 
917305e1f85SArek Kusztal static int
918100c7010SArkadiusz Kusztal sm2_ecdsa_sign_set_input(struct icp_qat_fw_pke_request *qat_req,
919100c7010SArkadiusz Kusztal 		struct qat_asym_op_cookie *cookie,
920100c7010SArkadiusz Kusztal 		const struct rte_crypto_asym_op *asym_op,
921100c7010SArkadiusz Kusztal 		const struct rte_crypto_asym_xform *xform)
922100c7010SArkadiusz Kusztal {
923100c7010SArkadiusz Kusztal 	const struct qat_asym_function qat_function =
924100c7010SArkadiusz Kusztal 		get_sm2_ecdsa_sign_function();
925100c7010SArkadiusz Kusztal 	const uint32_t qat_func_alignsize =
926100c7010SArkadiusz Kusztal 		qat_function.bytesize;
927100c7010SArkadiusz Kusztal 
928100c7010SArkadiusz Kusztal 	SET_PKE_LN(asym_op->sm2.k, qat_func_alignsize, 0);
929100c7010SArkadiusz Kusztal 	SET_PKE_LN(asym_op->sm2.message, qat_func_alignsize, 1);
930100c7010SArkadiusz Kusztal 	SET_PKE_LN(xform->ec.pkey, qat_func_alignsize, 2);
931100c7010SArkadiusz Kusztal 
932100c7010SArkadiusz Kusztal 	cookie->alg_bytesize = qat_function.bytesize;
933100c7010SArkadiusz Kusztal 	cookie->qat_func_alignsize = qat_function.bytesize;
934100c7010SArkadiusz Kusztal 	qat_req->pke_hdr.cd_pars.func_id = qat_function.func_id;
935100c7010SArkadiusz Kusztal 	qat_req->input_param_count = 3;
936100c7010SArkadiusz Kusztal 	qat_req->output_param_count = 2;
937100c7010SArkadiusz Kusztal 
938100c7010SArkadiusz Kusztal 	return RTE_CRYPTO_OP_STATUS_SUCCESS;
939100c7010SArkadiusz Kusztal }
940100c7010SArkadiusz Kusztal 
941100c7010SArkadiusz Kusztal static int
942100c7010SArkadiusz Kusztal sm2_ecdsa_verify_set_input(struct icp_qat_fw_pke_request *qat_req,
943100c7010SArkadiusz Kusztal 		struct qat_asym_op_cookie *cookie,
944100c7010SArkadiusz Kusztal 		const struct rte_crypto_asym_op *asym_op,
945100c7010SArkadiusz Kusztal 		const struct rte_crypto_asym_xform *xform)
946100c7010SArkadiusz Kusztal {
947100c7010SArkadiusz Kusztal 	const struct qat_asym_function qat_function =
948100c7010SArkadiusz Kusztal 		get_sm2_ecdsa_verify_function();
949100c7010SArkadiusz Kusztal 	const uint32_t qat_func_alignsize =
950100c7010SArkadiusz Kusztal 		qat_function.bytesize;
951100c7010SArkadiusz Kusztal 
952100c7010SArkadiusz Kusztal 	SET_PKE_LN(asym_op->sm2.message, qat_func_alignsize, 0);
953100c7010SArkadiusz Kusztal 	SET_PKE_LN(asym_op->sm2.r, qat_func_alignsize, 1);
954100c7010SArkadiusz Kusztal 	SET_PKE_LN(asym_op->sm2.s, qat_func_alignsize, 2);
955100c7010SArkadiusz Kusztal 	SET_PKE_LN(xform->ec.q.x, qat_func_alignsize, 3);
956100c7010SArkadiusz Kusztal 	SET_PKE_LN(xform->ec.q.y, qat_func_alignsize, 4);
957100c7010SArkadiusz Kusztal 
958100c7010SArkadiusz Kusztal 	cookie->alg_bytesize = qat_function.bytesize;
959100c7010SArkadiusz Kusztal 	cookie->qat_func_alignsize = qat_function.bytesize;
960100c7010SArkadiusz Kusztal 	qat_req->pke_hdr.cd_pars.func_id = qat_function.func_id;
961100c7010SArkadiusz Kusztal 	qat_req->input_param_count = 5;
962100c7010SArkadiusz Kusztal 	qat_req->output_param_count = 0;
963100c7010SArkadiusz Kusztal 
964100c7010SArkadiusz Kusztal 	return RTE_CRYPTO_OP_STATUS_SUCCESS;
965100c7010SArkadiusz Kusztal }
966100c7010SArkadiusz Kusztal 
967100c7010SArkadiusz Kusztal static uint8_t
968100c7010SArkadiusz Kusztal sm2_ecdsa_sign_collect(struct rte_crypto_asym_op *asym_op,
969100c7010SArkadiusz Kusztal 		const struct qat_asym_op_cookie *cookie)
970100c7010SArkadiusz Kusztal {
971100c7010SArkadiusz Kusztal 	uint32_t alg_bytesize = cookie->alg_bytesize;
972100c7010SArkadiusz Kusztal 
973100c7010SArkadiusz Kusztal 	if (asym_op->sm2.op_type == RTE_CRYPTO_ASYM_OP_VERIFY)
974100c7010SArkadiusz Kusztal 		return RTE_CRYPTO_OP_STATUS_SUCCESS;
975100c7010SArkadiusz Kusztal 
976100c7010SArkadiusz Kusztal 	rte_memcpy(asym_op->sm2.r.data, cookie->output_array[0], alg_bytesize);
977100c7010SArkadiusz Kusztal 	rte_memcpy(asym_op->sm2.s.data, cookie->output_array[1], alg_bytesize);
978100c7010SArkadiusz Kusztal 	asym_op->sm2.r.length = alg_bytesize;
979100c7010SArkadiusz Kusztal 	asym_op->sm2.s.length = alg_bytesize;
980100c7010SArkadiusz Kusztal 
981100c7010SArkadiusz Kusztal 	HEXDUMP("SM2 R", cookie->output_array[0],
982100c7010SArkadiusz Kusztal 		alg_bytesize);
983100c7010SArkadiusz Kusztal 	HEXDUMP("SM2 S", cookie->output_array[1],
984100c7010SArkadiusz Kusztal 		alg_bytesize);
985100c7010SArkadiusz Kusztal 	return RTE_CRYPTO_OP_STATUS_SUCCESS;
986100c7010SArkadiusz Kusztal }
987100c7010SArkadiusz Kusztal 
988100c7010SArkadiusz Kusztal static int
989d4f17d6bSArek Kusztal asym_set_input(struct icp_qat_fw_pke_request *qat_req,
9903b78aa7bSArek Kusztal 		struct qat_asym_op_cookie *cookie,
991d4f17d6bSArek Kusztal 		const struct rte_crypto_asym_op *asym_op,
992b7bd72d8SArkadiusz Kusztal 		const struct rte_crypto_asym_xform *xform,
993b7bd72d8SArkadiusz Kusztal 		uint8_t legacy_alg)
9943b78aa7bSArek Kusztal {
9953b78aa7bSArek Kusztal 	switch (xform->xform_type) {
9963b78aa7bSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
997d4f17d6bSArek Kusztal 		return modexp_set_input(qat_req, cookie, asym_op, xform);
9983b78aa7bSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
999d4f17d6bSArek Kusztal 		return modinv_set_input(qat_req, cookie, asym_op, xform);
1000cffb726bSVikash Poddar 	case RTE_CRYPTO_ASYM_XFORM_RSA:{
1001cffb726bSVikash Poddar 		if (unlikely((xform->rsa.n.length < RSA_MODULUS_2048_BITS)
1002b7bd72d8SArkadiusz Kusztal 					&& (legacy_alg == 0)))
1003cffb726bSVikash Poddar 			return RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
1004d4f17d6bSArek Kusztal 		return rsa_set_input(qat_req, cookie, asym_op, xform);
1005cffb726bSVikash Poddar 	}
1006b5324d38SArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_ECDSA:
1007d4f17d6bSArek Kusztal 		return ecdsa_set_input(qat_req, cookie, asym_op, xform);
10086c25a68aSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_ECPM:
1009d4f17d6bSArek Kusztal 		return ecpm_set_input(qat_req, cookie, asym_op, xform);
1010305e1f85SArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_ECDH:
101160fe006fSArek Kusztal 		if (asym_op->ecdh.ke_type ==
101260fe006fSArek Kusztal 			RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY) {
101360fe006fSArek Kusztal 			return ecdh_verify_set_input(qat_req, cookie,
101460fe006fSArek Kusztal 				asym_op, xform);
101560fe006fSArek Kusztal 		} else {
1016305e1f85SArek Kusztal 			return ecdh_set_input(qat_req, cookie,
1017305e1f85SArek Kusztal 				asym_op, xform);
101860fe006fSArek Kusztal 		}
1019100c7010SArkadiusz Kusztal 	case RTE_CRYPTO_ASYM_XFORM_SM2:
1020100c7010SArkadiusz Kusztal 		if (asym_op->sm2.op_type ==
1021100c7010SArkadiusz Kusztal 			RTE_CRYPTO_ASYM_OP_VERIFY) {
1022100c7010SArkadiusz Kusztal 			return sm2_ecdsa_verify_set_input(qat_req, cookie,
1023100c7010SArkadiusz Kusztal 						asym_op, xform);
1024100c7010SArkadiusz Kusztal 		} else {
1025100c7010SArkadiusz Kusztal 			return sm2_ecdsa_sign_set_input(qat_req, cookie,
1026100c7010SArkadiusz Kusztal 					asym_op, xform);
1027100c7010SArkadiusz Kusztal 		}
10283b78aa7bSArek Kusztal 	default:
10293b78aa7bSArek Kusztal 		QAT_LOG(ERR, "Invalid/unsupported asymmetric crypto xform");
10303b78aa7bSArek Kusztal 		return -EINVAL;
10313b78aa7bSArek Kusztal 	}
10323b78aa7bSArek Kusztal 	return 1;
10333b78aa7bSArek Kusztal }
10343b78aa7bSArek Kusztal 
10353b78aa7bSArek Kusztal static int
1036b7bd72d8SArkadiusz Kusztal qat_asym_build_request(void *in_op,
1037b7bd72d8SArkadiusz Kusztal 	uint8_t *out_msg,
1038b7bd72d8SArkadiusz Kusztal 	void *op_cookie,
1039b7bd72d8SArkadiusz Kusztal 	struct qat_qp *qp)
1040f81cbc20SArek Kusztal {
1041f81cbc20SArek Kusztal 	struct rte_crypto_op *op = (struct rte_crypto_op *)in_op;
1042fb70b33bSArek Kusztal 	struct rte_crypto_asym_op *asym_op = op->asym;
1043f81cbc20SArek Kusztal 	struct icp_qat_fw_pke_request *qat_req =
1044f81cbc20SArek Kusztal 			(struct icp_qat_fw_pke_request *)out_msg;
1045f81cbc20SArek Kusztal 	struct qat_asym_op_cookie *cookie =
1046f81cbc20SArek Kusztal 			(struct qat_asym_op_cookie *)op_cookie;
1047002486dbSArek Kusztal 	struct rte_crypto_asym_xform *xform;
1048002486dbSArek Kusztal 	struct qat_asym_session *qat_session = (struct qat_asym_session *)
1049002486dbSArek Kusztal 			op->asym->session->sess_private_data;
1050e1ed5a73SArek Kusztal 	int err = 0;
1051f81cbc20SArek Kusztal 
1052fdf9cdacSArek Kusztal 	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
10533b78aa7bSArek Kusztal 	switch (op->sess_type) {
10543b78aa7bSArek Kusztal 	case RTE_CRYPTO_OP_WITH_SESSION:
1055002486dbSArek Kusztal 		request_init(qat_req);
1056521cd3f9SArek Kusztal 		if (unlikely(qat_session == NULL)) {
1057521cd3f9SArek Kusztal 			QAT_DP_LOG(ERR,
1058521cd3f9SArek Kusztal 				"Session was not created for this device");
1059521cd3f9SArek Kusztal 			op->status = RTE_CRYPTO_OP_STATUS_INVALID_SESSION;
1060521cd3f9SArek Kusztal 			goto error;
1061521cd3f9SArek Kusztal 		}
1062002486dbSArek Kusztal 		xform = &qat_session->xform;
1063002486dbSArek Kusztal 		break;
10643b78aa7bSArek Kusztal 	case RTE_CRYPTO_OP_SESSIONLESS:
10653b78aa7bSArek Kusztal 		request_init(qat_req);
1066002486dbSArek Kusztal 		xform = op->asym->xform;
10673b78aa7bSArek Kusztal 		break;
10683b78aa7bSArek Kusztal 	default:
1069e1ed5a73SArek Kusztal 		QAT_DP_LOG(ERR, "Invalid session/xform settings");
1070e1ed5a73SArek Kusztal 		op->status = RTE_CRYPTO_OP_STATUS_INVALID_SESSION;
10718245972cSArek Kusztal 		goto error;
10728245972cSArek Kusztal 	}
1073b7bd72d8SArkadiusz Kusztal 	err = asym_set_input(qat_req, cookie, asym_op, xform,
1074b7bd72d8SArkadiusz Kusztal 		qp->qat_dev->options.legacy_alg);
1075002486dbSArek Kusztal 	if (err) {
1076002486dbSArek Kusztal 		op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
1077002486dbSArek Kusztal 		goto error;
1078002486dbSArek Kusztal 	}
10798245972cSArek Kusztal 
1080e1ed5a73SArek Kusztal 	qat_req->pke_mid.opaque = (uint64_t)(uintptr_t)op;
1081e1ed5a73SArek Kusztal 	qat_req->pke_mid.src_data_addr = cookie->input_addr;
1082e1ed5a73SArek Kusztal 	qat_req->pke_mid.dest_data_addr = cookie->output_addr;
1083f81cbc20SArek Kusztal 
10843b78aa7bSArek Kusztal 	HEXDUMP("qat_req:", qat_req, sizeof(struct icp_qat_fw_pke_request));
1085e1ed5a73SArek Kusztal 
1086f81cbc20SArek Kusztal 	return 0;
1087f81cbc20SArek Kusztal error:
1088e1ed5a73SArek Kusztal 	qat_req->pke_mid.opaque = (uint64_t)(uintptr_t)op;
10893b78aa7bSArek Kusztal 	HEXDUMP("qat_req:", qat_req, sizeof(struct icp_qat_fw_pke_request));
1090f81cbc20SArek Kusztal 	qat_req->output_param_count = 0;
1091f81cbc20SArek Kusztal 	qat_req->input_param_count = 0;
1092f81cbc20SArek Kusztal 	qat_req->pke_hdr.service_type = ICP_QAT_FW_COMN_REQ_NULL;
1093fb70b33bSArek Kusztal 	cookie->error |= err;
1094f81cbc20SArek Kusztal 
1095f81cbc20SArek Kusztal 	return 0;
1096f81cbc20SArek Kusztal }
1097f81cbc20SArek Kusztal 
10983b78aa7bSArek Kusztal static uint8_t
1099002486dbSArek Kusztal qat_asym_collect_response(struct rte_crypto_op *op,
1100e1ed5a73SArek Kusztal 		struct qat_asym_op_cookie *cookie,
1101e1ed5a73SArek Kusztal 		struct rte_crypto_asym_xform *xform)
1102e1ed5a73SArek Kusztal {
1103002486dbSArek Kusztal 	struct rte_crypto_asym_op *asym_op = op->asym;
1104e1ed5a73SArek Kusztal 
11053b78aa7bSArek Kusztal 	switch (xform->xform_type) {
11063b78aa7bSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
11073b78aa7bSArek Kusztal 		return modexp_collect(asym_op, cookie, xform);
11083b78aa7bSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
11093b78aa7bSArek Kusztal 		return modinv_collect(asym_op, cookie, xform);
11103b78aa7bSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_RSA:
11118a97564bSGowrishankar Muthukrishnan 		return rsa_collect(asym_op, cookie, xform);
1112b5324d38SArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_ECDSA:
1113b5324d38SArek Kusztal 		return ecdsa_collect(asym_op, cookie);
11146c25a68aSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_ECPM:
11156c25a68aSArek Kusztal 		return ecpm_collect(asym_op, cookie);
1116305e1f85SArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_ECDH:
1117305e1f85SArek Kusztal 		return ecdh_collect(asym_op, cookie);
1118100c7010SArkadiusz Kusztal 	case RTE_CRYPTO_ASYM_XFORM_SM2:
1119100c7010SArkadiusz Kusztal 		return sm2_ecdsa_sign_collect(asym_op, cookie);
1120e2c5f4eaSArek Kusztal 	default:
11213b78aa7bSArek Kusztal 		QAT_LOG(ERR, "Not supported xform type");
11223b78aa7bSArek Kusztal 		return  RTE_CRYPTO_OP_STATUS_ERROR;
1123e2c5f4eaSArek Kusztal 	}
1124e2c5f4eaSArek Kusztal }
1125e1ed5a73SArek Kusztal 
11263b78aa7bSArek Kusztal static int
1127002486dbSArek Kusztal qat_asym_process_response(void **out_op, uint8_t *resp,
1128a2343302SKai Ji 		void *op_cookie, __rte_unused uint64_t *dequeue_err_count)
1129f81cbc20SArek Kusztal {
1130f81cbc20SArek Kusztal 	struct icp_qat_fw_pke_resp *resp_msg =
1131f81cbc20SArek Kusztal 			(struct icp_qat_fw_pke_resp *)resp;
1132002486dbSArek Kusztal 	struct rte_crypto_op *op = (struct rte_crypto_op *)(uintptr_t)
1133f81cbc20SArek Kusztal 			(resp_msg->opaque);
1134f81cbc20SArek Kusztal 	struct qat_asym_op_cookie *cookie = op_cookie;
1135fdf9cdacSArek Kusztal 	struct rte_crypto_asym_xform *xform = NULL;
1136002486dbSArek Kusztal 	struct qat_asym_session *qat_session = (struct qat_asym_session *)
1137002486dbSArek Kusztal 			op->asym->session->sess_private_data;
1138f81cbc20SArek Kusztal 
1139fdf9cdacSArek Kusztal 	*out_op = op;
1140f81cbc20SArek Kusztal 	if (cookie->error) {
1141f81cbc20SArek Kusztal 		cookie->error = 0;
1142002486dbSArek Kusztal 		if (op->status == RTE_CRYPTO_OP_STATUS_NOT_PROCESSED)
1143002486dbSArek Kusztal 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
1144fde2e2f1SArek Kusztal 		QAT_DP_LOG(DEBUG, "Cookie status returned error");
1145f81cbc20SArek Kusztal 	} else {
1146f81cbc20SArek Kusztal 		if (ICP_QAT_FW_PKE_RESP_PKE_STAT_GET(
1147f81cbc20SArek Kusztal 			resp_msg->pke_resp_hdr.resp_status.pke_resp_flags)) {
1148002486dbSArek Kusztal 			if (op->status == RTE_CRYPTO_OP_STATUS_NOT_PROCESSED)
1149002486dbSArek Kusztal 				op->status = RTE_CRYPTO_OP_STATUS_ERROR;
1150fde2e2f1SArek Kusztal 			QAT_DP_LOG(DEBUG, "Asymmetric response status"
1151e1ed5a73SArek Kusztal 					" returned error");
1152f81cbc20SArek Kusztal 		}
1153f81cbc20SArek Kusztal 		if (resp_msg->pke_resp_hdr.resp_status.comn_err_code) {
1154002486dbSArek Kusztal 			if (op->status == RTE_CRYPTO_OP_STATUS_NOT_PROCESSED)
1155002486dbSArek Kusztal 				op->status = RTE_CRYPTO_OP_STATUS_ERROR;
1156e1ed5a73SArek Kusztal 			QAT_DP_LOG(ERR, "Asymmetric common status"
1157e1ed5a73SArek Kusztal 					" returned error");
1158f81cbc20SArek Kusztal 		}
1159f81cbc20SArek Kusztal 	}
1160002486dbSArek Kusztal 
1161002486dbSArek Kusztal 	switch (op->sess_type) {
1162002486dbSArek Kusztal 	case RTE_CRYPTO_OP_WITH_SESSION:
1163002486dbSArek Kusztal 		xform = &qat_session->xform;
1164002486dbSArek Kusztal 		break;
1165002486dbSArek Kusztal 	case RTE_CRYPTO_OP_SESSIONLESS:
1166002486dbSArek Kusztal 		xform = op->asym->xform;
1167002486dbSArek Kusztal 		break;
1168002486dbSArek Kusztal 	default:
1169002486dbSArek Kusztal 		QAT_DP_LOG(ERR,
1170002486dbSArek Kusztal 			"Invalid session/xform settings in response ring!");
1171fdf9cdacSArek Kusztal 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
1172fb70b33bSArek Kusztal 	}
1173fdf9cdacSArek Kusztal 	if (op->status == RTE_CRYPTO_OP_STATUS_NOT_PROCESSED)
1174fdf9cdacSArek Kusztal 		op->status = qat_asym_collect_response(op, cookie, xform);
11753b78aa7bSArek Kusztal 	HEXDUMP("resp_msg:", resp_msg, sizeof(struct icp_qat_fw_pke_resp));
1176fdf9cdacSArek Kusztal 	if (likely(xform != NULL))
1177fdf9cdacSArek Kusztal 		cleanup(cookie, xform);
1178a2343302SKai Ji 
1179a2343302SKai Ji 	return 1;
1180f81cbc20SArek Kusztal }
1181f81cbc20SArek Kusztal 
1182002486dbSArek Kusztal static int
1183002486dbSArek Kusztal session_set_modexp(struct qat_asym_session *qat_session,
1184002486dbSArek Kusztal 			struct rte_crypto_asym_xform *xform)
1185002486dbSArek Kusztal {
1186002486dbSArek Kusztal 	uint8_t *modulus = xform->modex.modulus.data;
1187002486dbSArek Kusztal 	uint8_t *exponent = xform->modex.exponent.data;
1188002486dbSArek Kusztal 
1189002486dbSArek Kusztal 	qat_session->xform.modex.modulus.data =
1190002486dbSArek Kusztal 		rte_malloc(NULL, xform->modex.modulus.length, 0);
1191002486dbSArek Kusztal 	if (qat_session->xform.modex.modulus.data == NULL)
1192002486dbSArek Kusztal 		return -ENOMEM;
1193002486dbSArek Kusztal 	qat_session->xform.modex.modulus.length = xform->modex.modulus.length;
1194002486dbSArek Kusztal 	qat_session->xform.modex.exponent.data = rte_malloc(NULL,
1195002486dbSArek Kusztal 				xform->modex.exponent.length, 0);
1196002486dbSArek Kusztal 	if (qat_session->xform.modex.exponent.data == NULL) {
1197002486dbSArek Kusztal 		rte_free(qat_session->xform.modex.exponent.data);
1198002486dbSArek Kusztal 		return -ENOMEM;
1199002486dbSArek Kusztal 	}
1200002486dbSArek Kusztal 	qat_session->xform.modex.exponent.length = xform->modex.exponent.length;
1201002486dbSArek Kusztal 
1202002486dbSArek Kusztal 	rte_memcpy(qat_session->xform.modex.modulus.data, modulus,
1203002486dbSArek Kusztal 			xform->modex.modulus.length);
1204002486dbSArek Kusztal 	rte_memcpy(qat_session->xform.modex.exponent.data, exponent,
1205002486dbSArek Kusztal 			xform->modex.exponent.length);
1206002486dbSArek Kusztal 
1207002486dbSArek Kusztal 	return 0;
1208002486dbSArek Kusztal }
1209002486dbSArek Kusztal 
1210002486dbSArek Kusztal static int
1211002486dbSArek Kusztal session_set_modinv(struct qat_asym_session *qat_session,
1212002486dbSArek Kusztal 			struct rte_crypto_asym_xform *xform)
1213002486dbSArek Kusztal {
1214002486dbSArek Kusztal 	uint8_t *modulus = xform->modinv.modulus.data;
1215002486dbSArek Kusztal 
1216002486dbSArek Kusztal 	qat_session->xform.modinv.modulus.data =
1217002486dbSArek Kusztal 		rte_malloc(NULL, xform->modinv.modulus.length, 0);
1218002486dbSArek Kusztal 	if (qat_session->xform.modinv.modulus.data == NULL)
1219002486dbSArek Kusztal 		return -ENOMEM;
1220002486dbSArek Kusztal 	qat_session->xform.modinv.modulus.length = xform->modinv.modulus.length;
1221002486dbSArek Kusztal 
1222002486dbSArek Kusztal 	rte_memcpy(qat_session->xform.modinv.modulus.data, modulus,
1223002486dbSArek Kusztal 			xform->modinv.modulus.length);
1224002486dbSArek Kusztal 
1225002486dbSArek Kusztal 	return 0;
1226002486dbSArek Kusztal }
1227002486dbSArek Kusztal 
1228002486dbSArek Kusztal static int
1229002486dbSArek Kusztal session_set_rsa(struct qat_asym_session *qat_session,
1230002486dbSArek Kusztal 			struct rte_crypto_asym_xform *xform)
1231002486dbSArek Kusztal {
1232002486dbSArek Kusztal 	uint8_t *n = xform->rsa.n.data;
1233002486dbSArek Kusztal 	uint8_t *e = xform->rsa.e.data;
1234002486dbSArek Kusztal 	int ret = 0;
1235002486dbSArek Kusztal 
1236002486dbSArek Kusztal 	qat_session->xform.rsa.key_type = xform->rsa.key_type;
1237002486dbSArek Kusztal 
1238002486dbSArek Kusztal 	qat_session->xform.rsa.n.data =
1239002486dbSArek Kusztal 		rte_malloc(NULL, xform->rsa.n.length, 0);
1240002486dbSArek Kusztal 	if (qat_session->xform.rsa.n.data == NULL)
1241002486dbSArek Kusztal 		return -ENOMEM;
1242002486dbSArek Kusztal 	qat_session->xform.rsa.n.length =
1243002486dbSArek Kusztal 		xform->rsa.n.length;
1244002486dbSArek Kusztal 
1245002486dbSArek Kusztal 	qat_session->xform.rsa.e.data =
1246002486dbSArek Kusztal 		rte_malloc(NULL, xform->rsa.e.length, 0);
1247002486dbSArek Kusztal 	if (qat_session->xform.rsa.e.data == NULL) {
1248002486dbSArek Kusztal 		ret = -ENOMEM;
1249002486dbSArek Kusztal 		goto err;
1250002486dbSArek Kusztal 	}
1251002486dbSArek Kusztal 	qat_session->xform.rsa.e.length =
1252002486dbSArek Kusztal 		xform->rsa.e.length;
1253002486dbSArek Kusztal 
1254002486dbSArek Kusztal 	if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_QT) {
1255002486dbSArek Kusztal 		uint8_t *p = xform->rsa.qt.p.data;
1256002486dbSArek Kusztal 		uint8_t *q = xform->rsa.qt.q.data;
1257002486dbSArek Kusztal 		uint8_t *dP = xform->rsa.qt.dP.data;
1258002486dbSArek Kusztal 		uint8_t *dQ = xform->rsa.qt.dQ.data;
1259002486dbSArek Kusztal 		uint8_t *qInv = xform->rsa.qt.qInv.data;
1260002486dbSArek Kusztal 
1261002486dbSArek Kusztal 		qat_session->xform.rsa.qt.p.data =
1262002486dbSArek Kusztal 			rte_malloc(NULL, xform->rsa.qt.p.length, 0);
1263002486dbSArek Kusztal 		if (qat_session->xform.rsa.qt.p.data == NULL) {
1264002486dbSArek Kusztal 			ret = -ENOMEM;
1265002486dbSArek Kusztal 			goto err;
1266002486dbSArek Kusztal 		}
1267002486dbSArek Kusztal 		qat_session->xform.rsa.qt.p.length =
1268002486dbSArek Kusztal 			xform->rsa.qt.p.length;
1269002486dbSArek Kusztal 
1270002486dbSArek Kusztal 		qat_session->xform.rsa.qt.q.data =
1271002486dbSArek Kusztal 			rte_malloc(NULL, xform->rsa.qt.q.length, 0);
1272002486dbSArek Kusztal 		if (qat_session->xform.rsa.qt.q.data == NULL) {
1273002486dbSArek Kusztal 			ret = -ENOMEM;
1274002486dbSArek Kusztal 			goto err;
1275002486dbSArek Kusztal 		}
1276002486dbSArek Kusztal 		qat_session->xform.rsa.qt.q.length =
1277002486dbSArek Kusztal 			xform->rsa.qt.q.length;
1278002486dbSArek Kusztal 
1279002486dbSArek Kusztal 		qat_session->xform.rsa.qt.dP.data =
1280002486dbSArek Kusztal 			rte_malloc(NULL, xform->rsa.qt.dP.length, 0);
1281002486dbSArek Kusztal 		if (qat_session->xform.rsa.qt.dP.data == NULL) {
1282002486dbSArek Kusztal 			ret = -ENOMEM;
1283002486dbSArek Kusztal 			goto err;
1284002486dbSArek Kusztal 		}
1285002486dbSArek Kusztal 		qat_session->xform.rsa.qt.dP.length =
1286002486dbSArek Kusztal 			xform->rsa.qt.dP.length;
1287002486dbSArek Kusztal 
1288002486dbSArek Kusztal 		qat_session->xform.rsa.qt.dQ.data =
1289002486dbSArek Kusztal 			rte_malloc(NULL, xform->rsa.qt.dQ.length, 0);
1290002486dbSArek Kusztal 		if (qat_session->xform.rsa.qt.dQ.data == NULL) {
1291002486dbSArek Kusztal 			ret = -ENOMEM;
1292002486dbSArek Kusztal 			goto err;
1293002486dbSArek Kusztal 		}
1294002486dbSArek Kusztal 		qat_session->xform.rsa.qt.dQ.length =
1295002486dbSArek Kusztal 			xform->rsa.qt.dQ.length;
1296002486dbSArek Kusztal 
1297002486dbSArek Kusztal 		qat_session->xform.rsa.qt.qInv.data =
1298002486dbSArek Kusztal 			rte_malloc(NULL, xform->rsa.qt.qInv.length, 0);
1299002486dbSArek Kusztal 		if (qat_session->xform.rsa.qt.qInv.data == NULL) {
1300002486dbSArek Kusztal 			ret = -ENOMEM;
1301002486dbSArek Kusztal 			goto err;
1302002486dbSArek Kusztal 		}
1303002486dbSArek Kusztal 		qat_session->xform.rsa.qt.qInv.length =
1304002486dbSArek Kusztal 			xform->rsa.qt.qInv.length;
1305002486dbSArek Kusztal 
1306002486dbSArek Kusztal 		rte_memcpy(qat_session->xform.rsa.qt.p.data, p,
1307002486dbSArek Kusztal 				xform->rsa.qt.p.length);
1308002486dbSArek Kusztal 		rte_memcpy(qat_session->xform.rsa.qt.q.data, q,
1309002486dbSArek Kusztal 				xform->rsa.qt.q.length);
1310002486dbSArek Kusztal 		rte_memcpy(qat_session->xform.rsa.qt.dP.data, dP,
1311002486dbSArek Kusztal 				xform->rsa.qt.dP.length);
1312002486dbSArek Kusztal 		rte_memcpy(qat_session->xform.rsa.qt.dQ.data, dQ,
1313002486dbSArek Kusztal 				xform->rsa.qt.dQ.length);
1314002486dbSArek Kusztal 		rte_memcpy(qat_session->xform.rsa.qt.qInv.data, qInv,
1315002486dbSArek Kusztal 				xform->rsa.qt.qInv.length);
1316002486dbSArek Kusztal 
1317002486dbSArek Kusztal 	} else {
1318002486dbSArek Kusztal 		uint8_t *d = xform->rsa.d.data;
1319002486dbSArek Kusztal 
1320002486dbSArek Kusztal 		qat_session->xform.rsa.d.data =
1321002486dbSArek Kusztal 			rte_malloc(NULL, xform->rsa.d.length, 0);
1322002486dbSArek Kusztal 		if (qat_session->xform.rsa.d.data == NULL) {
1323002486dbSArek Kusztal 			ret = -ENOMEM;
1324002486dbSArek Kusztal 			goto err;
1325002486dbSArek Kusztal 		}
1326002486dbSArek Kusztal 		qat_session->xform.rsa.d.length =
1327002486dbSArek Kusztal 			xform->rsa.d.length;
1328002486dbSArek Kusztal 		rte_memcpy(qat_session->xform.rsa.d.data, d,
1329002486dbSArek Kusztal 			xform->rsa.d.length);
1330002486dbSArek Kusztal 	}
1331002486dbSArek Kusztal 
1332002486dbSArek Kusztal 	rte_memcpy(qat_session->xform.rsa.n.data, n,
1333002486dbSArek Kusztal 		xform->rsa.n.length);
1334002486dbSArek Kusztal 	rte_memcpy(qat_session->xform.rsa.e.data, e,
1335002486dbSArek Kusztal 		xform->rsa.e.length);
1336002486dbSArek Kusztal 
1337002486dbSArek Kusztal 	return 0;
1338002486dbSArek Kusztal 
1339002486dbSArek Kusztal err:
1340002486dbSArek Kusztal 	rte_free(qat_session->xform.rsa.n.data);
1341002486dbSArek Kusztal 	rte_free(qat_session->xform.rsa.e.data);
1342002486dbSArek Kusztal 	rte_free(qat_session->xform.rsa.d.data);
1343002486dbSArek Kusztal 	rte_free(qat_session->xform.rsa.qt.p.data);
1344002486dbSArek Kusztal 	rte_free(qat_session->xform.rsa.qt.q.data);
1345002486dbSArek Kusztal 	rte_free(qat_session->xform.rsa.qt.dP.data);
1346002486dbSArek Kusztal 	rte_free(qat_session->xform.rsa.qt.dQ.data);
1347002486dbSArek Kusztal 	rte_free(qat_session->xform.rsa.qt.qInv.data);
1348002486dbSArek Kusztal 	return ret;
1349002486dbSArek Kusztal }
1350002486dbSArek Kusztal 
1351*20e633b0SArkadiusz Kusztal static int
1352305e1f85SArek Kusztal session_set_ec(struct qat_asym_session *qat_session,
1353002486dbSArek Kusztal 			struct rte_crypto_asym_xform *xform)
1354002486dbSArek Kusztal {
1355*20e633b0SArkadiusz Kusztal 	uint8_t *pkey = xform->ec.pkey.data;
1356*20e633b0SArkadiusz Kusztal 	uint8_t *q_x = xform->ec.q.x.data;
1357*20e633b0SArkadiusz Kusztal 	uint8_t *q_y = xform->ec.q.y.data;
1358*20e633b0SArkadiusz Kusztal 
1359*20e633b0SArkadiusz Kusztal 	qat_session->xform.ec.pkey.data =
1360*20e633b0SArkadiusz Kusztal 		rte_malloc(NULL, xform->ec.pkey.length, 0);
1361*20e633b0SArkadiusz Kusztal 	if (qat_session->xform.ec.pkey.length &&
1362*20e633b0SArkadiusz Kusztal 		qat_session->xform.ec.pkey.data == NULL)
1363*20e633b0SArkadiusz Kusztal 		return -ENOMEM;
1364*20e633b0SArkadiusz Kusztal 	qat_session->xform.ec.q.x.data = rte_malloc(NULL,
1365*20e633b0SArkadiusz Kusztal 		xform->ec.q.x.length, 0);
1366*20e633b0SArkadiusz Kusztal 	if (qat_session->xform.ec.q.x.length &&
1367*20e633b0SArkadiusz Kusztal 		qat_session->xform.ec.q.x.data == NULL) {
1368*20e633b0SArkadiusz Kusztal 		rte_free(qat_session->xform.ec.pkey.data);
1369*20e633b0SArkadiusz Kusztal 		return -ENOMEM;
1370*20e633b0SArkadiusz Kusztal 	}
1371*20e633b0SArkadiusz Kusztal 	qat_session->xform.ec.q.y.data = rte_malloc(NULL,
1372*20e633b0SArkadiusz Kusztal 		xform->ec.q.y.length, 0);
1373*20e633b0SArkadiusz Kusztal 	if (qat_session->xform.ec.q.y.length &&
1374*20e633b0SArkadiusz Kusztal 		qat_session->xform.ec.q.y.data == NULL) {
1375*20e633b0SArkadiusz Kusztal 		rte_free(qat_session->xform.ec.pkey.data);
1376*20e633b0SArkadiusz Kusztal 		rte_free(qat_session->xform.ec.q.x.data);
1377*20e633b0SArkadiusz Kusztal 		return -ENOMEM;
1378*20e633b0SArkadiusz Kusztal 	}
1379*20e633b0SArkadiusz Kusztal 
1380*20e633b0SArkadiusz Kusztal 	memcpy(qat_session->xform.ec.pkey.data, pkey,
1381*20e633b0SArkadiusz Kusztal 		xform->ec.pkey.length);
1382*20e633b0SArkadiusz Kusztal 	qat_session->xform.ec.pkey.length = xform->ec.pkey.length;
1383*20e633b0SArkadiusz Kusztal 	memcpy(qat_session->xform.ec.q.x.data, q_x,
1384*20e633b0SArkadiusz Kusztal 		xform->ec.q.x.length);
1385*20e633b0SArkadiusz Kusztal 	qat_session->xform.ec.q.x.length = xform->ec.q.x.length;
1386*20e633b0SArkadiusz Kusztal 	memcpy(qat_session->xform.ec.q.y.data, q_y,
1387*20e633b0SArkadiusz Kusztal 		xform->ec.q.y.length);
1388*20e633b0SArkadiusz Kusztal 	qat_session->xform.ec.q.y.length = xform->ec.q.y.length;
1389002486dbSArek Kusztal 	qat_session->xform.ec.curve_id = xform->ec.curve_id;
1390*20e633b0SArkadiusz Kusztal 
1391*20e633b0SArkadiusz Kusztal 	return 0;
1392*20e633b0SArkadiusz Kusztal 
1393002486dbSArek Kusztal }
1394002486dbSArek Kusztal 
1395f81cbc20SArek Kusztal int
13961f1e4b7cSCiara Power qat_asym_session_configure(struct rte_cryptodev *dev __rte_unused,
1397002486dbSArek Kusztal 		struct rte_crypto_asym_xform *xform,
1398002486dbSArek Kusztal 		struct rte_cryptodev_asym_session *session)
1399f81cbc20SArek Kusztal {
1400b7bd72d8SArkadiusz Kusztal 	struct qat_cryptodev_private *crypto_qat;
1401002486dbSArek Kusztal 	struct qat_asym_session *qat_session;
1402002486dbSArek Kusztal 	int ret = 0;
1403002486dbSArek Kusztal 
1404b7bd72d8SArkadiusz Kusztal 	crypto_qat = dev->data->dev_private;
1405002486dbSArek Kusztal 	qat_session = (struct qat_asym_session *) session->sess_private_data;
1406002486dbSArek Kusztal 	memset(qat_session, 0, sizeof(*qat_session));
1407002486dbSArek Kusztal 
1408002486dbSArek Kusztal 	qat_session->xform.xform_type = xform->xform_type;
1409002486dbSArek Kusztal 	switch (xform->xform_type) {
1410002486dbSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
1411002486dbSArek Kusztal 		ret = session_set_modexp(qat_session, xform);
1412002486dbSArek Kusztal 		break;
1413002486dbSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
1414002486dbSArek Kusztal 		ret = session_set_modinv(qat_session, xform);
1415002486dbSArek Kusztal 		break;
1416cffb726bSVikash Poddar 	case RTE_CRYPTO_ASYM_XFORM_RSA: {
1417cffb726bSVikash Poddar 		if (unlikely((xform->rsa.n.length < RSA_MODULUS_2048_BITS)
1418b7bd72d8SArkadiusz Kusztal 				&& (crypto_qat->qat_dev->options.legacy_alg == 0))) {
1419cffb726bSVikash Poddar 			ret = -ENOTSUP;
1420cffb726bSVikash Poddar 			return ret;
1421cffb726bSVikash Poddar 		}
1422002486dbSArek Kusztal 		ret = session_set_rsa(qat_session, xform);
1423cffb726bSVikash Poddar 		}
1424002486dbSArek Kusztal 		break;
1425002486dbSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_ECDSA:
1426002486dbSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_ECPM:
1427305e1f85SArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_ECDH:
1428*20e633b0SArkadiusz Kusztal 		ret = session_set_ec(qat_session, xform);
1429002486dbSArek Kusztal 		break;
1430100c7010SArkadiusz Kusztal 	case RTE_CRYPTO_ASYM_XFORM_SM2:
1431100c7010SArkadiusz Kusztal 		break;
1432002486dbSArek Kusztal 	default:
1433002486dbSArek Kusztal 		ret = -ENOTSUP;
1434002486dbSArek Kusztal 	}
1435002486dbSArek Kusztal 
1436002486dbSArek Kusztal 	if (ret) {
1437002486dbSArek Kusztal 		QAT_LOG(ERR, "Unsupported xform type");
1438002486dbSArek Kusztal 		return ret;
1439002486dbSArek Kusztal 	}
1440002486dbSArek Kusztal 
1441002486dbSArek Kusztal 	return 0;
1442fb70b33bSArek Kusztal }
1443e1ed5a73SArek Kusztal 
14443b78aa7bSArek Kusztal unsigned int
14453b78aa7bSArek Kusztal qat_asym_session_get_private_size(struct rte_cryptodev *dev __rte_unused)
14463b78aa7bSArek Kusztal {
1447002486dbSArek Kusztal 	return RTE_ALIGN_CEIL(sizeof(struct qat_asym_session), 8);
1448002486dbSArek Kusztal }
1449002486dbSArek Kusztal 
1450002486dbSArek Kusztal static void
1451002486dbSArek Kusztal session_clear_modexp(struct rte_crypto_modex_xform *modex)
1452002486dbSArek Kusztal {
1453841cea1cSArek Kusztal 	PARAM_CLR(modex->modulus);
1454841cea1cSArek Kusztal 	PARAM_CLR(modex->exponent);
1455002486dbSArek Kusztal }
1456002486dbSArek Kusztal 
1457002486dbSArek Kusztal static void
1458002486dbSArek Kusztal session_clear_modinv(struct rte_crypto_modinv_xform *modinv)
1459002486dbSArek Kusztal {
1460841cea1cSArek Kusztal 	PARAM_CLR(modinv->modulus);
1461002486dbSArek Kusztal }
1462002486dbSArek Kusztal 
1463002486dbSArek Kusztal static void
1464002486dbSArek Kusztal session_clear_rsa(struct rte_crypto_rsa_xform *rsa)
1465002486dbSArek Kusztal {
1466841cea1cSArek Kusztal 	PARAM_CLR(rsa->n);
1467841cea1cSArek Kusztal 	PARAM_CLR(rsa->e);
1468002486dbSArek Kusztal 	if (rsa->key_type == RTE_RSA_KEY_TYPE_EXP) {
1469841cea1cSArek Kusztal 		PARAM_CLR(rsa->d);
1470002486dbSArek Kusztal 	} else {
1471841cea1cSArek Kusztal 		PARAM_CLR(rsa->qt.p);
1472841cea1cSArek Kusztal 		PARAM_CLR(rsa->qt.q);
1473841cea1cSArek Kusztal 		PARAM_CLR(rsa->qt.dP);
1474841cea1cSArek Kusztal 		PARAM_CLR(rsa->qt.dQ);
1475841cea1cSArek Kusztal 		PARAM_CLR(rsa->qt.qInv);
1476002486dbSArek Kusztal 	}
1477002486dbSArek Kusztal }
1478002486dbSArek Kusztal 
1479002486dbSArek Kusztal static void
1480002486dbSArek Kusztal session_clear_xform(struct qat_asym_session *qat_session)
1481002486dbSArek Kusztal {
1482002486dbSArek Kusztal 	switch (qat_session->xform.xform_type) {
1483002486dbSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
1484002486dbSArek Kusztal 		session_clear_modexp(&qat_session->xform.modex);
1485002486dbSArek Kusztal 		break;
1486002486dbSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
1487002486dbSArek Kusztal 		session_clear_modinv(&qat_session->xform.modinv);
1488002486dbSArek Kusztal 		break;
1489002486dbSArek Kusztal 	case RTE_CRYPTO_ASYM_XFORM_RSA:
1490002486dbSArek Kusztal 		session_clear_rsa(&qat_session->xform.rsa);
1491002486dbSArek Kusztal 		break;
1492002486dbSArek Kusztal 	default:
1493002486dbSArek Kusztal 		break;
1494002486dbSArek Kusztal 	}
1495f81cbc20SArek Kusztal }
1496f81cbc20SArek Kusztal 
1497f81cbc20SArek Kusztal void
1498002486dbSArek Kusztal qat_asym_session_clear(struct rte_cryptodev *dev,
1499002486dbSArek Kusztal 		struct rte_cryptodev_asym_session *session)
1500f81cbc20SArek Kusztal {
1501002486dbSArek Kusztal 	void *sess_priv = session->sess_private_data;
1502002486dbSArek Kusztal 	struct qat_asym_session *qat_session =
1503002486dbSArek Kusztal 		(struct qat_asym_session *)sess_priv;
1504002486dbSArek Kusztal 
1505002486dbSArek Kusztal 	if (sess_priv) {
1506002486dbSArek Kusztal 		session_clear_xform(qat_session);
1507002486dbSArek Kusztal 		memset(qat_session, 0, qat_asym_session_get_private_size(dev));
1508002486dbSArek Kusztal 	}
1509f81cbc20SArek Kusztal }
1510a2343302SKai Ji 
15112becec6bSKai Ji static uint16_t
15122becec6bSKai Ji qat_asym_crypto_enqueue_op_burst(void *qp, struct rte_crypto_op **ops,
15132becec6bSKai Ji 		uint16_t nb_ops)
15142becec6bSKai Ji {
15152becec6bSKai Ji 	return qat_enqueue_op_burst(qp, qat_asym_build_request, (void **)ops,
15162becec6bSKai Ji 			nb_ops);
15172becec6bSKai Ji }
15182becec6bSKai Ji 
15192becec6bSKai Ji static uint16_t
15202becec6bSKai Ji qat_asym_crypto_dequeue_op_burst(void *qp, struct rte_crypto_op **ops,
15212becec6bSKai Ji 		uint16_t nb_ops)
15222becec6bSKai Ji {
15232becec6bSKai Ji 	return qat_dequeue_op_burst(qp, (void **)ops, qat_asym_process_response,
15242becec6bSKai Ji 				nb_ops);
15252becec6bSKai Ji }
15262becec6bSKai Ji 
15273b78aa7bSArek Kusztal void
15283b78aa7bSArek Kusztal qat_asym_init_op_cookie(void *op_cookie)
15293b78aa7bSArek Kusztal {
15303b78aa7bSArek Kusztal 	int j;
15313b78aa7bSArek Kusztal 	struct qat_asym_op_cookie *cookie = op_cookie;
15323b78aa7bSArek Kusztal 
15333b78aa7bSArek Kusztal 	cookie->input_addr = rte_mempool_virt2iova(cookie) +
15343b78aa7bSArek Kusztal 			offsetof(struct qat_asym_op_cookie,
15353b78aa7bSArek Kusztal 					input_params_ptrs);
15363b78aa7bSArek Kusztal 
15373b78aa7bSArek Kusztal 	cookie->output_addr = rte_mempool_virt2iova(cookie) +
15383b78aa7bSArek Kusztal 			offsetof(struct qat_asym_op_cookie,
15393b78aa7bSArek Kusztal 					output_params_ptrs);
15403b78aa7bSArek Kusztal 
15413b78aa7bSArek Kusztal 	for (j = 0; j < 8; j++) {
15423b78aa7bSArek Kusztal 		cookie->input_params_ptrs[j] =
15433b78aa7bSArek Kusztal 				rte_mempool_virt2iova(cookie) +
15443b78aa7bSArek Kusztal 				offsetof(struct qat_asym_op_cookie,
15453b78aa7bSArek Kusztal 						input_array[j]);
15463b78aa7bSArek Kusztal 		cookie->output_params_ptrs[j] =
15473b78aa7bSArek Kusztal 				rte_mempool_virt2iova(cookie) +
15483b78aa7bSArek Kusztal 				offsetof(struct qat_asym_op_cookie,
15493b78aa7bSArek Kusztal 						output_array[j]);
15503b78aa7bSArek Kusztal 	}
15513b78aa7bSArek Kusztal }
15523b78aa7bSArek Kusztal 
1553477d7d05SArkadiusz Kusztal static int
155499ab2806SArkadiusz Kusztal qat_asym_dev_create(struct qat_pci_device *qat_pci_dev)
15552becec6bSKai Ji {
15562becec6bSKai Ji 	struct qat_cryptodev_private *internals;
15572becec6bSKai Ji 	struct rte_cryptodev *cryptodev;
15582becec6bSKai Ji 	struct qat_device_info *qat_dev_instance =
15592becec6bSKai Ji 		&qat_pci_devs[qat_pci_dev->qat_dev_id];
15602becec6bSKai Ji 	struct rte_cryptodev_pmd_init_params init_params = {
15612becec6bSKai Ji 		.name = "",
15622becec6bSKai Ji 		.socket_id = qat_dev_instance->pci_dev->device.numa_node,
15632becec6bSKai Ji 		.private_data_size = sizeof(struct qat_cryptodev_private)
15642becec6bSKai Ji 	};
15652becec6bSKai Ji 	const struct qat_crypto_gen_dev_ops *gen_dev_ops =
15662becec6bSKai Ji 		&qat_asym_gen_dev_ops[qat_pci_dev->qat_dev_gen];
15672becec6bSKai Ji 	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
15682becec6bSKai Ji 	char capa_memz_name[RTE_CRYPTODEV_NAME_MAX_LEN];
15692e98e808SArkadiusz Kusztal 	uint16_t sub_id = qat_dev_instance->pci_dev->id.subsystem_device_id;
157099ab2806SArkadiusz Kusztal 	char *cmdline = NULL;
15712becec6bSKai Ji 
15722becec6bSKai Ji 	snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s",
15732becec6bSKai Ji 			qat_pci_dev->name, "asym");
1574f665790aSDavid Marchand 	QAT_LOG(DEBUG, "Creating QAT ASYM device %s", name);
15752becec6bSKai Ji 
15762e98e808SArkadiusz Kusztal 	if (qat_pci_dev->qat_dev_gen == QAT_VQAT &&
15772e98e808SArkadiusz Kusztal 		sub_id != ADF_VQAT_ASYM_PCI_SUBSYSTEM_ID) {
15782e98e808SArkadiusz Kusztal 		QAT_LOG(ERR, "Device (vqat instance) %s does not support asymmetric crypto",
15792e98e808SArkadiusz Kusztal 				name);
15802e98e808SArkadiusz Kusztal 		return -EFAULT;
15812e98e808SArkadiusz Kusztal 	}
15822becec6bSKai Ji 	if (gen_dev_ops->cryptodev_ops == NULL) {
15832becec6bSKai Ji 		QAT_LOG(ERR, "Device %s does not support asymmetric crypto",
15842becec6bSKai Ji 				name);
15852becec6bSKai Ji 		return -(EFAULT);
15862becec6bSKai Ji 	}
15872becec6bSKai Ji 
15882becec6bSKai Ji 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
15892becec6bSKai Ji 		qat_pci_dev->qat_asym_driver_id =
15902becec6bSKai Ji 				qat_asym_driver_id;
15912becec6bSKai Ji 	} else if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
15922becec6bSKai Ji 		if (qat_pci_dev->qat_asym_driver_id !=
15932becec6bSKai Ji 				qat_asym_driver_id) {
15942becec6bSKai Ji 			QAT_LOG(ERR,
15952becec6bSKai Ji 				"Device %s have different driver id than corresponding device in primary process",
15962becec6bSKai Ji 				name);
15972becec6bSKai Ji 			return -(EFAULT);
15982becec6bSKai Ji 		}
15992becec6bSKai Ji 	}
16002becec6bSKai Ji 
16012becec6bSKai Ji 	/* Populate subset device to use in cryptodev device creation */
16022becec6bSKai Ji 	qat_dev_instance->asym_rte_dev.driver = &cryptodev_qat_asym_driver;
16032becec6bSKai Ji 	qat_dev_instance->asym_rte_dev.numa_node =
16042becec6bSKai Ji 			qat_dev_instance->pci_dev->device.numa_node;
16052becec6bSKai Ji 	qat_dev_instance->asym_rte_dev.devargs = NULL;
16062becec6bSKai Ji 
16072becec6bSKai Ji 	cryptodev = rte_cryptodev_pmd_create(name,
16082becec6bSKai Ji 			&(qat_dev_instance->asym_rte_dev), &init_params);
16092becec6bSKai Ji 
16102becec6bSKai Ji 	if (cryptodev == NULL)
16112becec6bSKai Ji 		return -ENODEV;
16122becec6bSKai Ji 
16132becec6bSKai Ji 	qat_dev_instance->asym_rte_dev.name = cryptodev->data->name;
16142becec6bSKai Ji 	cryptodev->driver_id = qat_asym_driver_id;
16152becec6bSKai Ji 	cryptodev->dev_ops = gen_dev_ops->cryptodev_ops;
16162becec6bSKai Ji 
16172becec6bSKai Ji 	cryptodev->enqueue_burst = qat_asym_crypto_enqueue_op_burst;
16182becec6bSKai Ji 	cryptodev->dequeue_burst = qat_asym_crypto_dequeue_op_burst;
16192becec6bSKai Ji 
16202becec6bSKai Ji 	cryptodev->feature_flags = gen_dev_ops->get_feature_flags(qat_pci_dev);
16212becec6bSKai Ji 
16222becec6bSKai Ji 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
16232becec6bSKai Ji 		return 0;
16242becec6bSKai Ji 
16252becec6bSKai Ji 	snprintf(capa_memz_name, RTE_CRYPTODEV_NAME_MAX_LEN,
16262becec6bSKai Ji 			"QAT_ASYM_CAPA_GEN_%d",
16272becec6bSKai Ji 			qat_pci_dev->qat_dev_gen);
16282becec6bSKai Ji 
16292becec6bSKai Ji 	internals = cryptodev->data->dev_private;
16302becec6bSKai Ji 	internals->qat_dev = qat_pci_dev;
16312becec6bSKai Ji 	internals->dev_id = cryptodev->data->dev_id;
16322becec6bSKai Ji 
163399ab2806SArkadiusz Kusztal 	cmdline = qat_dev_cmdline_get_val(qat_pci_dev,
163499ab2806SArkadiusz Kusztal 			ASYM_ENQ_THRESHOLD_NAME);
163599ab2806SArkadiusz Kusztal 	if (cmdline) {
16362becec6bSKai Ji 		internals->min_enq_burst_threshold =
163799ab2806SArkadiusz Kusztal 			atoi(cmdline) > MAX_QP_THRESHOLD_SIZE ?
163899ab2806SArkadiusz Kusztal 			MAX_QP_THRESHOLD_SIZE :
163999ab2806SArkadiusz Kusztal 			atoi(cmdline);
16402becec6bSKai Ji 	}
16412becec6bSKai Ji 
1642b7bd72d8SArkadiusz Kusztal 	if (qat_pci_dev->options.slice_map & ICP_ACCEL_MASK_PKE_SLICE) {
1643b6ac58aeSArek Kusztal 		QAT_LOG(ERR, "Device %s does not support PKE slice",
1644b6ac58aeSArek Kusztal 				name);
1645b6ac58aeSArek Kusztal 		rte_cryptodev_pmd_destroy(cryptodev);
1646b6ac58aeSArek Kusztal 		memset(&qat_dev_instance->asym_rte_dev, 0,
1647b6ac58aeSArek Kusztal 			sizeof(qat_dev_instance->asym_rte_dev));
1648b6ac58aeSArek Kusztal 		return -1;
1649b6ac58aeSArek Kusztal 	}
1650b6ac58aeSArek Kusztal 
1651b6ac58aeSArek Kusztal 	if (gen_dev_ops->get_capabilities(internals,
1652b7bd72d8SArkadiusz Kusztal 			capa_memz_name, qat_pci_dev->options.slice_map) < 0) {
1653b6ac58aeSArek Kusztal 		QAT_LOG(ERR,
1654b6ac58aeSArek Kusztal 			"Device cannot obtain capabilities, destroying PMD for %s",
1655b6ac58aeSArek Kusztal 			name);
1656b6ac58aeSArek Kusztal 		rte_cryptodev_pmd_destroy(cryptodev);
1657b6ac58aeSArek Kusztal 		memset(&qat_dev_instance->asym_rte_dev, 0,
1658b6ac58aeSArek Kusztal 			sizeof(qat_dev_instance->asym_rte_dev));
1659b6ac58aeSArek Kusztal 		return -1;
1660b6ac58aeSArek Kusztal 	}
1661b6ac58aeSArek Kusztal 
1662477d7d05SArkadiusz Kusztal 	qat_pci_dev->pmd[QAT_SERVICE_ASYMMETRIC] = internals;
16632becec6bSKai Ji 	internals->service_type = QAT_SERVICE_ASYMMETRIC;
16642becec6bSKai Ji 	QAT_LOG(DEBUG, "Created QAT ASYM device %s as cryptodev instance %d",
16652becec6bSKai Ji 			cryptodev->data->name, internals->dev_id);
16662becec6bSKai Ji 	return 0;
16672becec6bSKai Ji }
16682becec6bSKai Ji 
1669477d7d05SArkadiusz Kusztal static int
16702becec6bSKai Ji qat_asym_dev_destroy(struct qat_pci_device *qat_pci_dev)
16712becec6bSKai Ji {
16722becec6bSKai Ji 	struct rte_cryptodev *cryptodev;
1673d77817d0SArkadiusz Kusztal 	struct qat_cryptodev_private *dev;
16742becec6bSKai Ji 
16752becec6bSKai Ji 	if (qat_pci_dev == NULL)
16762becec6bSKai Ji 		return -ENODEV;
1677d77817d0SArkadiusz Kusztal 	dev = qat_pci_dev->pmd[QAT_SERVICE_ASYMMETRIC];
1678477d7d05SArkadiusz Kusztal 	if (dev == NULL)
16792becec6bSKai Ji 		return 0;
16802becec6bSKai Ji 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
1681477d7d05SArkadiusz Kusztal 		rte_memzone_free(dev->capa_mz);
16822becec6bSKai Ji 	/* free crypto device */
1683477d7d05SArkadiusz Kusztal 	cryptodev = rte_cryptodev_pmd_get_dev(dev->dev_id);
16842becec6bSKai Ji 	rte_cryptodev_pmd_destroy(cryptodev);
16852becec6bSKai Ji 	qat_pci_devs[qat_pci_dev->qat_dev_id].asym_rte_dev.name = NULL;
1686477d7d05SArkadiusz Kusztal 	qat_pci_dev->pmd[QAT_SERVICE_ASYMMETRIC] = NULL;
16872becec6bSKai Ji 
16882becec6bSKai Ji 	return 0;
16892becec6bSKai Ji }
16902becec6bSKai Ji 
1691a2343302SKai Ji static struct cryptodev_driver qat_crypto_drv;
1692a2343302SKai Ji RTE_PMD_REGISTER_CRYPTO_DRIVER(qat_crypto_drv,
1693a2343302SKai Ji 		cryptodev_qat_asym_driver,
1694a2343302SKai Ji 		qat_asym_driver_id);
169599ab2806SArkadiusz Kusztal 
169699ab2806SArkadiusz Kusztal RTE_INIT(qat_asym_init)
169799ab2806SArkadiusz Kusztal {
169899ab2806SArkadiusz Kusztal 	qat_cmdline_defines[QAT_SERVICE_ASYMMETRIC] = arguments;
1699477d7d05SArkadiusz Kusztal 	qat_service[QAT_SERVICE_ASYMMETRIC].name = "asymmetric crypto";
1700477d7d05SArkadiusz Kusztal 	qat_service[QAT_SERVICE_ASYMMETRIC].dev_create = qat_asym_dev_create;
1701477d7d05SArkadiusz Kusztal 	qat_service[QAT_SERVICE_ASYMMETRIC].dev_destroy = qat_asym_dev_destroy;
170299ab2806SArkadiusz Kusztal }
1703