xref: /dpdk/drivers/crypto/openssl/rte_openssl_pmd_ops.c (revision 8fdfedb125beac73e4ebe14f5ffe369d0465ba19)
15566a3e3SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
25566a3e3SBruce Richardson  * Copyright(c) 2016-2017 Intel Corporation
38a9867a6SSlawomir Mrozowicz  */
48a9867a6SSlawomir Mrozowicz 
58a9867a6SSlawomir Mrozowicz #include <string.h>
68a9867a6SSlawomir Mrozowicz 
78a9867a6SSlawomir Mrozowicz #include <rte_common.h>
88a9867a6SSlawomir Mrozowicz #include <rte_malloc.h>
9af668035SAkhil Goyal #include <cryptodev_pmd.h>
108a9867a6SSlawomir Mrozowicz 
11b28f28aeSDharmik Thakkar #include "openssl_pmd_private.h"
123e9d6bd4SSunila Sahu #include "compat.h"
13d7bd42f6SKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
14d7bd42f6SKai Ji #include <openssl/provider.h>
15d7bd42f6SKai Ji #include <openssl/core_names.h>
16d7bd42f6SKai Ji #include <openssl/param_build.h>
17d7bd42f6SKai Ji #endif
188a9867a6SSlawomir Mrozowicz 
198a9867a6SSlawomir Mrozowicz static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
208a9867a6SSlawomir Mrozowicz 	{	/* MD5 HMAC */
218a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
228a9867a6SSlawomir Mrozowicz 		{.sym = {
238a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
248a9867a6SSlawomir Mrozowicz 			{.auth = {
258a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5_HMAC,
268a9867a6SSlawomir Mrozowicz 				.block_size = 64,
278a9867a6SSlawomir Mrozowicz 				.key_size = {
28e5e7bc71SPablo de Lara 					.min = 1,
298a9867a6SSlawomir Mrozowicz 					.max = 64,
30e5e7bc71SPablo de Lara 					.increment = 1
318a9867a6SSlawomir Mrozowicz 				},
328a9867a6SSlawomir Mrozowicz 				.digest_size = {
33c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
348a9867a6SSlawomir Mrozowicz 					.max = 16,
35c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
368a9867a6SSlawomir Mrozowicz 				},
37acf86169SPablo de Lara 				.iv_size = { 0 }
388a9867a6SSlawomir Mrozowicz 			}, }
398a9867a6SSlawomir Mrozowicz 		}, }
408a9867a6SSlawomir Mrozowicz 	},
418a9867a6SSlawomir Mrozowicz 	{	/* MD5 */
428a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
438a9867a6SSlawomir Mrozowicz 		{.sym = {
448a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
458a9867a6SSlawomir Mrozowicz 			{.auth = {
468a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5,
478a9867a6SSlawomir Mrozowicz 				.block_size = 64,
488a9867a6SSlawomir Mrozowicz 				.key_size = {
498a9867a6SSlawomir Mrozowicz 					.min = 0,
508a9867a6SSlawomir Mrozowicz 					.max = 0,
518a9867a6SSlawomir Mrozowicz 					.increment = 0
528a9867a6SSlawomir Mrozowicz 				},
538a9867a6SSlawomir Mrozowicz 				.digest_size = {
548a9867a6SSlawomir Mrozowicz 					.min = 16,
558a9867a6SSlawomir Mrozowicz 					.max = 16,
568a9867a6SSlawomir Mrozowicz 					.increment = 0
578a9867a6SSlawomir Mrozowicz 				},
58acf86169SPablo de Lara 				.iv_size = { 0 }
598a9867a6SSlawomir Mrozowicz 			}, }
608a9867a6SSlawomir Mrozowicz 		}, }
618a9867a6SSlawomir Mrozowicz 	},
628a9867a6SSlawomir Mrozowicz 	{	/* SHA1 HMAC */
638a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
648a9867a6SSlawomir Mrozowicz 		{.sym = {
658a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
668a9867a6SSlawomir Mrozowicz 			{.auth = {
678a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
688a9867a6SSlawomir Mrozowicz 				.block_size = 64,
698a9867a6SSlawomir Mrozowicz 				.key_size = {
70e5e7bc71SPablo de Lara 					.min = 1,
718a9867a6SSlawomir Mrozowicz 					.max = 64,
72e5e7bc71SPablo de Lara 					.increment = 1
738a9867a6SSlawomir Mrozowicz 				},
748a9867a6SSlawomir Mrozowicz 				.digest_size = {
75c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
768a9867a6SSlawomir Mrozowicz 					.max = 20,
77c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
788a9867a6SSlawomir Mrozowicz 				},
79acf86169SPablo de Lara 				.iv_size = { 0 }
808a9867a6SSlawomir Mrozowicz 			}, }
818a9867a6SSlawomir Mrozowicz 		}, }
828a9867a6SSlawomir Mrozowicz 	},
838a9867a6SSlawomir Mrozowicz 	{	/* SHA1 */
848a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
858a9867a6SSlawomir Mrozowicz 		{.sym = {
868a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
878a9867a6SSlawomir Mrozowicz 			{.auth = {
888a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1,
898a9867a6SSlawomir Mrozowicz 				.block_size = 64,
908a9867a6SSlawomir Mrozowicz 				.key_size = {
918a9867a6SSlawomir Mrozowicz 					.min = 0,
928a9867a6SSlawomir Mrozowicz 					.max = 0,
938a9867a6SSlawomir Mrozowicz 					.increment = 0
948a9867a6SSlawomir Mrozowicz 				},
958a9867a6SSlawomir Mrozowicz 				.digest_size = {
968a9867a6SSlawomir Mrozowicz 					.min = 20,
978a9867a6SSlawomir Mrozowicz 					.max = 20,
988a9867a6SSlawomir Mrozowicz 					.increment = 0
998a9867a6SSlawomir Mrozowicz 				},
100acf86169SPablo de Lara 				.iv_size = { 0 }
1018a9867a6SSlawomir Mrozowicz 			}, }
1028a9867a6SSlawomir Mrozowicz 		}, }
1038a9867a6SSlawomir Mrozowicz 	},
1048a9867a6SSlawomir Mrozowicz 	{	/* SHA224 HMAC */
1058a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1068a9867a6SSlawomir Mrozowicz 		{.sym = {
1078a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1088a9867a6SSlawomir Mrozowicz 			{.auth = {
1098a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
1108a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1118a9867a6SSlawomir Mrozowicz 				.key_size = {
112e5e7bc71SPablo de Lara 					.min = 1,
1138a9867a6SSlawomir Mrozowicz 					.max = 64,
114e5e7bc71SPablo de Lara 					.increment = 1
1158a9867a6SSlawomir Mrozowicz 				},
1168a9867a6SSlawomir Mrozowicz 				.digest_size = {
117c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
1188a9867a6SSlawomir Mrozowicz 					.max = 28,
119c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
1208a9867a6SSlawomir Mrozowicz 				},
121acf86169SPablo de Lara 				.iv_size = { 0 }
1228a9867a6SSlawomir Mrozowicz 			}, }
1238a9867a6SSlawomir Mrozowicz 		}, }
1248a9867a6SSlawomir Mrozowicz 	},
1258a9867a6SSlawomir Mrozowicz 	{	/* SHA224 */
1268a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1278a9867a6SSlawomir Mrozowicz 		{.sym = {
1288a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1298a9867a6SSlawomir Mrozowicz 			{.auth = {
1308a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224,
1318a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1328a9867a6SSlawomir Mrozowicz 				.key_size = {
1338a9867a6SSlawomir Mrozowicz 					.min = 0,
1348a9867a6SSlawomir Mrozowicz 					.max = 0,
1358a9867a6SSlawomir Mrozowicz 					.increment = 0
1368a9867a6SSlawomir Mrozowicz 				},
1378a9867a6SSlawomir Mrozowicz 				.digest_size = {
138c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
1398a9867a6SSlawomir Mrozowicz 					.max = 28,
140c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
1418a9867a6SSlawomir Mrozowicz 				},
142acf86169SPablo de Lara 				.iv_size = { 0 }
1438a9867a6SSlawomir Mrozowicz 			}, }
1448a9867a6SSlawomir Mrozowicz 		}, }
1458a9867a6SSlawomir Mrozowicz 	},
1468a9867a6SSlawomir Mrozowicz 	{	/* SHA256 HMAC */
1478a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1488a9867a6SSlawomir Mrozowicz 		{.sym = {
1498a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1508a9867a6SSlawomir Mrozowicz 			{.auth = {
1518a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
1528a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1538a9867a6SSlawomir Mrozowicz 				.key_size = {
154e5e7bc71SPablo de Lara 					.min = 1,
1558a9867a6SSlawomir Mrozowicz 					.max = 64,
156e5e7bc71SPablo de Lara 					.increment = 1
1578a9867a6SSlawomir Mrozowicz 				},
1588a9867a6SSlawomir Mrozowicz 				.digest_size = {
159c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
1608a9867a6SSlawomir Mrozowicz 					.max = 32,
161c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
1628a9867a6SSlawomir Mrozowicz 				},
163acf86169SPablo de Lara 				.iv_size = { 0 }
1648a9867a6SSlawomir Mrozowicz 			}, }
1658a9867a6SSlawomir Mrozowicz 		}, }
1668a9867a6SSlawomir Mrozowicz 	},
1678a9867a6SSlawomir Mrozowicz 	{	/* SHA256 */
1688a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1698a9867a6SSlawomir Mrozowicz 		{.sym = {
1708a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1718a9867a6SSlawomir Mrozowicz 			{.auth = {
1728a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256,
1738a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1748a9867a6SSlawomir Mrozowicz 				.key_size = {
1758a9867a6SSlawomir Mrozowicz 					.min = 0,
1768a9867a6SSlawomir Mrozowicz 					.max = 0,
1778a9867a6SSlawomir Mrozowicz 					.increment = 0
1788a9867a6SSlawomir Mrozowicz 				},
1798a9867a6SSlawomir Mrozowicz 				.digest_size = {
1808a9867a6SSlawomir Mrozowicz 					.min = 32,
1818a9867a6SSlawomir Mrozowicz 					.max = 32,
1828a9867a6SSlawomir Mrozowicz 					.increment = 0
1838a9867a6SSlawomir Mrozowicz 				},
184acf86169SPablo de Lara 				.iv_size = { 0 }
1858a9867a6SSlawomir Mrozowicz 			}, }
1868a9867a6SSlawomir Mrozowicz 		}, }
1878a9867a6SSlawomir Mrozowicz 	},
1888a9867a6SSlawomir Mrozowicz 	{	/* SHA384 HMAC */
1898a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1908a9867a6SSlawomir Mrozowicz 		{.sym = {
1918a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1928a9867a6SSlawomir Mrozowicz 			{.auth = {
1938a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
1948a9867a6SSlawomir Mrozowicz 				.block_size = 128,
1958a9867a6SSlawomir Mrozowicz 				.key_size = {
196e5e7bc71SPablo de Lara 					.min = 1,
1978a9867a6SSlawomir Mrozowicz 					.max = 128,
198e5e7bc71SPablo de Lara 					.increment = 1
1998a9867a6SSlawomir Mrozowicz 				},
2008a9867a6SSlawomir Mrozowicz 				.digest_size = {
201c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
2028a9867a6SSlawomir Mrozowicz 					.max = 48,
203c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
2048a9867a6SSlawomir Mrozowicz 				},
205acf86169SPablo de Lara 				.iv_size = { 0 }
2068a9867a6SSlawomir Mrozowicz 			}, }
2078a9867a6SSlawomir Mrozowicz 		}, }
2088a9867a6SSlawomir Mrozowicz 	},
2098a9867a6SSlawomir Mrozowicz 	{	/* SHA384 */
2108a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2118a9867a6SSlawomir Mrozowicz 		{.sym = {
2128a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2138a9867a6SSlawomir Mrozowicz 			{.auth = {
2148a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384,
2158a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2168a9867a6SSlawomir Mrozowicz 				.key_size = {
2178a9867a6SSlawomir Mrozowicz 					.min = 0,
2188a9867a6SSlawomir Mrozowicz 					.max = 0,
2198a9867a6SSlawomir Mrozowicz 					.increment = 0
2208a9867a6SSlawomir Mrozowicz 				},
2218a9867a6SSlawomir Mrozowicz 				.digest_size = {
2228a9867a6SSlawomir Mrozowicz 					.min = 48,
2238a9867a6SSlawomir Mrozowicz 					.max = 48,
2248a9867a6SSlawomir Mrozowicz 					.increment = 0
2258a9867a6SSlawomir Mrozowicz 				},
226acf86169SPablo de Lara 				.iv_size = { 0 }
2278a9867a6SSlawomir Mrozowicz 			}, }
2288a9867a6SSlawomir Mrozowicz 		}, }
2298a9867a6SSlawomir Mrozowicz 	},
2308a9867a6SSlawomir Mrozowicz 	{	/* SHA512 HMAC */
2318a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2328a9867a6SSlawomir Mrozowicz 		{.sym = {
2338a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2348a9867a6SSlawomir Mrozowicz 			{.auth = {
2358a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
2368a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2378a9867a6SSlawomir Mrozowicz 				.key_size = {
238e5e7bc71SPablo de Lara 					.min = 1,
2398a9867a6SSlawomir Mrozowicz 					.max = 128,
240e5e7bc71SPablo de Lara 					.increment = 1
2418a9867a6SSlawomir Mrozowicz 				},
2428a9867a6SSlawomir Mrozowicz 				.digest_size = {
243c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
2448a9867a6SSlawomir Mrozowicz 					.max = 64,
245c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
2468a9867a6SSlawomir Mrozowicz 				},
247acf86169SPablo de Lara 				.iv_size = { 0 }
2488a9867a6SSlawomir Mrozowicz 			}, }
2498a9867a6SSlawomir Mrozowicz 		}, }
2508a9867a6SSlawomir Mrozowicz 	},
2518a9867a6SSlawomir Mrozowicz 	{	/* SHA512  */
2528a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2538a9867a6SSlawomir Mrozowicz 		{.sym = {
2548a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2558a9867a6SSlawomir Mrozowicz 			{.auth = {
2568a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512,
2578a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2588a9867a6SSlawomir Mrozowicz 				.key_size = {
2598a9867a6SSlawomir Mrozowicz 					.min = 0,
2608a9867a6SSlawomir Mrozowicz 					.max = 0,
2618a9867a6SSlawomir Mrozowicz 					.increment = 0
2628a9867a6SSlawomir Mrozowicz 				},
2638a9867a6SSlawomir Mrozowicz 				.digest_size = {
2648a9867a6SSlawomir Mrozowicz 					.min = 64,
2658a9867a6SSlawomir Mrozowicz 					.max = 64,
2668a9867a6SSlawomir Mrozowicz 					.increment = 0
2678a9867a6SSlawomir Mrozowicz 				},
268acf86169SPablo de Lara 				.iv_size = { 0 }
2698a9867a6SSlawomir Mrozowicz 			}, }
2708a9867a6SSlawomir Mrozowicz 		}, }
2718a9867a6SSlawomir Mrozowicz 	},
2728a9867a6SSlawomir Mrozowicz 	{	/* AES CBC */
2738a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2748a9867a6SSlawomir Mrozowicz 		{.sym = {
2758a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
2768a9867a6SSlawomir Mrozowicz 			{.cipher = {
2778a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CBC,
2788a9867a6SSlawomir Mrozowicz 				.block_size = 16,
2798a9867a6SSlawomir Mrozowicz 				.key_size = {
2808a9867a6SSlawomir Mrozowicz 					.min = 16,
2818a9867a6SSlawomir Mrozowicz 					.max = 32,
2828a9867a6SSlawomir Mrozowicz 					.increment = 8
2838a9867a6SSlawomir Mrozowicz 				},
2848a9867a6SSlawomir Mrozowicz 				.iv_size = {
2858a9867a6SSlawomir Mrozowicz 					.min = 16,
2868a9867a6SSlawomir Mrozowicz 					.max = 16,
2878a9867a6SSlawomir Mrozowicz 					.increment = 0
2888a9867a6SSlawomir Mrozowicz 				}
2898a9867a6SSlawomir Mrozowicz 			}, }
2908a9867a6SSlawomir Mrozowicz 		}, }
2918a9867a6SSlawomir Mrozowicz 	},
2928a9867a6SSlawomir Mrozowicz 	{	/* AES CTR */
2938a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2948a9867a6SSlawomir Mrozowicz 		{.sym = {
2958a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
2968a9867a6SSlawomir Mrozowicz 			{.cipher = {
2978a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
2988a9867a6SSlawomir Mrozowicz 				.block_size = 16,
2998a9867a6SSlawomir Mrozowicz 				.key_size = {
3008a9867a6SSlawomir Mrozowicz 					.min = 16,
3018a9867a6SSlawomir Mrozowicz 					.max = 32,
3028a9867a6SSlawomir Mrozowicz 					.increment = 8
3038a9867a6SSlawomir Mrozowicz 				},
3048a9867a6SSlawomir Mrozowicz 				.iv_size = {
3058a9867a6SSlawomir Mrozowicz 					.min = 16,
3068a9867a6SSlawomir Mrozowicz 					.max = 16,
3078a9867a6SSlawomir Mrozowicz 					.increment = 0
3088a9867a6SSlawomir Mrozowicz 				}
3098a9867a6SSlawomir Mrozowicz 			}, }
3108a9867a6SSlawomir Mrozowicz 		}, }
3118a9867a6SSlawomir Mrozowicz 	},
312b79e4c00SPablo de Lara 	{	/* AES GCM */
3138a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3148a9867a6SSlawomir Mrozowicz 		{.sym = {
315b79e4c00SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
316b79e4c00SPablo de Lara 			{.aead = {
317b79e4c00SPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
3188a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3198a9867a6SSlawomir Mrozowicz 				.key_size = {
3208a9867a6SSlawomir Mrozowicz 					.min = 16,
3218a9867a6SSlawomir Mrozowicz 					.max = 32,
3228a9867a6SSlawomir Mrozowicz 					.increment = 8
3238a9867a6SSlawomir Mrozowicz 				},
3248a9867a6SSlawomir Mrozowicz 				.digest_size = {
3258a9867a6SSlawomir Mrozowicz 					.min = 16,
3268a9867a6SSlawomir Mrozowicz 					.max = 16,
3278a9867a6SSlawomir Mrozowicz 					.increment = 0
3288a9867a6SSlawomir Mrozowicz 				},
3298a9867a6SSlawomir Mrozowicz 				.aad_size = {
3300625598aSArek Kusztal 					.min = 0,
3310625598aSArek Kusztal 					.max = 65535,
3320625598aSArek Kusztal 					.increment = 1
333acf86169SPablo de Lara 				},
3348a9867a6SSlawomir Mrozowicz 				.iv_size = {
3358a9867a6SSlawomir Mrozowicz 					.min = 12,
3368a9867a6SSlawomir Mrozowicz 					.max = 16,
3378a9867a6SSlawomir Mrozowicz 					.increment = 4
338b79e4c00SPablo de Lara 				},
3398a9867a6SSlawomir Mrozowicz 			}, }
3408a9867a6SSlawomir Mrozowicz 		}, }
3418a9867a6SSlawomir Mrozowicz 	},
3421a4998dcSPablo de Lara 	{	/* AES CCM */
3431a4998dcSPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3441a4998dcSPablo de Lara 		{.sym = {
3451a4998dcSPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
3461a4998dcSPablo de Lara 			{.aead = {
3471a4998dcSPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_CCM,
3481a4998dcSPablo de Lara 				.block_size = 16,
3491a4998dcSPablo de Lara 				.key_size = {
3501a4998dcSPablo de Lara 					.min = 16,
3511a4998dcSPablo de Lara 					.max = 32,
3521a4998dcSPablo de Lara 					.increment = 8
3531a4998dcSPablo de Lara 				},
3541a4998dcSPablo de Lara 				.digest_size = {
3551a4998dcSPablo de Lara 					.min = 4,
3561a4998dcSPablo de Lara 					.max = 16,
3571a4998dcSPablo de Lara 					.increment = 2
3581a4998dcSPablo de Lara 				},
3591a4998dcSPablo de Lara 				.aad_size = {
3601a4998dcSPablo de Lara 					.min = 0,
3611a4998dcSPablo de Lara 					.max = 65535,
3621a4998dcSPablo de Lara 					.increment = 1
3631a4998dcSPablo de Lara 				},
3641a4998dcSPablo de Lara 				.iv_size = {
3651a4998dcSPablo de Lara 					.min = 7,
3661a4998dcSPablo de Lara 					.max = 13,
3671a4998dcSPablo de Lara 					.increment = 1
3681a4998dcSPablo de Lara 				},
3691a4998dcSPablo de Lara 			}, }
3701a4998dcSPablo de Lara 		}, }
3711a4998dcSPablo de Lara 	},
3728a9867a6SSlawomir Mrozowicz 	{	/* AES GMAC (AUTH) */
3738a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3748a9867a6SSlawomir Mrozowicz 		{.sym = {
3758a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
3768a9867a6SSlawomir Mrozowicz 			{.auth = {
3778a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_AES_GMAC,
3788a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3798a9867a6SSlawomir Mrozowicz 				.key_size = {
3808a9867a6SSlawomir Mrozowicz 					.min = 16,
3818a9867a6SSlawomir Mrozowicz 					.max = 32,
3828a9867a6SSlawomir Mrozowicz 					.increment = 8
3838a9867a6SSlawomir Mrozowicz 				},
3848a9867a6SSlawomir Mrozowicz 				.digest_size = {
3858a9867a6SSlawomir Mrozowicz 					.min = 16,
3868a9867a6SSlawomir Mrozowicz 					.max = 16,
3878a9867a6SSlawomir Mrozowicz 					.increment = 0
3888a9867a6SSlawomir Mrozowicz 				},
389e32e4fa8SPablo de Lara 				.iv_size = {
390e32e4fa8SPablo de Lara 					.min = 12,
391e32e4fa8SPablo de Lara 					.max = 16,
3928a9867a6SSlawomir Mrozowicz 					.increment = 4
393e32e4fa8SPablo de Lara 				}
3948a9867a6SSlawomir Mrozowicz 			}, }
3958a9867a6SSlawomir Mrozowicz 		}, }
3968a9867a6SSlawomir Mrozowicz 	},
3972b9c693fSAshwin Sekhar T K 	{	/* AES CMAC (AUTH) */
3982b9c693fSAshwin Sekhar T K 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3992b9c693fSAshwin Sekhar T K 		{.sym = {
4002b9c693fSAshwin Sekhar T K 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
4012b9c693fSAshwin Sekhar T K 			{.auth = {
4022b9c693fSAshwin Sekhar T K 				.algo = RTE_CRYPTO_AUTH_AES_CMAC,
4032b9c693fSAshwin Sekhar T K 				.block_size = 16,
4042b9c693fSAshwin Sekhar T K 				.key_size = {
4052b9c693fSAshwin Sekhar T K 					.min = 16,
4062b9c693fSAshwin Sekhar T K 					.max = 32,
4072b9c693fSAshwin Sekhar T K 					.increment = 8
4082b9c693fSAshwin Sekhar T K 				},
4092b9c693fSAshwin Sekhar T K 				.digest_size = {
4102b9c693fSAshwin Sekhar T K 					.min = 4,
4112b9c693fSAshwin Sekhar T K 					.max = 16,
4122b9c693fSAshwin Sekhar T K 					.increment = 4
4132b9c693fSAshwin Sekhar T K 				},
4142b9c693fSAshwin Sekhar T K 			}, }
4152b9c693fSAshwin Sekhar T K 		}, }
4162b9c693fSAshwin Sekhar T K 	},
4178a9867a6SSlawomir Mrozowicz 	{	/* 3DES CBC */
4188a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4198a9867a6SSlawomir Mrozowicz 		{.sym = {
4208a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4218a9867a6SSlawomir Mrozowicz 			{.cipher = {
4228a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
4238a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4248a9867a6SSlawomir Mrozowicz 				.key_size = {
4259607e37eSMarko Kovacevic 					.min = 8,
4268a9867a6SSlawomir Mrozowicz 					.max = 24,
4278a9867a6SSlawomir Mrozowicz 					.increment = 8
4288a9867a6SSlawomir Mrozowicz 				},
4298a9867a6SSlawomir Mrozowicz 				.iv_size = {
4308a9867a6SSlawomir Mrozowicz 					.min = 8,
4318a9867a6SSlawomir Mrozowicz 					.max = 8,
4328a9867a6SSlawomir Mrozowicz 					.increment = 0
4338a9867a6SSlawomir Mrozowicz 				}
4348a9867a6SSlawomir Mrozowicz 			}, }
4358a9867a6SSlawomir Mrozowicz 		}, }
4368a9867a6SSlawomir Mrozowicz 	},
4378a9867a6SSlawomir Mrozowicz 	{	/* 3DES CTR */
4388a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4398a9867a6SSlawomir Mrozowicz 		{.sym = {
4408a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4418a9867a6SSlawomir Mrozowicz 			{.cipher = {
4428a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CTR,
4438a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4448a9867a6SSlawomir Mrozowicz 				.key_size = {
4458a9867a6SSlawomir Mrozowicz 					.min = 16,
4468a9867a6SSlawomir Mrozowicz 					.max = 24,
4478a9867a6SSlawomir Mrozowicz 					.increment = 8
4488a9867a6SSlawomir Mrozowicz 				},
4498a9867a6SSlawomir Mrozowicz 				.iv_size = {
4508a9867a6SSlawomir Mrozowicz 					.min = 8,
4518a9867a6SSlawomir Mrozowicz 					.max = 8,
4528a9867a6SSlawomir Mrozowicz 					.increment = 0
4538a9867a6SSlawomir Mrozowicz 				}
4548a9867a6SSlawomir Mrozowicz 			}, }
4558a9867a6SSlawomir Mrozowicz 		}, }
4568a9867a6SSlawomir Mrozowicz 	},
457c1734807SPablo de Lara 	{	/* DES CBC */
458c1734807SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
459c1734807SPablo de Lara 		{.sym = {
460c1734807SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
461c1734807SPablo de Lara 			{.cipher = {
462c1734807SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_CBC,
463c1734807SPablo de Lara 				.block_size = 8,
464c1734807SPablo de Lara 				.key_size = {
465c1734807SPablo de Lara 					.min = 8,
466c1734807SPablo de Lara 					.max = 8,
467c1734807SPablo de Lara 					.increment = 0
468c1734807SPablo de Lara 				},
469c1734807SPablo de Lara 				.iv_size = {
470c1734807SPablo de Lara 					.min = 8,
471c1734807SPablo de Lara 					.max = 8,
472c1734807SPablo de Lara 					.increment = 0
473c1734807SPablo de Lara 				}
474c1734807SPablo de Lara 			}, }
475c1734807SPablo de Lara 		}, }
476c1734807SPablo de Lara 	},
4771dee7bc7SPablo de Lara 	{	/* DES DOCSIS BPI */
4781dee7bc7SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4791dee7bc7SPablo de Lara 		{.sym = {
4801dee7bc7SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4811dee7bc7SPablo de Lara 			{.cipher = {
4821dee7bc7SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_DOCSISBPI,
4831dee7bc7SPablo de Lara 				.block_size = 8,
4841dee7bc7SPablo de Lara 				.key_size = {
4851dee7bc7SPablo de Lara 					.min = 8,
4861dee7bc7SPablo de Lara 					.max = 8,
4871dee7bc7SPablo de Lara 					.increment = 0
4881dee7bc7SPablo de Lara 				},
4891dee7bc7SPablo de Lara 				.iv_size = {
4901dee7bc7SPablo de Lara 					.min = 8,
4911dee7bc7SPablo de Lara 					.max = 8,
4921dee7bc7SPablo de Lara 					.increment = 0
4931dee7bc7SPablo de Lara 				}
4941dee7bc7SPablo de Lara 			}, }
4951dee7bc7SPablo de Lara 		}, }
4961dee7bc7SPablo de Lara 	},
4973e9d6bd4SSunila Sahu 	{	/* RSA */
4983e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
4993e9d6bd4SSunila Sahu 		{.asym = {
5003e9d6bd4SSunila Sahu 			.xform_capa = {
5013e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_RSA,
5023e9d6bd4SSunila Sahu 				.op_types = ((1 << RTE_CRYPTO_ASYM_OP_SIGN) |
5033e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_VERIFY) |
5043e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
5053e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),
5063e9d6bd4SSunila Sahu 				{
5073e9d6bd4SSunila Sahu 				.modlen = {
5083e9d6bd4SSunila Sahu 				/* min length is based on openssl rsa keygen */
5093e9d6bd4SSunila Sahu 				.min = 30,
5103e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
5113e9d6bd4SSunila Sahu 				.max = 0,
5123e9d6bd4SSunila Sahu 				.increment = 1
5133e9d6bd4SSunila Sahu 				}, }
5143e9d6bd4SSunila Sahu 			}
5153e9d6bd4SSunila Sahu 		},
5163e9d6bd4SSunila Sahu 		}
5173e9d6bd4SSunila Sahu 	},
5183e9d6bd4SSunila Sahu 	{	/* modexp */
5193e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
5203e9d6bd4SSunila Sahu 		{.asym = {
5213e9d6bd4SSunila Sahu 			.xform_capa = {
5223e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
5233e9d6bd4SSunila Sahu 				.op_types = 0,
5243e9d6bd4SSunila Sahu 				{
5253e9d6bd4SSunila Sahu 				.modlen = {
5263e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on min length */
5273e9d6bd4SSunila Sahu 				.min = 0,
5283e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
5293e9d6bd4SSunila Sahu 				.max = 0,
5303e9d6bd4SSunila Sahu 				.increment = 1
5313e9d6bd4SSunila Sahu 				}, }
5323e9d6bd4SSunila Sahu 			}
5333e9d6bd4SSunila Sahu 		},
5343e9d6bd4SSunila Sahu 		}
5353e9d6bd4SSunila Sahu 	},
5363e9d6bd4SSunila Sahu 	{	/* modinv */
5373e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
5383e9d6bd4SSunila Sahu 		{.asym = {
5393e9d6bd4SSunila Sahu 			.xform_capa = {
5403e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODINV,
5413e9d6bd4SSunila Sahu 				.op_types = 0,
5423e9d6bd4SSunila Sahu 				{
5433e9d6bd4SSunila Sahu 				.modlen = {
5443e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on min length */
5453e9d6bd4SSunila Sahu 				.min = 0,
5463e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
5473e9d6bd4SSunila Sahu 				.max = 0,
5483e9d6bd4SSunila Sahu 				.increment = 1
5493e9d6bd4SSunila Sahu 				}, }
5503e9d6bd4SSunila Sahu 			}
5513e9d6bd4SSunila Sahu 		},
5523e9d6bd4SSunila Sahu 		}
5533e9d6bd4SSunila Sahu 	},
554ac42813aSSunila Sahu 	{	/* dh */
555ac42813aSSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
556ac42813aSSunila Sahu 		{.asym = {
557ac42813aSSunila Sahu 			.xform_capa = {
558ac42813aSSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_DH,
559ac42813aSSunila Sahu 				.op_types =
5605fa1fb29SArek Kusztal 				((1<<RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE) |
5615fa1fb29SArek Kusztal 				(1 << RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE |
562ac42813aSSunila Sahu 				(1 <<
5635fa1fb29SArek Kusztal 				RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE))),
564ac42813aSSunila Sahu 				{
565ac42813aSSunila Sahu 				.modlen = {
566ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on min length */
567ac42813aSSunila Sahu 				.min = 0,
568ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on max length */
569ac42813aSSunila Sahu 				.max = 0,
570ac42813aSSunila Sahu 				.increment = 1
571ac42813aSSunila Sahu 				}, }
572ac42813aSSunila Sahu 			}
573ac42813aSSunila Sahu 		},
574ac42813aSSunila Sahu 		}
575ac42813aSSunila Sahu 	},
576ac42813aSSunila Sahu 	{	/* dsa */
577ac42813aSSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
578ac42813aSSunila Sahu 		{.asym = {
579ac42813aSSunila Sahu 			.xform_capa = {
580ac42813aSSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_DSA,
581ac42813aSSunila Sahu 				.op_types =
582ac42813aSSunila Sahu 				((1<<RTE_CRYPTO_ASYM_OP_SIGN) |
583ac42813aSSunila Sahu 				(1 << RTE_CRYPTO_ASYM_OP_VERIFY)),
584ac42813aSSunila Sahu 				{
585ac42813aSSunila Sahu 				.modlen = {
586ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on min length */
587ac42813aSSunila Sahu 				.min = 0,
588ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on max length */
589ac42813aSSunila Sahu 				.max = 0,
590ac42813aSSunila Sahu 				.increment = 1
591ac42813aSSunila Sahu 				}, }
592ac42813aSSunila Sahu 			}
593ac42813aSSunila Sahu 		},
594ac42813aSSunila Sahu 		}
595ac42813aSSunila Sahu 	},
5965a74d7fdSGowrishankar Muthukrishnan 	{	/* ECFPM */
5975a74d7fdSGowrishankar Muthukrishnan 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
5985a74d7fdSGowrishankar Muthukrishnan 		{.asym = {
5995a74d7fdSGowrishankar Muthukrishnan 			.xform_capa = {
6005a74d7fdSGowrishankar Muthukrishnan 				.xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM,
6015a74d7fdSGowrishankar Muthukrishnan 				.op_types = 0
6025a74d7fdSGowrishankar Muthukrishnan 				}
6035a74d7fdSGowrishankar Muthukrishnan 			}
6045a74d7fdSGowrishankar Muthukrishnan 		}
6055a74d7fdSGowrishankar Muthukrishnan 	},
606e8f9c5c8SGowrishankar Muthukrishnan 	{	/* SM2 */
607e8f9c5c8SGowrishankar Muthukrishnan 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
608e8f9c5c8SGowrishankar Muthukrishnan 		{.asym = {
609e8f9c5c8SGowrishankar Muthukrishnan 			.xform_capa = {
610e8f9c5c8SGowrishankar Muthukrishnan 				.xform_type = RTE_CRYPTO_ASYM_XFORM_SM2,
611e8f9c5c8SGowrishankar Muthukrishnan 				.op_types =
612e8f9c5c8SGowrishankar Muthukrishnan 				((1 << RTE_CRYPTO_ASYM_OP_SIGN) |
613e8f9c5c8SGowrishankar Muthukrishnan 				 (1 << RTE_CRYPTO_ASYM_OP_VERIFY) |
614e8f9c5c8SGowrishankar Muthukrishnan 				 (1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
615e8f9c5c8SGowrishankar Muthukrishnan 				 (1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),
616*8fdfedb1SGowrishankar Muthukrishnan 				.op_capa = {
617*8fdfedb1SGowrishankar Muthukrishnan 					[RTE_CRYPTO_ASYM_OP_ENCRYPT] = (1 << RTE_CRYPTO_SM2_RNG),
618*8fdfedb1SGowrishankar Muthukrishnan 					[RTE_CRYPTO_ASYM_OP_DECRYPT] = (1 << RTE_CRYPTO_SM2_RNG),
619*8fdfedb1SGowrishankar Muthukrishnan 					[RTE_CRYPTO_ASYM_OP_SIGN] = (1 << RTE_CRYPTO_SM2_RNG) |
620*8fdfedb1SGowrishankar Muthukrishnan 								    (1 << RTE_CRYPTO_SM2_PH),
621*8fdfedb1SGowrishankar Muthukrishnan 					[RTE_CRYPTO_ASYM_OP_VERIFY] = (1 << RTE_CRYPTO_SM2_RNG) |
622*8fdfedb1SGowrishankar Muthukrishnan 								      (1 << RTE_CRYPTO_SM2_PH)
623*8fdfedb1SGowrishankar Muthukrishnan 				},
624*8fdfedb1SGowrishankar Muthukrishnan 			},
625e8f9c5c8SGowrishankar Muthukrishnan 		}
626e8f9c5c8SGowrishankar Muthukrishnan 		}
627e8f9c5c8SGowrishankar Muthukrishnan 	},
6285a74d7fdSGowrishankar Muthukrishnan 	{	/* EdDSA */
6295a74d7fdSGowrishankar Muthukrishnan 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
6305a74d7fdSGowrishankar Muthukrishnan 		{.asym = {
6315a74d7fdSGowrishankar Muthukrishnan 			.xform_capa = {
6325a74d7fdSGowrishankar Muthukrishnan 				.xform_type = RTE_CRYPTO_ASYM_XFORM_EDDSA,
6335a74d7fdSGowrishankar Muthukrishnan 				.hash_algos = (1 << RTE_CRYPTO_AUTH_SHA512 |
6345a74d7fdSGowrishankar Muthukrishnan 					       1 << RTE_CRYPTO_AUTH_SHAKE_256),
6355a74d7fdSGowrishankar Muthukrishnan 				.op_types =
6365a74d7fdSGowrishankar Muthukrishnan 				((1<<RTE_CRYPTO_ASYM_OP_SIGN) |
6375a74d7fdSGowrishankar Muthukrishnan 				 (1 << RTE_CRYPTO_ASYM_OP_VERIFY)),
6385a74d7fdSGowrishankar Muthukrishnan 			}
6395a74d7fdSGowrishankar Muthukrishnan 		}
6405a74d7fdSGowrishankar Muthukrishnan 		}
6415a74d7fdSGowrishankar Muthukrishnan 	},
6428a9867a6SSlawomir Mrozowicz 
6438a9867a6SSlawomir Mrozowicz 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
6448a9867a6SSlawomir Mrozowicz };
6458a9867a6SSlawomir Mrozowicz 
6468a9867a6SSlawomir Mrozowicz 
6478a9867a6SSlawomir Mrozowicz /** Configure device */
6488a9867a6SSlawomir Mrozowicz static int
64960e686c2SFan Zhang openssl_pmd_config(__rte_unused struct rte_cryptodev *dev,
65060e686c2SFan Zhang 		__rte_unused struct rte_cryptodev_config *config)
6518a9867a6SSlawomir Mrozowicz {
6528a9867a6SSlawomir Mrozowicz 	return 0;
6538a9867a6SSlawomir Mrozowicz }
6548a9867a6SSlawomir Mrozowicz 
6558a9867a6SSlawomir Mrozowicz /** Start device */
6568a9867a6SSlawomir Mrozowicz static int
6578a9867a6SSlawomir Mrozowicz openssl_pmd_start(__rte_unused struct rte_cryptodev *dev)
6588a9867a6SSlawomir Mrozowicz {
6598a9867a6SSlawomir Mrozowicz 	return 0;
6608a9867a6SSlawomir Mrozowicz }
6618a9867a6SSlawomir Mrozowicz 
6628a9867a6SSlawomir Mrozowicz /** Stop device */
6638a9867a6SSlawomir Mrozowicz static void
6648a9867a6SSlawomir Mrozowicz openssl_pmd_stop(__rte_unused struct rte_cryptodev *dev)
6658a9867a6SSlawomir Mrozowicz {
6668a9867a6SSlawomir Mrozowicz }
6678a9867a6SSlawomir Mrozowicz 
6688a9867a6SSlawomir Mrozowicz /** Close device */
6698a9867a6SSlawomir Mrozowicz static int
6708a9867a6SSlawomir Mrozowicz openssl_pmd_close(__rte_unused struct rte_cryptodev *dev)
6718a9867a6SSlawomir Mrozowicz {
6728a9867a6SSlawomir Mrozowicz 	return 0;
6738a9867a6SSlawomir Mrozowicz }
6748a9867a6SSlawomir Mrozowicz 
6758a9867a6SSlawomir Mrozowicz 
6768a9867a6SSlawomir Mrozowicz /** Get device statistics */
6778a9867a6SSlawomir Mrozowicz static void
6788a9867a6SSlawomir Mrozowicz openssl_pmd_stats_get(struct rte_cryptodev *dev,
6798a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_stats *stats)
6808a9867a6SSlawomir Mrozowicz {
6818a9867a6SSlawomir Mrozowicz 	int qp_id;
6828a9867a6SSlawomir Mrozowicz 
6838a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
6848a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
6858a9867a6SSlawomir Mrozowicz 
6868a9867a6SSlawomir Mrozowicz 		stats->enqueued_count += qp->stats.enqueued_count;
6878a9867a6SSlawomir Mrozowicz 		stats->dequeued_count += qp->stats.dequeued_count;
6888a9867a6SSlawomir Mrozowicz 
6898a9867a6SSlawomir Mrozowicz 		stats->enqueue_err_count += qp->stats.enqueue_err_count;
6908a9867a6SSlawomir Mrozowicz 		stats->dequeue_err_count += qp->stats.dequeue_err_count;
6918a9867a6SSlawomir Mrozowicz 	}
6928a9867a6SSlawomir Mrozowicz }
6938a9867a6SSlawomir Mrozowicz 
6948a9867a6SSlawomir Mrozowicz /** Reset device statistics */
6958a9867a6SSlawomir Mrozowicz static void
6968a9867a6SSlawomir Mrozowicz openssl_pmd_stats_reset(struct rte_cryptodev *dev)
6978a9867a6SSlawomir Mrozowicz {
6988a9867a6SSlawomir Mrozowicz 	int qp_id;
6998a9867a6SSlawomir Mrozowicz 
7008a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
7018a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
7028a9867a6SSlawomir Mrozowicz 
7038a9867a6SSlawomir Mrozowicz 		memset(&qp->stats, 0, sizeof(qp->stats));
7048a9867a6SSlawomir Mrozowicz 	}
7058a9867a6SSlawomir Mrozowicz }
7068a9867a6SSlawomir Mrozowicz 
7078a9867a6SSlawomir Mrozowicz 
7088a9867a6SSlawomir Mrozowicz /** Get device info */
7098a9867a6SSlawomir Mrozowicz static void
7108a9867a6SSlawomir Mrozowicz openssl_pmd_info_get(struct rte_cryptodev *dev,
7118a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_info *dev_info)
7128a9867a6SSlawomir Mrozowicz {
7138a9867a6SSlawomir Mrozowicz 	struct openssl_private *internals = dev->data->dev_private;
7148a9867a6SSlawomir Mrozowicz 
7158a9867a6SSlawomir Mrozowicz 	if (dev_info != NULL) {
7167a364faeSSlawomir Mrozowicz 		dev_info->driver_id = dev->driver_id;
7178a9867a6SSlawomir Mrozowicz 		dev_info->feature_flags = dev->feature_flags;
7188a9867a6SSlawomir Mrozowicz 		dev_info->capabilities = openssl_pmd_capabilities;
7198a9867a6SSlawomir Mrozowicz 		dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
720e1fc5b76SPablo de Lara 		/* No limit of number of sessions */
721e1fc5b76SPablo de Lara 		dev_info->sym.max_nb_sessions = 0;
7228a9867a6SSlawomir Mrozowicz 	}
7238a9867a6SSlawomir Mrozowicz }
7248a9867a6SSlawomir Mrozowicz 
7258a9867a6SSlawomir Mrozowicz /** Release queue pair */
7268a9867a6SSlawomir Mrozowicz static int
7278a9867a6SSlawomir Mrozowicz openssl_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
7288a9867a6SSlawomir Mrozowicz {
7298a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL) {
730a4d69a51SFan Zhang 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
731a4d69a51SFan Zhang 
732a4d69a51SFan Zhang 		rte_ring_free(qp->processed_ops);
733a4d69a51SFan Zhang 
7348a9867a6SSlawomir Mrozowicz 		rte_free(dev->data->queue_pairs[qp_id]);
7358a9867a6SSlawomir Mrozowicz 		dev->data->queue_pairs[qp_id] = NULL;
7368a9867a6SSlawomir Mrozowicz 	}
7378a9867a6SSlawomir Mrozowicz 	return 0;
7388a9867a6SSlawomir Mrozowicz }
7398a9867a6SSlawomir Mrozowicz 
7408a9867a6SSlawomir Mrozowicz /** set a unique name for the queue pair based on it's name, dev_id and qp_id */
7418a9867a6SSlawomir Mrozowicz static int
7428a9867a6SSlawomir Mrozowicz openssl_pmd_qp_set_unique_name(struct rte_cryptodev *dev,
7438a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp)
7448a9867a6SSlawomir Mrozowicz {
7458a9867a6SSlawomir Mrozowicz 	unsigned int n = snprintf(qp->name, sizeof(qp->name),
7468a9867a6SSlawomir Mrozowicz 			"openssl_pmd_%u_qp_%u",
7478a9867a6SSlawomir Mrozowicz 			dev->data->dev_id, qp->id);
7488a9867a6SSlawomir Mrozowicz 
7496ab25e63STomasz Duszynski 	if (n >= sizeof(qp->name))
7508a9867a6SSlawomir Mrozowicz 		return -1;
7518a9867a6SSlawomir Mrozowicz 
7528a9867a6SSlawomir Mrozowicz 	return 0;
7538a9867a6SSlawomir Mrozowicz }
7548a9867a6SSlawomir Mrozowicz 
7558a9867a6SSlawomir Mrozowicz 
7568a9867a6SSlawomir Mrozowicz /** Create a ring to place processed operations on */
7578a9867a6SSlawomir Mrozowicz static struct rte_ring *
7588a9867a6SSlawomir Mrozowicz openssl_pmd_qp_create_processed_ops_ring(struct openssl_qp *qp,
7598a9867a6SSlawomir Mrozowicz 		unsigned int ring_size, int socket_id)
7608a9867a6SSlawomir Mrozowicz {
7618a9867a6SSlawomir Mrozowicz 	struct rte_ring *r;
7628a9867a6SSlawomir Mrozowicz 
7638a9867a6SSlawomir Mrozowicz 	r = rte_ring_lookup(qp->name);
7648a9867a6SSlawomir Mrozowicz 	if (r) {
765636e7392SBruce Richardson 		if (rte_ring_get_size(r) >= ring_size) {
766094b2386SNaga Suresh Somarowthu 			OPENSSL_LOG(INFO,
7678a9867a6SSlawomir Mrozowicz 					"Reusing existing ring %s for processed ops",
7688a9867a6SSlawomir Mrozowicz 				 qp->name);
7698a9867a6SSlawomir Mrozowicz 			return r;
7708a9867a6SSlawomir Mrozowicz 		}
7718a9867a6SSlawomir Mrozowicz 
772094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR,
7738a9867a6SSlawomir Mrozowicz 				"Unable to reuse existing ring %s for processed ops",
7748a9867a6SSlawomir Mrozowicz 			 qp->name);
7758a9867a6SSlawomir Mrozowicz 		return NULL;
7768a9867a6SSlawomir Mrozowicz 	}
7778a9867a6SSlawomir Mrozowicz 
7788a9867a6SSlawomir Mrozowicz 	return rte_ring_create(qp->name, ring_size, socket_id,
7798a9867a6SSlawomir Mrozowicz 			RING_F_SP_ENQ | RING_F_SC_DEQ);
7808a9867a6SSlawomir Mrozowicz }
7818a9867a6SSlawomir Mrozowicz 
7828a9867a6SSlawomir Mrozowicz 
7838a9867a6SSlawomir Mrozowicz /** Setup a queue pair */
7848a9867a6SSlawomir Mrozowicz static int
7858a9867a6SSlawomir Mrozowicz openssl_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
7868a9867a6SSlawomir Mrozowicz 		const struct rte_cryptodev_qp_conf *qp_conf,
787725d2a7fSFan Zhang 		int socket_id)
7888a9867a6SSlawomir Mrozowicz {
7898a9867a6SSlawomir Mrozowicz 	struct openssl_qp *qp = NULL;
7908a9867a6SSlawomir Mrozowicz 
7918a9867a6SSlawomir Mrozowicz 	/* Free memory prior to re-allocation if needed. */
7928a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL)
7938a9867a6SSlawomir Mrozowicz 		openssl_pmd_qp_release(dev, qp_id);
7948a9867a6SSlawomir Mrozowicz 
7958a9867a6SSlawomir Mrozowicz 	/* Allocate the queue pair data structure. */
7968a9867a6SSlawomir Mrozowicz 	qp = rte_zmalloc_socket("OPENSSL PMD Queue Pair", sizeof(*qp),
7978a9867a6SSlawomir Mrozowicz 					RTE_CACHE_LINE_SIZE, socket_id);
7988a9867a6SSlawomir Mrozowicz 	if (qp == NULL)
7998a9867a6SSlawomir Mrozowicz 		return -ENOMEM;
8008a9867a6SSlawomir Mrozowicz 
8018a9867a6SSlawomir Mrozowicz 	qp->id = qp_id;
8028a9867a6SSlawomir Mrozowicz 	dev->data->queue_pairs[qp_id] = qp;
8038a9867a6SSlawomir Mrozowicz 
8048a9867a6SSlawomir Mrozowicz 	if (openssl_pmd_qp_set_unique_name(dev, qp))
8058a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
8068a9867a6SSlawomir Mrozowicz 
8078a9867a6SSlawomir Mrozowicz 	qp->processed_ops = openssl_pmd_qp_create_processed_ops_ring(qp,
8088a9867a6SSlawomir Mrozowicz 			qp_conf->nb_descriptors, socket_id);
8098a9867a6SSlawomir Mrozowicz 	if (qp->processed_ops == NULL)
8108a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
8118a9867a6SSlawomir Mrozowicz 
812725d2a7fSFan Zhang 	qp->sess_mp = qp_conf->mp_session;
8138a9867a6SSlawomir Mrozowicz 
8148a9867a6SSlawomir Mrozowicz 	memset(&qp->stats, 0, sizeof(qp->stats));
8158a9867a6SSlawomir Mrozowicz 
8168a9867a6SSlawomir Mrozowicz 	return 0;
8178a9867a6SSlawomir Mrozowicz 
8188a9867a6SSlawomir Mrozowicz qp_setup_cleanup:
8198a9867a6SSlawomir Mrozowicz 	rte_free(qp);
8208a9867a6SSlawomir Mrozowicz 
8218a9867a6SSlawomir Mrozowicz 	return -1;
8228a9867a6SSlawomir Mrozowicz }
8238a9867a6SSlawomir Mrozowicz 
8243e9d6bd4SSunila Sahu /** Returns the size of the symmetric session structure */
8258a9867a6SSlawomir Mrozowicz static unsigned
826b1d71126SJack Bond-Preston openssl_pmd_sym_session_get_size(struct rte_cryptodev *dev)
8278a9867a6SSlawomir Mrozowicz {
828b1d71126SJack Bond-Preston 	/*
829b1d71126SJack Bond-Preston 	 * For 0 qps, return the max size of the session - this is necessary if
830b1d71126SJack Bond-Preston 	 * the user calls into this function to create the session mempool,
831b1d71126SJack Bond-Preston 	 * without first configuring the number of qps for the cryptodev.
832b1d71126SJack Bond-Preston 	 */
833b1d71126SJack Bond-Preston 	if (dev->data->nb_queue_pairs == 0) {
834b1d71126SJack Bond-Preston 		unsigned int max_nb_qps = ((struct openssl_private *)
835b1d71126SJack Bond-Preston 				dev->data->dev_private)->max_nb_qpairs;
836b1d71126SJack Bond-Preston 		return sizeof(struct openssl_session) +
83717d5bc61SJack Bond-Preston 				(sizeof(struct evp_ctx_pair) * max_nb_qps);
838b1d71126SJack Bond-Preston 	}
839b1d71126SJack Bond-Preston 
840b1d71126SJack Bond-Preston 	/*
841b1d71126SJack Bond-Preston 	 * With only one queue pair, the thread safety of multiple context
842b1d71126SJack Bond-Preston 	 * copies is not necessary, so don't allocate extra memory for the
843b1d71126SJack Bond-Preston 	 * array.
844b1d71126SJack Bond-Preston 	 */
845b1d71126SJack Bond-Preston 	if (dev->data->nb_queue_pairs == 1)
8468a9867a6SSlawomir Mrozowicz 		return sizeof(struct openssl_session);
847b1d71126SJack Bond-Preston 
848b1d71126SJack Bond-Preston 	/*
849b1d71126SJack Bond-Preston 	 * Otherwise, the size of the flexible array member should be enough to
85017d5bc61SJack Bond-Preston 	 * fit pointers to per-qp contexts. This is twice the number of queue
85117d5bc61SJack Bond-Preston 	 * pairs, to allow for auth and cipher contexts.
852b1d71126SJack Bond-Preston 	 */
853b1d71126SJack Bond-Preston 	return sizeof(struct openssl_session) +
85417d5bc61SJack Bond-Preston 		(sizeof(struct evp_ctx_pair) * dev->data->nb_queue_pairs);
8558a9867a6SSlawomir Mrozowicz }
8568a9867a6SSlawomir Mrozowicz 
8573e9d6bd4SSunila Sahu /** Returns the size of the asymmetric session structure */
8583e9d6bd4SSunila Sahu static unsigned
8593e9d6bd4SSunila Sahu openssl_pmd_asym_session_get_size(struct rte_cryptodev *dev __rte_unused)
8603e9d6bd4SSunila Sahu {
8613e9d6bd4SSunila Sahu 	return sizeof(struct openssl_asym_session);
8623e9d6bd4SSunila Sahu }
8633e9d6bd4SSunila Sahu 
8648a9867a6SSlawomir Mrozowicz /** Configure the session from a crypto xform chain */
865b3bbd9e5SSlawomir Mrozowicz static int
866b1d71126SJack Bond-Preston openssl_pmd_sym_session_configure(struct rte_cryptodev *dev,
867b3bbd9e5SSlawomir Mrozowicz 		struct rte_crypto_sym_xform *xform,
868bdce2564SAkhil Goyal 		struct rte_cryptodev_sym_session *sess)
8698a9867a6SSlawomir Mrozowicz {
8702a440d6aSAkhil Goyal 	void *sess_private_data = CRYPTODEV_GET_SYM_SESS_PRIV(sess);
87127391b53SPablo de Lara 	int ret;
872b3bbd9e5SSlawomir Mrozowicz 
8738a9867a6SSlawomir Mrozowicz 	if (unlikely(sess == NULL)) {
874094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR, "invalid session struct");
87527391b53SPablo de Lara 		return -EINVAL;
876b3bbd9e5SSlawomir Mrozowicz 	}
877b3bbd9e5SSlawomir Mrozowicz 
878b1d71126SJack Bond-Preston 	ret = openssl_set_session_parameters(sess_private_data, xform,
879b1d71126SJack Bond-Preston 			dev->data->nb_queue_pairs);
88027391b53SPablo de Lara 	if (ret != 0) {
881094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR, "failed configure session parameters");
882b3bbd9e5SSlawomir Mrozowicz 
883b3bbd9e5SSlawomir Mrozowicz 		/* Return session to mempool */
88427391b53SPablo de Lara 		return ret;
8858a9867a6SSlawomir Mrozowicz 	}
8868a9867a6SSlawomir Mrozowicz 
887b3bbd9e5SSlawomir Mrozowicz 	return 0;
8888a9867a6SSlawomir Mrozowicz }
8898a9867a6SSlawomir Mrozowicz 
8903e9d6bd4SSunila Sahu static int openssl_set_asym_session_parameters(
8913e9d6bd4SSunila Sahu 		struct openssl_asym_session *asym_session,
8923e9d6bd4SSunila Sahu 		struct rte_crypto_asym_xform *xform)
8933e9d6bd4SSunila Sahu {
8944c7ae22fSKai Ji 	int ret = -1;
8953e9d6bd4SSunila Sahu 
896ac42813aSSunila Sahu 	if ((xform->xform_type != RTE_CRYPTO_ASYM_XFORM_DH) &&
897ac42813aSSunila Sahu 		(xform->next != NULL)) {
8983e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "chained xfrms are not supported on %s",
8997e1e1277SAkhil Goyal 			rte_cryptodev_asym_get_xform_string(xform->xform_type));
9004c7ae22fSKai Ji 		return ret;
9013e9d6bd4SSunila Sahu 	}
9023e9d6bd4SSunila Sahu 
9033e9d6bd4SSunila Sahu 	switch (xform->xform_type) {
9043e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_RSA:
9053e9d6bd4SSunila Sahu 	{
9063e9d6bd4SSunila Sahu 		BIGNUM *n = NULL;
9073e9d6bd4SSunila Sahu 		BIGNUM *e = NULL;
9083e9d6bd4SSunila Sahu 		BIGNUM *d = NULL;
9093e9d6bd4SSunila Sahu 		BIGNUM *p = NULL, *q = NULL, *dmp1 = NULL;
9103e9d6bd4SSunila Sahu 		BIGNUM *iqmp = NULL, *dmq1 = NULL;
9113e9d6bd4SSunila Sahu 
9123e9d6bd4SSunila Sahu 		/* copy xfrm data into rsa struct */
9133e9d6bd4SSunila Sahu 		n = BN_bin2bn((const unsigned char *)xform->rsa.n.data,
9143e9d6bd4SSunila Sahu 				xform->rsa.n.length, n);
9153e9d6bd4SSunila Sahu 		e = BN_bin2bn((const unsigned char *)xform->rsa.e.data,
9163e9d6bd4SSunila Sahu 				xform->rsa.e.length, e);
9173e9d6bd4SSunila Sahu 
9183e9d6bd4SSunila Sahu 		if (!n || !e)
9193e9d6bd4SSunila Sahu 			goto err_rsa;
9203e9d6bd4SSunila Sahu 
9218a97564bSGowrishankar Muthukrishnan 		asym_session->u.r.pad = xform->rsa.padding.type;
922d7bd42f6SKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
923d7bd42f6SKai Ji 		OSSL_PARAM_BLD * param_bld = OSSL_PARAM_BLD_new();
924d7bd42f6SKai Ji 		if (!param_bld) {
925f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to allocate resources");
926d7bd42f6SKai Ji 			goto err_rsa;
927d7bd42f6SKai Ji 		}
928d7bd42f6SKai Ji 
929d7bd42f6SKai Ji 		if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_RSA_N, n)
930d7bd42f6SKai Ji 			|| !OSSL_PARAM_BLD_push_BN(param_bld,
931d7bd42f6SKai Ji 					OSSL_PKEY_PARAM_RSA_E, e)) {
932d7bd42f6SKai Ji 			OSSL_PARAM_BLD_free(param_bld);
933f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to allocate resources");
934d7bd42f6SKai Ji 			goto err_rsa;
935d7bd42f6SKai Ji 		}
936d7bd42f6SKai Ji 
937d7bd42f6SKai Ji 		if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) {
938d7bd42f6SKai Ji 			d = BN_bin2bn(
939d7bd42f6SKai Ji 			(const unsigned char *)xform->rsa.d.data,
940d7bd42f6SKai Ji 			xform->rsa.d.length,
941d7bd42f6SKai Ji 			d);
942d7bd42f6SKai Ji 			if (!d) {
943d7bd42f6SKai Ji 				OSSL_PARAM_BLD_free(param_bld);
944d7bd42f6SKai Ji 				goto err_rsa;
945d7bd42f6SKai Ji 			}
946d7bd42f6SKai Ji 		} else {
947d7bd42f6SKai Ji 			p = BN_bin2bn((const unsigned char *)
948d7bd42f6SKai Ji 					xform->rsa.qt.p.data,
949d7bd42f6SKai Ji 					xform->rsa.qt.p.length,
950d7bd42f6SKai Ji 					p);
951d7bd42f6SKai Ji 			q = BN_bin2bn((const unsigned char *)
952d7bd42f6SKai Ji 					xform->rsa.qt.q.data,
953d7bd42f6SKai Ji 					xform->rsa.qt.q.length,
954d7bd42f6SKai Ji 					q);
955d7bd42f6SKai Ji 			dmp1 = BN_bin2bn((const unsigned char *)
956d7bd42f6SKai Ji 					xform->rsa.qt.dP.data,
957d7bd42f6SKai Ji 					xform->rsa.qt.dP.length,
958d7bd42f6SKai Ji 					dmp1);
959d7bd42f6SKai Ji 			dmq1 = BN_bin2bn((const unsigned char *)
960d7bd42f6SKai Ji 					xform->rsa.qt.dQ.data,
961d7bd42f6SKai Ji 					xform->rsa.qt.dQ.length,
962d7bd42f6SKai Ji 					dmq1);
963d7bd42f6SKai Ji 			iqmp = BN_bin2bn((const unsigned char *)
964d7bd42f6SKai Ji 					xform->rsa.qt.qInv.data,
965d7bd42f6SKai Ji 					xform->rsa.qt.qInv.length,
966d7bd42f6SKai Ji 					iqmp);
967d7bd42f6SKai Ji 
968d7bd42f6SKai Ji 			if (!p || !q || !dmp1 || !dmq1 || !iqmp) {
969d7bd42f6SKai Ji 				OSSL_PARAM_BLD_free(param_bld);
970d7bd42f6SKai Ji 				goto err_rsa;
971d7bd42f6SKai Ji 			}
972d7bd42f6SKai Ji 
973d7bd42f6SKai Ji 			if (!OSSL_PARAM_BLD_push_BN(param_bld,
974d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_FACTOR1, p)
975d7bd42f6SKai Ji 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
976d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_FACTOR2, q)
977d7bd42f6SKai Ji 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
978d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_EXPONENT1, dmp1)
979d7bd42f6SKai Ji 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
980d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_EXPONENT2, dmq1)
981d7bd42f6SKai Ji 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
982d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_COEFFICIENT1, iqmp)) {
983d7bd42f6SKai Ji 				OSSL_PARAM_BLD_free(param_bld);
984d7bd42f6SKai Ji 				goto err_rsa;
985d7bd42f6SKai Ji 			}
986d7bd42f6SKai Ji 		}
987d7bd42f6SKai Ji 
988d7bd42f6SKai Ji 		if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_RSA_N, n)
989d7bd42f6SKai Ji 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_RSA_E, e)
990d7bd42f6SKai Ji 			|| !OSSL_PARAM_BLD_push_BN(param_bld,
991d7bd42f6SKai Ji 						OSSL_PKEY_PARAM_RSA_D, d)) {
992d7bd42f6SKai Ji 			OSSL_PARAM_BLD_free(param_bld);
993d7bd42f6SKai Ji 			goto err_rsa;
994d7bd42f6SKai Ji 		}
995d7bd42f6SKai Ji 
996d7bd42f6SKai Ji 		EVP_PKEY_CTX *key_ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL);
997d7bd42f6SKai Ji 		EVP_PKEY *pkey = NULL;
998d7bd42f6SKai Ji 		EVP_PKEY_CTX *rsa_ctx = NULL;
999d7bd42f6SKai Ji 		OSSL_PARAM *params = NULL;
1000d7bd42f6SKai Ji 
1001d7bd42f6SKai Ji 		params = OSSL_PARAM_BLD_to_param(param_bld);
1002d7bd42f6SKai Ji 		if (!params) {
1003d7bd42f6SKai Ji 			OSSL_PARAM_BLD_free(param_bld);
1004d7bd42f6SKai Ji 			goto err_rsa;
1005d7bd42f6SKai Ji 		}
1006d7bd42f6SKai Ji 
1007d7bd42f6SKai Ji 		if (key_ctx == NULL
1008d7bd42f6SKai Ji 			|| EVP_PKEY_fromdata_init(key_ctx) <= 0
1009d7bd42f6SKai Ji 			|| EVP_PKEY_fromdata(key_ctx, &pkey,
1010d7bd42f6SKai Ji 				EVP_PKEY_KEYPAIR, params) <= 0) {
1011d7bd42f6SKai Ji 			OSSL_PARAM_free(params);
1012d7bd42f6SKai Ji 			goto err_rsa;
1013d7bd42f6SKai Ji 		}
1014d7bd42f6SKai Ji 
1015d7bd42f6SKai Ji 		rsa_ctx = EVP_PKEY_CTX_new(pkey, NULL);
1016d7bd42f6SKai Ji 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA;
1017d7bd42f6SKai Ji 		asym_session->u.r.ctx = rsa_ctx;
10189d91c304SGowrishankar Muthukrishnan 		EVP_PKEY_free(pkey);
1019d7bd42f6SKai Ji 		EVP_PKEY_CTX_free(key_ctx);
10209d91c304SGowrishankar Muthukrishnan 		OSSL_PARAM_BLD_free(param_bld);
1021d7bd42f6SKai Ji 		OSSL_PARAM_free(params);
10229d91c304SGowrishankar Muthukrishnan 		ret = 0;
1023d7bd42f6SKai Ji #else
10243e9d6bd4SSunila Sahu 		RSA *rsa = RSA_new();
10253e9d6bd4SSunila Sahu 		if (rsa == NULL)
10263e9d6bd4SSunila Sahu 			goto err_rsa;
10273e9d6bd4SSunila Sahu 
10283e9d6bd4SSunila Sahu 		if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) {
10293e9d6bd4SSunila Sahu 			d = BN_bin2bn(
10303e9d6bd4SSunila Sahu 			(const unsigned char *)xform->rsa.d.data,
10313e9d6bd4SSunila Sahu 			xform->rsa.d.length,
10323e9d6bd4SSunila Sahu 			d);
10333e9d6bd4SSunila Sahu 			if (!d) {
10343e9d6bd4SSunila Sahu 				RSA_free(rsa);
10353e9d6bd4SSunila Sahu 				goto err_rsa;
10363e9d6bd4SSunila Sahu 			}
10373e9d6bd4SSunila Sahu 		} else {
10383e9d6bd4SSunila Sahu 			p = BN_bin2bn((const unsigned char *)
10393e9d6bd4SSunila Sahu 					xform->rsa.qt.p.data,
10403e9d6bd4SSunila Sahu 					xform->rsa.qt.p.length,
10413e9d6bd4SSunila Sahu 					p);
10423e9d6bd4SSunila Sahu 			q = BN_bin2bn((const unsigned char *)
10433e9d6bd4SSunila Sahu 					xform->rsa.qt.q.data,
10443e9d6bd4SSunila Sahu 					xform->rsa.qt.q.length,
10453e9d6bd4SSunila Sahu 					q);
10463e9d6bd4SSunila Sahu 			dmp1 = BN_bin2bn((const unsigned char *)
10473e9d6bd4SSunila Sahu 					xform->rsa.qt.dP.data,
10483e9d6bd4SSunila Sahu 					xform->rsa.qt.dP.length,
10493e9d6bd4SSunila Sahu 					dmp1);
10503e9d6bd4SSunila Sahu 			dmq1 = BN_bin2bn((const unsigned char *)
10513e9d6bd4SSunila Sahu 					xform->rsa.qt.dQ.data,
10523e9d6bd4SSunila Sahu 					xform->rsa.qt.dQ.length,
10533e9d6bd4SSunila Sahu 					dmq1);
10543e9d6bd4SSunila Sahu 			iqmp = BN_bin2bn((const unsigned char *)
10553e9d6bd4SSunila Sahu 					xform->rsa.qt.qInv.data,
10563e9d6bd4SSunila Sahu 					xform->rsa.qt.qInv.length,
10573e9d6bd4SSunila Sahu 					iqmp);
10583e9d6bd4SSunila Sahu 
10593e9d6bd4SSunila Sahu 			if (!p || !q || !dmp1 || !dmq1 || !iqmp) {
10603e9d6bd4SSunila Sahu 				RSA_free(rsa);
10613e9d6bd4SSunila Sahu 				goto err_rsa;
10623e9d6bd4SSunila Sahu 			}
10630b5284adSAshish Gupta 			ret = set_rsa_params(rsa, p, q);
10643e9d6bd4SSunila Sahu 			if (ret) {
10653e9d6bd4SSunila Sahu 				OPENSSL_LOG(ERR,
1066f665790aSDavid Marchand 					"failed to set rsa params");
10673e9d6bd4SSunila Sahu 				RSA_free(rsa);
10683e9d6bd4SSunila Sahu 				goto err_rsa;
10693e9d6bd4SSunila Sahu 			}
10700b5284adSAshish Gupta 			ret = set_rsa_crt_params(rsa, dmp1, dmq1, iqmp);
10713e9d6bd4SSunila Sahu 			if (ret) {
10723e9d6bd4SSunila Sahu 				OPENSSL_LOG(ERR,
1073f665790aSDavid Marchand 					"failed to set crt params");
10743e9d6bd4SSunila Sahu 				RSA_free(rsa);
10753e9d6bd4SSunila Sahu 				/*
10763e9d6bd4SSunila Sahu 				 * set already populated params to NULL
10773e9d6bd4SSunila Sahu 				 * as its freed by call to RSA_free
10783e9d6bd4SSunila Sahu 				 */
10793e9d6bd4SSunila Sahu 				p = q = NULL;
10803e9d6bd4SSunila Sahu 				goto err_rsa;
10813e9d6bd4SSunila Sahu 			}
10823e9d6bd4SSunila Sahu 		}
10833e9d6bd4SSunila Sahu 
10840b5284adSAshish Gupta 		ret = set_rsa_keys(rsa, n, e, d);
10853e9d6bd4SSunila Sahu 		if (ret) {
1086f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "Failed to load rsa keys");
10873e9d6bd4SSunila Sahu 			RSA_free(rsa);
10884c7ae22fSKai Ji 			return ret;
10893e9d6bd4SSunila Sahu 		}
10903e9d6bd4SSunila Sahu 		asym_session->u.r.rsa = rsa;
10913e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA;
109247a85ddaSCiara Power 		break;
1093d7bd42f6SKai Ji #endif
10943e9d6bd4SSunila Sahu err_rsa:
109577411bd6SArek Kusztal 		BN_clear_free(n);
109677411bd6SArek Kusztal 		BN_clear_free(e);
109777411bd6SArek Kusztal 		BN_clear_free(d);
109877411bd6SArek Kusztal 		BN_clear_free(p);
109977411bd6SArek Kusztal 		BN_clear_free(q);
110077411bd6SArek Kusztal 		BN_clear_free(dmp1);
110177411bd6SArek Kusztal 		BN_clear_free(dmq1);
110277411bd6SArek Kusztal 		BN_clear_free(iqmp);
11033e9d6bd4SSunila Sahu 
11049d91c304SGowrishankar Muthukrishnan 		return ret;
11053e9d6bd4SSunila Sahu 	}
11063e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
11073e9d6bd4SSunila Sahu 	{
11083e9d6bd4SSunila Sahu 		struct rte_crypto_modex_xform *xfrm = &(xform->modex);
11093e9d6bd4SSunila Sahu 
11103e9d6bd4SSunila Sahu 		BN_CTX *ctx = BN_CTX_new();
11113e9d6bd4SSunila Sahu 		if (ctx == NULL) {
11123e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR,
1113f665790aSDavid Marchand 				" failed to allocate resources");
11144c7ae22fSKai Ji 			return ret;
11153e9d6bd4SSunila Sahu 		}
11163e9d6bd4SSunila Sahu 		BN_CTX_start(ctx);
11173e9d6bd4SSunila Sahu 		BIGNUM *mod = BN_CTX_get(ctx);
11183e9d6bd4SSunila Sahu 		BIGNUM *exp = BN_CTX_get(ctx);
11193e9d6bd4SSunila Sahu 		if (mod == NULL || exp == NULL) {
11203e9d6bd4SSunila Sahu 			BN_CTX_end(ctx);
11213e9d6bd4SSunila Sahu 			BN_CTX_free(ctx);
11224c7ae22fSKai Ji 			return ret;
11233e9d6bd4SSunila Sahu 		}
11243e9d6bd4SSunila Sahu 
11253e9d6bd4SSunila Sahu 		mod = BN_bin2bn((const unsigned char *)
11263e9d6bd4SSunila Sahu 				xfrm->modulus.data,
11273e9d6bd4SSunila Sahu 				xfrm->modulus.length, mod);
11283e9d6bd4SSunila Sahu 		exp = BN_bin2bn((const unsigned char *)
11293e9d6bd4SSunila Sahu 				xfrm->exponent.data,
11303e9d6bd4SSunila Sahu 				xfrm->exponent.length, exp);
11313e9d6bd4SSunila Sahu 		asym_session->u.e.ctx = ctx;
11323e9d6bd4SSunila Sahu 		asym_session->u.e.mod = mod;
11333e9d6bd4SSunila Sahu 		asym_session->u.e.exp = exp;
11343e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
11353e9d6bd4SSunila Sahu 		break;
11363e9d6bd4SSunila Sahu 	}
11373e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
11383e9d6bd4SSunila Sahu 	{
11393e9d6bd4SSunila Sahu 		struct rte_crypto_modinv_xform *xfrm = &(xform->modinv);
11403e9d6bd4SSunila Sahu 
11413e9d6bd4SSunila Sahu 		BN_CTX *ctx = BN_CTX_new();
11423e9d6bd4SSunila Sahu 		if (ctx == NULL) {
11433e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR,
1144f665790aSDavid Marchand 				" failed to allocate resources");
11454c7ae22fSKai Ji 			return ret;
11463e9d6bd4SSunila Sahu 		}
11473e9d6bd4SSunila Sahu 		BN_CTX_start(ctx);
11483e9d6bd4SSunila Sahu 		BIGNUM *mod = BN_CTX_get(ctx);
11493e9d6bd4SSunila Sahu 		if (mod == NULL) {
11503e9d6bd4SSunila Sahu 			BN_CTX_end(ctx);
11513e9d6bd4SSunila Sahu 			BN_CTX_free(ctx);
11524c7ae22fSKai Ji 			return ret;
11533e9d6bd4SSunila Sahu 		}
11543e9d6bd4SSunila Sahu 
11553e9d6bd4SSunila Sahu 		mod = BN_bin2bn((const unsigned char *)
11563e9d6bd4SSunila Sahu 				xfrm->modulus.data,
11573e9d6bd4SSunila Sahu 				xfrm->modulus.length,
11583e9d6bd4SSunila Sahu 				mod);
11593e9d6bd4SSunila Sahu 		asym_session->u.m.ctx = ctx;
11603e9d6bd4SSunila Sahu 		asym_session->u.m.modulus = mod;
11613e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODINV;
11623e9d6bd4SSunila Sahu 		break;
11633e9d6bd4SSunila Sahu 	}
1164ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DH:
1165ac42813aSSunila Sahu 	{
1166c794b40cSKai Ji 		DH *dh = NULL;
1167c794b40cSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
116847a85ddaSCiara Power 		BIGNUM **p = &asym_session->u.dh.p;
116947a85ddaSCiara Power 		BIGNUM **g = &asym_session->u.dh.g;
117047a85ddaSCiara Power 
117147a85ddaSCiara Power 		*p = BN_bin2bn((const unsigned char *)
117247a85ddaSCiara Power 				xform->dh.p.data,
117347a85ddaSCiara Power 				xform->dh.p.length,
117447a85ddaSCiara Power 				*p);
117547a85ddaSCiara Power 		*g = BN_bin2bn((const unsigned char *)
117647a85ddaSCiara Power 				xform->dh.g.data,
117747a85ddaSCiara Power 				xform->dh.g.length,
117847a85ddaSCiara Power 				*g);
117947a85ddaSCiara Power 		if (!*p || !*g)
118047a85ddaSCiara Power 			goto err_dh;
118147a85ddaSCiara Power 
1182c794b40cSKai Ji 		OSSL_PARAM_BLD *param_bld = NULL;
1183c794b40cSKai Ji 		param_bld = OSSL_PARAM_BLD_new();
1184c794b40cSKai Ji 		if (!param_bld) {
1185f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to allocate resources");
1186c794b40cSKai Ji 			goto err_dh;
1187c794b40cSKai Ji 		}
1188c794b40cSKai Ji 		if ((!OSSL_PARAM_BLD_push_utf8_string(param_bld,
1189c794b40cSKai Ji 					"group", "ffdhe2048", 0))
1190c794b40cSKai Ji 			|| (!OSSL_PARAM_BLD_push_BN(param_bld,
119147a85ddaSCiara Power 					OSSL_PKEY_PARAM_FFC_P, *p))
1192c794b40cSKai Ji 			|| (!OSSL_PARAM_BLD_push_BN(param_bld,
119347a85ddaSCiara Power 					OSSL_PKEY_PARAM_FFC_G, *g))) {
1194c794b40cSKai Ji 			OSSL_PARAM_BLD_free(param_bld);
1195c794b40cSKai Ji 			goto err_dh;
1196c794b40cSKai Ji 		}
1197c794b40cSKai Ji 
1198c794b40cSKai Ji 		OSSL_PARAM_BLD *param_bld_peer = NULL;
1199c794b40cSKai Ji 		param_bld_peer = OSSL_PARAM_BLD_new();
1200c794b40cSKai Ji 		if (!param_bld_peer) {
1201f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to allocate resources");
1202c794b40cSKai Ji 			OSSL_PARAM_BLD_free(param_bld);
1203c794b40cSKai Ji 			goto err_dh;
1204c794b40cSKai Ji 		}
1205c794b40cSKai Ji 		if ((!OSSL_PARAM_BLD_push_utf8_string(param_bld_peer,
1206c794b40cSKai Ji 					"group", "ffdhe2048", 0))
1207c794b40cSKai Ji 			|| (!OSSL_PARAM_BLD_push_BN(param_bld_peer,
120847a85ddaSCiara Power 					OSSL_PKEY_PARAM_FFC_P, *p))
1209c794b40cSKai Ji 			|| (!OSSL_PARAM_BLD_push_BN(param_bld_peer,
121047a85ddaSCiara Power 					OSSL_PKEY_PARAM_FFC_G, *g))) {
1211c794b40cSKai Ji 			OSSL_PARAM_BLD_free(param_bld);
1212c794b40cSKai Ji 			OSSL_PARAM_BLD_free(param_bld_peer);
1213c794b40cSKai Ji 			goto err_dh;
1214c794b40cSKai Ji 		}
1215c794b40cSKai Ji 
1216c794b40cSKai Ji 		asym_session->u.dh.param_bld = param_bld;
1217c794b40cSKai Ji 		asym_session->u.dh.param_bld_peer = param_bld_peer;
1218c794b40cSKai Ji #else
121947a85ddaSCiara Power 		BIGNUM *p = NULL;
122047a85ddaSCiara Power 		BIGNUM *g = NULL;
122147a85ddaSCiara Power 
122247a85ddaSCiara Power 		p = BN_bin2bn((const unsigned char *)
122347a85ddaSCiara Power 				xform->dh.p.data,
122447a85ddaSCiara Power 				xform->dh.p.length,
122547a85ddaSCiara Power 				p);
122647a85ddaSCiara Power 		g = BN_bin2bn((const unsigned char *)
122747a85ddaSCiara Power 				xform->dh.g.data,
122847a85ddaSCiara Power 				xform->dh.g.length,
122947a85ddaSCiara Power 				g);
123047a85ddaSCiara Power 		if (!p || !g)
123147a85ddaSCiara Power 			goto err_dh;
123247a85ddaSCiara Power 
1233c794b40cSKai Ji 		dh = DH_new();
1234ac42813aSSunila Sahu 		if (dh == NULL) {
1235ac42813aSSunila Sahu 			OPENSSL_LOG(ERR,
1236f665790aSDavid Marchand 				"failed to allocate resources");
1237ac42813aSSunila Sahu 			goto err_dh;
1238ac42813aSSunila Sahu 		}
12390b5284adSAshish Gupta 		ret = set_dh_params(dh, p, g);
1240ac42813aSSunila Sahu 		if (ret) {
1241ac42813aSSunila Sahu 			DH_free(dh);
1242ac42813aSSunila Sahu 			goto err_dh;
1243ac42813aSSunila Sahu 		}
1244c794b40cSKai Ji #endif
1245ac42813aSSunila Sahu 		asym_session->u.dh.dh_key = dh;
1246ac42813aSSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DH;
1247ac42813aSSunila Sahu 		break;
1248ac42813aSSunila Sahu 
1249ac42813aSSunila Sahu err_dh:
1250f665790aSDavid Marchand 		OPENSSL_LOG(ERR, " failed to set dh params");
125147a85ddaSCiara Power #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
125247a85ddaSCiara Power 		BN_free(*p);
125347a85ddaSCiara Power 		BN_free(*g);
125447a85ddaSCiara Power #else
1255ac42813aSSunila Sahu 		BN_free(p);
1256ac42813aSSunila Sahu 		BN_free(g);
125747a85ddaSCiara Power #endif
1258ac42813aSSunila Sahu 		return -1;
1259ac42813aSSunila Sahu 	}
1260ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DSA:
1261ac42813aSSunila Sahu 	{
12624c7ae22fSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
126347a85ddaSCiara Power 		BIGNUM **p = &asym_session->u.s.p;
126447a85ddaSCiara Power 		BIGNUM **g = &asym_session->u.s.g;
126547a85ddaSCiara Power 		BIGNUM **q = &asym_session->u.s.q;
126647a85ddaSCiara Power 		BIGNUM **priv_key = &asym_session->u.s.priv_key;
12679d91c304SGowrishankar Muthukrishnan 		BIGNUM *pub_key = NULL;
12684c7ae22fSKai Ji 		OSSL_PARAM_BLD *param_bld = NULL;
12694c7ae22fSKai Ji 
127047a85ddaSCiara Power 		*p = BN_bin2bn((const unsigned char *)
12714c7ae22fSKai Ji 				xform->dsa.p.data,
12724c7ae22fSKai Ji 				xform->dsa.p.length,
127347a85ddaSCiara Power 				*p);
12744c7ae22fSKai Ji 
127547a85ddaSCiara Power 		*g = BN_bin2bn((const unsigned char *)
12764c7ae22fSKai Ji 				xform->dsa.g.data,
12774c7ae22fSKai Ji 				xform->dsa.g.length,
127847a85ddaSCiara Power 				*g);
12794c7ae22fSKai Ji 
128047a85ddaSCiara Power 		*q = BN_bin2bn((const unsigned char *)
12814c7ae22fSKai Ji 				xform->dsa.q.data,
12824c7ae22fSKai Ji 				xform->dsa.q.length,
128347a85ddaSCiara Power 				*q);
128447a85ddaSCiara Power 		if (!*p || !*q || !*g)
12854c7ae22fSKai Ji 			goto err_dsa;
12864c7ae22fSKai Ji 
128747a85ddaSCiara Power 		*priv_key = BN_bin2bn((const unsigned char *)
12884c7ae22fSKai Ji 				xform->dsa.x.data,
12894c7ae22fSKai Ji 				xform->dsa.x.length,
129047a85ddaSCiara Power 				*priv_key);
129147a85ddaSCiara Power 		if (*priv_key == NULL)
12924c7ae22fSKai Ji 			goto err_dsa;
12934c7ae22fSKai Ji 
12944c7ae22fSKai Ji 		param_bld = OSSL_PARAM_BLD_new();
12954c7ae22fSKai Ji 		if (!param_bld) {
1296f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to allocate resources");
12974c7ae22fSKai Ji 			goto err_dsa;
12984c7ae22fSKai Ji 		}
12994c7ae22fSKai Ji 
130047a85ddaSCiara Power 		if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_FFC_P, *p)
130147a85ddaSCiara Power 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_FFC_G, *g)
130247a85ddaSCiara Power 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_FFC_Q, *q)
130347a85ddaSCiara Power 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_PRIV_KEY,
130447a85ddaSCiara Power 			*priv_key)) {
13054c7ae22fSKai Ji 			OSSL_PARAM_BLD_free(param_bld);
1306f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to allocate resources");
13074c7ae22fSKai Ji 			goto err_dsa;
13084c7ae22fSKai Ji 		}
13094c7ae22fSKai Ji 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DSA;
13104c7ae22fSKai Ji 		asym_session->u.s.param_bld = param_bld;
13114c7ae22fSKai Ji 
13124c7ae22fSKai Ji 		break;
13134c7ae22fSKai Ji #else
1314ac42813aSSunila Sahu 		BIGNUM *p = NULL, *g = NULL;
1315ac42813aSSunila Sahu 		BIGNUM *q = NULL, *priv_key = NULL;
1316ac42813aSSunila Sahu 		BIGNUM *pub_key = BN_new();
1317ac42813aSSunila Sahu 		BN_zero(pub_key);
1318ac42813aSSunila Sahu 
1319ac42813aSSunila Sahu 		p = BN_bin2bn((const unsigned char *)
1320ac42813aSSunila Sahu 				xform->dsa.p.data,
1321ac42813aSSunila Sahu 				xform->dsa.p.length,
1322ac42813aSSunila Sahu 				p);
1323ac42813aSSunila Sahu 
1324ac42813aSSunila Sahu 		g = BN_bin2bn((const unsigned char *)
1325ac42813aSSunila Sahu 				xform->dsa.g.data,
1326ac42813aSSunila Sahu 				xform->dsa.g.length,
1327ac42813aSSunila Sahu 				g);
1328ac42813aSSunila Sahu 
1329ac42813aSSunila Sahu 		q = BN_bin2bn((const unsigned char *)
1330ac42813aSSunila Sahu 				xform->dsa.q.data,
1331ac42813aSSunila Sahu 				xform->dsa.q.length,
1332ac42813aSSunila Sahu 				q);
1333ac42813aSSunila Sahu 		if (!p || !q || !g)
1334ac42813aSSunila Sahu 			goto err_dsa;
1335ac42813aSSunila Sahu 
1336ac42813aSSunila Sahu 		priv_key = BN_bin2bn((const unsigned char *)
1337ac42813aSSunila Sahu 				xform->dsa.x.data,
1338ac42813aSSunila Sahu 				xform->dsa.x.length,
1339ac42813aSSunila Sahu 				priv_key);
1340ac42813aSSunila Sahu 		if (priv_key == NULL)
1341ac42813aSSunila Sahu 			goto err_dsa;
1342ac42813aSSunila Sahu 
1343ac42813aSSunila Sahu 		DSA *dsa = DSA_new();
1344ac42813aSSunila Sahu 		if (dsa == NULL) {
1345ac42813aSSunila Sahu 			OPENSSL_LOG(ERR,
1346f665790aSDavid Marchand 				" failed to allocate resources");
1347ac42813aSSunila Sahu 			goto err_dsa;
1348ac42813aSSunila Sahu 		}
1349ac42813aSSunila Sahu 
13500b5284adSAshish Gupta 		ret = set_dsa_params(dsa, p, q, g);
1351ac42813aSSunila Sahu 		if (ret) {
1352ac42813aSSunila Sahu 			DSA_free(dsa);
1353f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "Failed to dsa params");
1354ac42813aSSunila Sahu 			goto err_dsa;
1355ac42813aSSunila Sahu 		}
1356ac42813aSSunila Sahu 
1357ac42813aSSunila Sahu 		/*
1358ac42813aSSunila Sahu 		 * openssl 1.1.0 mandate that public key can't be
1359ac42813aSSunila Sahu 		 * NULL in very first call. so set a dummy pub key.
1360ac42813aSSunila Sahu 		 * to keep consistency, lets follow same approach for
1361ac42813aSSunila Sahu 		 * both versions
1362ac42813aSSunila Sahu 		 */
1363ac42813aSSunila Sahu 		/* just set dummy public for very 1st call */
13640b5284adSAshish Gupta 		ret = set_dsa_keys(dsa, pub_key, priv_key);
1365ac42813aSSunila Sahu 		if (ret) {
1366ac42813aSSunila Sahu 			DSA_free(dsa);
1367f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "Failed to set keys");
136847a85ddaSCiara Power 			goto err_dsa;
1369ac42813aSSunila Sahu 		}
1370ac42813aSSunila Sahu 		asym_session->u.s.dsa = dsa;
1371ac42813aSSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DSA;
1372ac42813aSSunila Sahu 		break;
13734c7ae22fSKai Ji #endif
1374ac42813aSSunila Sahu err_dsa:
137547a85ddaSCiara Power #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
137647a85ddaSCiara Power 		BN_free(*p);
137747a85ddaSCiara Power 		BN_free(*q);
137847a85ddaSCiara Power 		BN_free(*g);
137947a85ddaSCiara Power 		BN_free(*priv_key);
138047a85ddaSCiara Power #else
1381ac42813aSSunila Sahu 		BN_free(p);
1382ac42813aSSunila Sahu 		BN_free(q);
1383ac42813aSSunila Sahu 		BN_free(g);
1384ac42813aSSunila Sahu 		BN_free(priv_key);
138547a85ddaSCiara Power #endif
1386ac42813aSSunila Sahu 		BN_free(pub_key);
1387ac42813aSSunila Sahu 		return -1;
1388ac42813aSSunila Sahu 	}
13895a74d7fdSGowrishankar Muthukrishnan 	case RTE_CRYPTO_ASYM_XFORM_ECFPM:
13905a74d7fdSGowrishankar Muthukrishnan 	{
13915a74d7fdSGowrishankar Muthukrishnan #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
13925a74d7fdSGowrishankar Muthukrishnan 		EC_GROUP *ecgrp = NULL;
13935a74d7fdSGowrishankar Muthukrishnan 
13945a74d7fdSGowrishankar Muthukrishnan 		asym_session->xfrm_type = xform->xform_type;
13955a74d7fdSGowrishankar Muthukrishnan 
13965a74d7fdSGowrishankar Muthukrishnan 		switch (xform->ec.curve_id) {
13975a74d7fdSGowrishankar Muthukrishnan 		case RTE_CRYPTO_EC_GROUP_SECP192R1:
13985a74d7fdSGowrishankar Muthukrishnan 			ecgrp = EC_GROUP_new_by_curve_name(NID_secp192k1);
13995a74d7fdSGowrishankar Muthukrishnan 			break;
14005a74d7fdSGowrishankar Muthukrishnan 		case RTE_CRYPTO_EC_GROUP_SECP224R1:
14015a74d7fdSGowrishankar Muthukrishnan 			ecgrp = EC_GROUP_new_by_curve_name(NID_secp224r1);
14025a74d7fdSGowrishankar Muthukrishnan 			break;
14035a74d7fdSGowrishankar Muthukrishnan 		case RTE_CRYPTO_EC_GROUP_SECP256R1:
14045a74d7fdSGowrishankar Muthukrishnan 			ecgrp = EC_GROUP_new_by_curve_name(NID_secp256k1);
14055a74d7fdSGowrishankar Muthukrishnan 			break;
14065a74d7fdSGowrishankar Muthukrishnan 		case RTE_CRYPTO_EC_GROUP_SECP384R1:
14075a74d7fdSGowrishankar Muthukrishnan 			ecgrp = EC_GROUP_new_by_curve_name(NID_secp384r1);
14085a74d7fdSGowrishankar Muthukrishnan 			break;
14095a74d7fdSGowrishankar Muthukrishnan 		case RTE_CRYPTO_EC_GROUP_SECP521R1:
14105a74d7fdSGowrishankar Muthukrishnan 			ecgrp = EC_GROUP_new_by_curve_name(NID_secp521r1);
14115a74d7fdSGowrishankar Muthukrishnan 			break;
14125a74d7fdSGowrishankar Muthukrishnan 		case RTE_CRYPTO_EC_GROUP_ED25519:
14135a74d7fdSGowrishankar Muthukrishnan 			ecgrp = EC_GROUP_new_by_curve_name(NID_ED25519);
14145a74d7fdSGowrishankar Muthukrishnan 			break;
14155a74d7fdSGowrishankar Muthukrishnan 		case RTE_CRYPTO_EC_GROUP_ED448:
14165a74d7fdSGowrishankar Muthukrishnan 			ecgrp = EC_GROUP_new_by_curve_name(NID_ED448);
14175a74d7fdSGowrishankar Muthukrishnan 			break;
14185a74d7fdSGowrishankar Muthukrishnan 		default:
14195a74d7fdSGowrishankar Muthukrishnan 			break;
14205a74d7fdSGowrishankar Muthukrishnan 		}
14215a74d7fdSGowrishankar Muthukrishnan 
14225a74d7fdSGowrishankar Muthukrishnan 		asym_session->u.ec.curve_id = xform->ec.curve_id;
14235a74d7fdSGowrishankar Muthukrishnan 		asym_session->u.ec.group = ecgrp;
14245a74d7fdSGowrishankar Muthukrishnan 		break;
14255a74d7fdSGowrishankar Muthukrishnan #else
14265a74d7fdSGowrishankar Muthukrishnan 		OPENSSL_LOG(WARNING, "ECFPM unsupported for OpenSSL Version < 3.0");
14275a74d7fdSGowrishankar Muthukrishnan 		return -ENOTSUP;
14285a74d7fdSGowrishankar Muthukrishnan #endif
14295a74d7fdSGowrishankar Muthukrishnan 	}
14303b7d638fSGowrishankar Muthukrishnan 	case RTE_CRYPTO_ASYM_XFORM_SM2:
14313b7d638fSGowrishankar Muthukrishnan 	{
14323b7d638fSGowrishankar Muthukrishnan #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
143399218c39SGowrishankar Muthukrishnan #ifndef OPENSSL_NO_SM2
14343b7d638fSGowrishankar Muthukrishnan 		OSSL_PARAM_BLD *param_bld = NULL;
14353b7d638fSGowrishankar Muthukrishnan 		OSSL_PARAM *params = NULL;
1436badc0c6fSGowrishankar Muthukrishnan 		BIGNUM *pkey_bn = NULL;
143747a85ddaSCiara Power 		uint8_t pubkey[65];
1438badc0c6fSGowrishankar Muthukrishnan 		size_t len = 0;
14393b7d638fSGowrishankar Muthukrishnan 		int ret = -1;
14403b7d638fSGowrishankar Muthukrishnan 
14413b7d638fSGowrishankar Muthukrishnan 		param_bld = OSSL_PARAM_BLD_new();
14423b7d638fSGowrishankar Muthukrishnan 		if (!param_bld) {
1443f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to allocate params");
14443b7d638fSGowrishankar Muthukrishnan 			goto err_sm2;
14453b7d638fSGowrishankar Muthukrishnan 		}
14463b7d638fSGowrishankar Muthukrishnan 
14473b7d638fSGowrishankar Muthukrishnan 		ret = OSSL_PARAM_BLD_push_utf8_string(param_bld,
14483b7d638fSGowrishankar Muthukrishnan 				OSSL_ASYM_CIPHER_PARAM_DIGEST, "SM3", 0);
14493b7d638fSGowrishankar Muthukrishnan 		if (!ret) {
1450f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to push params");
14513b7d638fSGowrishankar Muthukrishnan 			goto err_sm2;
14523b7d638fSGowrishankar Muthukrishnan 		}
14533b7d638fSGowrishankar Muthukrishnan 
1454badc0c6fSGowrishankar Muthukrishnan 		ret = OSSL_PARAM_BLD_push_utf8_string(param_bld,
1455badc0c6fSGowrishankar Muthukrishnan 				OSSL_PKEY_PARAM_GROUP_NAME, "SM2", 0);
1456badc0c6fSGowrishankar Muthukrishnan 		if (!ret) {
1457f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to push params");
1458badc0c6fSGowrishankar Muthukrishnan 			goto err_sm2;
1459badc0c6fSGowrishankar Muthukrishnan 		}
1460badc0c6fSGowrishankar Muthukrishnan 
1461badc0c6fSGowrishankar Muthukrishnan 		pkey_bn = BN_bin2bn((const unsigned char *)xform->ec.pkey.data,
1462badc0c6fSGowrishankar Muthukrishnan 							xform->ec.pkey.length, pkey_bn);
1463badc0c6fSGowrishankar Muthukrishnan 
1464badc0c6fSGowrishankar Muthukrishnan 		ret = OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_PRIV_KEY,
1465badc0c6fSGowrishankar Muthukrishnan 									 pkey_bn);
1466badc0c6fSGowrishankar Muthukrishnan 		if (!ret) {
1467f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to push params");
1468badc0c6fSGowrishankar Muthukrishnan 			goto err_sm2;
1469badc0c6fSGowrishankar Muthukrishnan 		}
1470badc0c6fSGowrishankar Muthukrishnan 
1471badc0c6fSGowrishankar Muthukrishnan 		memset(pubkey, 0, sizeof(pubkey));
1472badc0c6fSGowrishankar Muthukrishnan 		pubkey[0] = 0x04;
1473badc0c6fSGowrishankar Muthukrishnan 		len += 1;
1474badc0c6fSGowrishankar Muthukrishnan 		memcpy(&pubkey[len], xform->ec.q.x.data, xform->ec.q.x.length);
1475badc0c6fSGowrishankar Muthukrishnan 		len += xform->ec.q.x.length;
1476badc0c6fSGowrishankar Muthukrishnan 		memcpy(&pubkey[len], xform->ec.q.y.data, xform->ec.q.y.length);
1477badc0c6fSGowrishankar Muthukrishnan 		len += xform->ec.q.y.length;
1478badc0c6fSGowrishankar Muthukrishnan 
1479badc0c6fSGowrishankar Muthukrishnan 		ret = OSSL_PARAM_BLD_push_octet_string(param_bld,
1480badc0c6fSGowrishankar Muthukrishnan 				OSSL_PKEY_PARAM_PUB_KEY, pubkey, len);
1481badc0c6fSGowrishankar Muthukrishnan 		if (!ret) {
1482f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to push params");
1483badc0c6fSGowrishankar Muthukrishnan 			goto err_sm2;
1484badc0c6fSGowrishankar Muthukrishnan 		}
1485badc0c6fSGowrishankar Muthukrishnan 
14863b7d638fSGowrishankar Muthukrishnan 		params = OSSL_PARAM_BLD_to_param(param_bld);
14873b7d638fSGowrishankar Muthukrishnan 		if (!params) {
1488f665790aSDavid Marchand 			OPENSSL_LOG(ERR, "failed to push params");
14893b7d638fSGowrishankar Muthukrishnan 			goto err_sm2;
14903b7d638fSGowrishankar Muthukrishnan 		}
14913b7d638fSGowrishankar Muthukrishnan 
14923b7d638fSGowrishankar Muthukrishnan 		asym_session->u.sm2.params = params;
14933b7d638fSGowrishankar Muthukrishnan 		OSSL_PARAM_BLD_free(param_bld);
14949d91c304SGowrishankar Muthukrishnan 		BN_free(pkey_bn);
14953b7d638fSGowrishankar Muthukrishnan 
14963b7d638fSGowrishankar Muthukrishnan 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_SM2;
14973b7d638fSGowrishankar Muthukrishnan 		break;
14983b7d638fSGowrishankar Muthukrishnan err_sm2:
14993b7d638fSGowrishankar Muthukrishnan 		if (param_bld)
15003b7d638fSGowrishankar Muthukrishnan 			OSSL_PARAM_BLD_free(param_bld);
15013b7d638fSGowrishankar Muthukrishnan 
15023b7d638fSGowrishankar Muthukrishnan 		if (asym_session->u.sm2.params)
15033b7d638fSGowrishankar Muthukrishnan 			OSSL_PARAM_free(asym_session->u.sm2.params);
15043b7d638fSGowrishankar Muthukrishnan 
15059d91c304SGowrishankar Muthukrishnan 		BN_free(pkey_bn);
15063b7d638fSGowrishankar Muthukrishnan 		return -1;
15076e892f5aSCiara Power #else
150899218c39SGowrishankar Muthukrishnan 		OPENSSL_LOG(WARNING, "SM2 unsupported in current OpenSSL Version");
150999218c39SGowrishankar Muthukrishnan 		return -ENOTSUP;
151099218c39SGowrishankar Muthukrishnan #endif
151199218c39SGowrishankar Muthukrishnan #else
15126e892f5aSCiara Power 		OPENSSL_LOG(WARNING, "SM2 unsupported for OpenSSL Version < 3.0");
15136e892f5aSCiara Power 		return -ENOTSUP;
15143b7d638fSGowrishankar Muthukrishnan #endif
15153b7d638fSGowrishankar Muthukrishnan 	}
15165a74d7fdSGowrishankar Muthukrishnan 	case RTE_CRYPTO_ASYM_XFORM_EDDSA:
15175a74d7fdSGowrishankar Muthukrishnan 	{
15185a74d7fdSGowrishankar Muthukrishnan #if (OPENSSL_VERSION_NUMBER >= 0x30300000L)
15195a74d7fdSGowrishankar Muthukrishnan 		OSSL_PARAM_BLD *param_bld = NULL;
15205a74d7fdSGowrishankar Muthukrishnan 		OSSL_PARAM *params = NULL;
15215a74d7fdSGowrishankar Muthukrishnan 		int ret = -1;
15225a74d7fdSGowrishankar Muthukrishnan 
15235a74d7fdSGowrishankar Muthukrishnan 		asym_session->u.eddsa.curve_id = xform->ec.curve_id;
15245a74d7fdSGowrishankar Muthukrishnan 
15255a74d7fdSGowrishankar Muthukrishnan 		param_bld = OSSL_PARAM_BLD_new();
15265a74d7fdSGowrishankar Muthukrishnan 		if (!param_bld) {
15275a74d7fdSGowrishankar Muthukrishnan 			OPENSSL_LOG(ERR, "failed to allocate params");
15285a74d7fdSGowrishankar Muthukrishnan 			goto err_eddsa;
15295a74d7fdSGowrishankar Muthukrishnan 		}
15305a74d7fdSGowrishankar Muthukrishnan 
15315a74d7fdSGowrishankar Muthukrishnan 		ret = OSSL_PARAM_BLD_push_utf8_string(param_bld,
15325a74d7fdSGowrishankar Muthukrishnan 			  OSSL_PKEY_PARAM_GROUP_NAME, "ED25519", sizeof("ED25519"));
15335a74d7fdSGowrishankar Muthukrishnan 		if (!ret) {
15345a74d7fdSGowrishankar Muthukrishnan 			OPENSSL_LOG(ERR, "failed to push params");
15355a74d7fdSGowrishankar Muthukrishnan 			goto err_eddsa;
15365a74d7fdSGowrishankar Muthukrishnan 		}
15375a74d7fdSGowrishankar Muthukrishnan 
15385a74d7fdSGowrishankar Muthukrishnan 		ret = OSSL_PARAM_BLD_push_octet_string(param_bld, OSSL_PKEY_PARAM_PRIV_KEY,
15395a74d7fdSGowrishankar Muthukrishnan 				xform->ec.pkey.data, xform->ec.pkey.length);
15405a74d7fdSGowrishankar Muthukrishnan 		if (!ret) {
15415a74d7fdSGowrishankar Muthukrishnan 			OPENSSL_LOG(ERR, "failed to push params");
15425a74d7fdSGowrishankar Muthukrishnan 			goto err_eddsa;
15435a74d7fdSGowrishankar Muthukrishnan 		}
15445a74d7fdSGowrishankar Muthukrishnan 
15455a74d7fdSGowrishankar Muthukrishnan 		ret = OSSL_PARAM_BLD_push_octet_string(param_bld, OSSL_PKEY_PARAM_PUB_KEY,
15465a74d7fdSGowrishankar Muthukrishnan 				xform->ec.q.x.data, xform->ec.q.x.length);
15475a74d7fdSGowrishankar Muthukrishnan 		if (!ret) {
15485a74d7fdSGowrishankar Muthukrishnan 			OPENSSL_LOG(ERR, "failed to push params");
15495a74d7fdSGowrishankar Muthukrishnan 			goto err_eddsa;
15505a74d7fdSGowrishankar Muthukrishnan 		}
15515a74d7fdSGowrishankar Muthukrishnan 
15525a74d7fdSGowrishankar Muthukrishnan 		params = OSSL_PARAM_BLD_to_param(param_bld);
15535a74d7fdSGowrishankar Muthukrishnan 		if (!params) {
15545a74d7fdSGowrishankar Muthukrishnan 			OPENSSL_LOG(ERR, "failed to push params");
15555a74d7fdSGowrishankar Muthukrishnan 			goto err_eddsa;
15565a74d7fdSGowrishankar Muthukrishnan 		}
15575a74d7fdSGowrishankar Muthukrishnan 
15585a74d7fdSGowrishankar Muthukrishnan 		asym_session->u.eddsa.params = params;
15595a74d7fdSGowrishankar Muthukrishnan 		OSSL_PARAM_BLD_free(param_bld);
15605a74d7fdSGowrishankar Muthukrishnan 
15615a74d7fdSGowrishankar Muthukrishnan 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_EDDSA;
15625a74d7fdSGowrishankar Muthukrishnan 		break;
15635a74d7fdSGowrishankar Muthukrishnan err_eddsa:
15645a74d7fdSGowrishankar Muthukrishnan 		if (param_bld)
15655a74d7fdSGowrishankar Muthukrishnan 			OSSL_PARAM_BLD_free(param_bld);
15665a74d7fdSGowrishankar Muthukrishnan 
15675a74d7fdSGowrishankar Muthukrishnan 		if (asym_session->u.eddsa.params)
15685a74d7fdSGowrishankar Muthukrishnan 			OSSL_PARAM_free(asym_session->u.eddsa.params);
15695a74d7fdSGowrishankar Muthukrishnan 
15705a74d7fdSGowrishankar Muthukrishnan 		return -1;
15715a74d7fdSGowrishankar Muthukrishnan #else
15725a74d7fdSGowrishankar Muthukrishnan 		OPENSSL_LOG(WARNING, "EdDSA unsupported for OpenSSL Version < 3.3");
15735a74d7fdSGowrishankar Muthukrishnan 		return -ENOTSUP;
15745a74d7fdSGowrishankar Muthukrishnan #endif
15755a74d7fdSGowrishankar Muthukrishnan 	}
15763e9d6bd4SSunila Sahu 	default:
15774c7ae22fSKai Ji 		return ret;
15783e9d6bd4SSunila Sahu 	}
15793e9d6bd4SSunila Sahu 
15803e9d6bd4SSunila Sahu 	return 0;
15813e9d6bd4SSunila Sahu }
15823e9d6bd4SSunila Sahu 
15833e9d6bd4SSunila Sahu /** Configure the session from a crypto xform chain */
15843e9d6bd4SSunila Sahu static int
15853e9d6bd4SSunila Sahu openssl_pmd_asym_session_configure(struct rte_cryptodev *dev __rte_unused,
15863e9d6bd4SSunila Sahu 		struct rte_crypto_asym_xform *xform,
15871f1e4b7cSCiara Power 		struct rte_cryptodev_asym_session *sess)
15883e9d6bd4SSunila Sahu {
15893e9d6bd4SSunila Sahu 	void *asym_sess_private_data;
15903e9d6bd4SSunila Sahu 	int ret;
15913e9d6bd4SSunila Sahu 
15923e9d6bd4SSunila Sahu 	if (unlikely(sess == NULL)) {
15933e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "invalid asymmetric session struct");
15943e9d6bd4SSunila Sahu 		return -EINVAL;
15953e9d6bd4SSunila Sahu 	}
15963e9d6bd4SSunila Sahu 
15971f1e4b7cSCiara Power 	asym_sess_private_data = sess->sess_private_data;
15983e9d6bd4SSunila Sahu 	ret = openssl_set_asym_session_parameters(asym_sess_private_data,
15993e9d6bd4SSunila Sahu 			xform);
16003e9d6bd4SSunila Sahu 	if (ret != 0) {
16013e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "failed configure session parameters");
16023e9d6bd4SSunila Sahu 		return ret;
16033e9d6bd4SSunila Sahu 	}
16043e9d6bd4SSunila Sahu 
16053e9d6bd4SSunila Sahu 	return 0;
16063e9d6bd4SSunila Sahu }
16078a9867a6SSlawomir Mrozowicz 
16088a9867a6SSlawomir Mrozowicz /** Clear the memory of session so it doesn't leave key material behind */
16098a9867a6SSlawomir Mrozowicz static void
1610bdce2564SAkhil Goyal openssl_pmd_sym_session_clear(struct rte_cryptodev *dev __rte_unused,
1611b3bbd9e5SSlawomir Mrozowicz 		struct rte_cryptodev_sym_session *sess)
16128a9867a6SSlawomir Mrozowicz {
16132a440d6aSAkhil Goyal 	void *sess_priv = CRYPTODEV_GET_SYM_SESS_PRIV(sess);
1614b3bbd9e5SSlawomir Mrozowicz 
1615b3bbd9e5SSlawomir Mrozowicz 	/* Zero out the whole structure */
1616b3bbd9e5SSlawomir Mrozowicz 	openssl_reset_session(sess_priv);
16178a9867a6SSlawomir Mrozowicz }
16188a9867a6SSlawomir Mrozowicz 
16193e9d6bd4SSunila Sahu static void openssl_reset_asym_session(struct openssl_asym_session *sess)
16203e9d6bd4SSunila Sahu {
16213e9d6bd4SSunila Sahu 	switch (sess->xfrm_type) {
16223e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_RSA:
1623d7bd42f6SKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1624d7bd42f6SKai Ji 		EVP_PKEY_CTX_free(sess->u.r.ctx);
1625d7bd42f6SKai Ji #else
16263e9d6bd4SSunila Sahu 		if (sess->u.r.rsa)
16273e9d6bd4SSunila Sahu 			RSA_free(sess->u.r.rsa);
1628d7bd42f6SKai Ji #endif
16293e9d6bd4SSunila Sahu 		break;
16303e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
16313e9d6bd4SSunila Sahu 		if (sess->u.e.ctx) {
16323e9d6bd4SSunila Sahu 			BN_CTX_end(sess->u.e.ctx);
16333e9d6bd4SSunila Sahu 			BN_CTX_free(sess->u.e.ctx);
16343e9d6bd4SSunila Sahu 		}
16353e9d6bd4SSunila Sahu 		break;
16363e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
16373e9d6bd4SSunila Sahu 		if (sess->u.m.ctx) {
16383e9d6bd4SSunila Sahu 			BN_CTX_end(sess->u.m.ctx);
16393e9d6bd4SSunila Sahu 			BN_CTX_free(sess->u.m.ctx);
16403e9d6bd4SSunila Sahu 		}
16413e9d6bd4SSunila Sahu 		break;
1642ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DH:
1643c794b40cSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
16449d91c304SGowrishankar Muthukrishnan 		OSSL_PARAM_BLD_free(sess->u.dh.param_bld);
16459d91c304SGowrishankar Muthukrishnan 		OSSL_PARAM_BLD_free(sess->u.dh.param_bld_peer);
1646c794b40cSKai Ji 		sess->u.dh.param_bld = NULL;
1647c794b40cSKai Ji 		sess->u.dh.param_bld_peer = NULL;
1648c794b40cSKai Ji #else
1649ac42813aSSunila Sahu 		if (sess->u.dh.dh_key)
1650ac42813aSSunila Sahu 			DH_free(sess->u.dh.dh_key);
1651c794b40cSKai Ji #endif
165247a85ddaSCiara Power 		BN_clear_free(sess->u.dh.p);
165347a85ddaSCiara Power 		BN_clear_free(sess->u.dh.g);
1654ac42813aSSunila Sahu 		break;
1655ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DSA:
16564c7ae22fSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
16579d91c304SGowrishankar Muthukrishnan 		OSSL_PARAM_BLD_free(sess->u.s.param_bld);
16584c7ae22fSKai Ji 		sess->u.s.param_bld = NULL;
165947a85ddaSCiara Power 		BN_clear_free(sess->u.s.p);
166047a85ddaSCiara Power 		BN_clear_free(sess->u.s.q);
166147a85ddaSCiara Power 		BN_clear_free(sess->u.s.g);
166247a85ddaSCiara Power 		BN_clear_free(sess->u.s.priv_key);
16634c7ae22fSKai Ji #else
1664ac42813aSSunila Sahu 		if (sess->u.s.dsa)
1665ac42813aSSunila Sahu 			DSA_free(sess->u.s.dsa);
16664c7ae22fSKai Ji #endif
1667ac42813aSSunila Sahu 		break;
16683b7d638fSGowrishankar Muthukrishnan 	case RTE_CRYPTO_ASYM_XFORM_SM2:
16693b7d638fSGowrishankar Muthukrishnan #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
16703b7d638fSGowrishankar Muthukrishnan 		OSSL_PARAM_free(sess->u.sm2.params);
16713b7d638fSGowrishankar Muthukrishnan #endif
16725a74d7fdSGowrishankar Muthukrishnan 		break;
16735a74d7fdSGowrishankar Muthukrishnan 	case RTE_CRYPTO_ASYM_XFORM_EDDSA:
16745a74d7fdSGowrishankar Muthukrishnan #if (OPENSSL_VERSION_NUMBER >= 0x30300000L)
16755a74d7fdSGowrishankar Muthukrishnan 		OSSL_PARAM_free(sess->u.eddsa.params);
16765a74d7fdSGowrishankar Muthukrishnan #endif
16775a74d7fdSGowrishankar Muthukrishnan 		break;
16783e9d6bd4SSunila Sahu 	default:
16793e9d6bd4SSunila Sahu 		break;
16803e9d6bd4SSunila Sahu 	}
16813e9d6bd4SSunila Sahu }
16823e9d6bd4SSunila Sahu 
16833e9d6bd4SSunila Sahu /** Clear the memory of asymmetric session
16843e9d6bd4SSunila Sahu  * so it doesn't leave key material behind
16853e9d6bd4SSunila Sahu  */
16863e9d6bd4SSunila Sahu static void
16871f1e4b7cSCiara Power openssl_pmd_asym_session_clear(struct rte_cryptodev *dev __rte_unused,
16883e9d6bd4SSunila Sahu 		struct rte_cryptodev_asym_session *sess)
16893e9d6bd4SSunila Sahu {
16901f1e4b7cSCiara Power 	void *sess_priv = sess->sess_private_data;
16913e9d6bd4SSunila Sahu 
16923e9d6bd4SSunila Sahu 	/* Zero out the whole structure */
16933e9d6bd4SSunila Sahu 	if (sess_priv) {
16943e9d6bd4SSunila Sahu 		openssl_reset_asym_session(sess_priv);
16953e9d6bd4SSunila Sahu 		memset(sess_priv, 0, sizeof(struct openssl_asym_session));
16963e9d6bd4SSunila Sahu 	}
16973e9d6bd4SSunila Sahu }
16983e9d6bd4SSunila Sahu 
16998a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops openssl_pmd_ops = {
17008a9867a6SSlawomir Mrozowicz 		.dev_configure		= openssl_pmd_config,
17018a9867a6SSlawomir Mrozowicz 		.dev_start		= openssl_pmd_start,
17028a9867a6SSlawomir Mrozowicz 		.dev_stop		= openssl_pmd_stop,
17038a9867a6SSlawomir Mrozowicz 		.dev_close		= openssl_pmd_close,
17048a9867a6SSlawomir Mrozowicz 
17058a9867a6SSlawomir Mrozowicz 		.stats_get		= openssl_pmd_stats_get,
17068a9867a6SSlawomir Mrozowicz 		.stats_reset		= openssl_pmd_stats_reset,
17078a9867a6SSlawomir Mrozowicz 
17088a9867a6SSlawomir Mrozowicz 		.dev_infos_get		= openssl_pmd_info_get,
17098a9867a6SSlawomir Mrozowicz 
17108a9867a6SSlawomir Mrozowicz 		.queue_pair_setup	= openssl_pmd_qp_setup,
17118a9867a6SSlawomir Mrozowicz 		.queue_pair_release	= openssl_pmd_qp_release,
17128a9867a6SSlawomir Mrozowicz 
1713012c5076SPablo de Lara 		.sym_session_get_size	= openssl_pmd_sym_session_get_size,
17143e9d6bd4SSunila Sahu 		.asym_session_get_size	= openssl_pmd_asym_session_get_size,
1715012c5076SPablo de Lara 		.sym_session_configure	= openssl_pmd_sym_session_configure,
17163e9d6bd4SSunila Sahu 		.asym_session_configure	= openssl_pmd_asym_session_configure,
17173e9d6bd4SSunila Sahu 		.sym_session_clear	= openssl_pmd_sym_session_clear,
17183e9d6bd4SSunila Sahu 		.asym_session_clear	= openssl_pmd_asym_session_clear
17198a9867a6SSlawomir Mrozowicz };
17208a9867a6SSlawomir Mrozowicz 
17218a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops *rte_openssl_pmd_ops = &openssl_pmd_ops;
1722