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