xref: /dpdk/drivers/crypto/openssl/rte_openssl_pmd_ops.c (revision 4c7ae22f1f837558cd287fab642812a304146daa)
15566a3e3SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
25566a3e3SBruce Richardson  * Copyright(c) 2016-2017 Intel Corporation
38a9867a6SSlawomir Mrozowicz  */
48a9867a6SSlawomir Mrozowicz 
57360749fSHeinrich Schuchardt #define OPENSSL_API_COMPAT 0x10100000L
67360749fSHeinrich Schuchardt 
78a9867a6SSlawomir Mrozowicz #include <string.h>
88a9867a6SSlawomir Mrozowicz 
98a9867a6SSlawomir Mrozowicz #include <rte_common.h>
108a9867a6SSlawomir Mrozowicz #include <rte_malloc.h>
11af668035SAkhil Goyal #include <cryptodev_pmd.h>
128a9867a6SSlawomir Mrozowicz 
13b28f28aeSDharmik Thakkar #include "openssl_pmd_private.h"
143e9d6bd4SSunila Sahu #include "compat.h"
15d7bd42f6SKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
16d7bd42f6SKai Ji #include <openssl/provider.h>
17d7bd42f6SKai Ji #include <openssl/core_names.h>
18d7bd42f6SKai Ji #include <openssl/param_build.h>
19d7bd42f6SKai Ji #endif
208a9867a6SSlawomir Mrozowicz 
218a9867a6SSlawomir Mrozowicz static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
228a9867a6SSlawomir Mrozowicz 	{	/* MD5 HMAC */
238a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
248a9867a6SSlawomir Mrozowicz 		{.sym = {
258a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
268a9867a6SSlawomir Mrozowicz 			{.auth = {
278a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5_HMAC,
288a9867a6SSlawomir Mrozowicz 				.block_size = 64,
298a9867a6SSlawomir Mrozowicz 				.key_size = {
30e5e7bc71SPablo de Lara 					.min = 1,
318a9867a6SSlawomir Mrozowicz 					.max = 64,
32e5e7bc71SPablo de Lara 					.increment = 1
338a9867a6SSlawomir Mrozowicz 				},
348a9867a6SSlawomir Mrozowicz 				.digest_size = {
35c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
368a9867a6SSlawomir Mrozowicz 					.max = 16,
37c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
388a9867a6SSlawomir Mrozowicz 				},
39acf86169SPablo de Lara 				.iv_size = { 0 }
408a9867a6SSlawomir Mrozowicz 			}, }
418a9867a6SSlawomir Mrozowicz 		}, }
428a9867a6SSlawomir Mrozowicz 	},
438a9867a6SSlawomir Mrozowicz 	{	/* MD5 */
448a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
458a9867a6SSlawomir Mrozowicz 		{.sym = {
468a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
478a9867a6SSlawomir Mrozowicz 			{.auth = {
488a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5,
498a9867a6SSlawomir Mrozowicz 				.block_size = 64,
508a9867a6SSlawomir Mrozowicz 				.key_size = {
518a9867a6SSlawomir Mrozowicz 					.min = 0,
528a9867a6SSlawomir Mrozowicz 					.max = 0,
538a9867a6SSlawomir Mrozowicz 					.increment = 0
548a9867a6SSlawomir Mrozowicz 				},
558a9867a6SSlawomir Mrozowicz 				.digest_size = {
568a9867a6SSlawomir Mrozowicz 					.min = 16,
578a9867a6SSlawomir Mrozowicz 					.max = 16,
588a9867a6SSlawomir Mrozowicz 					.increment = 0
598a9867a6SSlawomir Mrozowicz 				},
60acf86169SPablo de Lara 				.iv_size = { 0 }
618a9867a6SSlawomir Mrozowicz 			}, }
628a9867a6SSlawomir Mrozowicz 		}, }
638a9867a6SSlawomir Mrozowicz 	},
648a9867a6SSlawomir Mrozowicz 	{	/* SHA1 HMAC */
658a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
668a9867a6SSlawomir Mrozowicz 		{.sym = {
678a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
688a9867a6SSlawomir Mrozowicz 			{.auth = {
698a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
708a9867a6SSlawomir Mrozowicz 				.block_size = 64,
718a9867a6SSlawomir Mrozowicz 				.key_size = {
72e5e7bc71SPablo de Lara 					.min = 1,
738a9867a6SSlawomir Mrozowicz 					.max = 64,
74e5e7bc71SPablo de Lara 					.increment = 1
758a9867a6SSlawomir Mrozowicz 				},
768a9867a6SSlawomir Mrozowicz 				.digest_size = {
77c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
788a9867a6SSlawomir Mrozowicz 					.max = 20,
79c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
808a9867a6SSlawomir Mrozowicz 				},
81acf86169SPablo de Lara 				.iv_size = { 0 }
828a9867a6SSlawomir Mrozowicz 			}, }
838a9867a6SSlawomir Mrozowicz 		}, }
848a9867a6SSlawomir Mrozowicz 	},
858a9867a6SSlawomir Mrozowicz 	{	/* SHA1 */
868a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
878a9867a6SSlawomir Mrozowicz 		{.sym = {
888a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
898a9867a6SSlawomir Mrozowicz 			{.auth = {
908a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1,
918a9867a6SSlawomir Mrozowicz 				.block_size = 64,
928a9867a6SSlawomir Mrozowicz 				.key_size = {
938a9867a6SSlawomir Mrozowicz 					.min = 0,
948a9867a6SSlawomir Mrozowicz 					.max = 0,
958a9867a6SSlawomir Mrozowicz 					.increment = 0
968a9867a6SSlawomir Mrozowicz 				},
978a9867a6SSlawomir Mrozowicz 				.digest_size = {
988a9867a6SSlawomir Mrozowicz 					.min = 20,
998a9867a6SSlawomir Mrozowicz 					.max = 20,
1008a9867a6SSlawomir Mrozowicz 					.increment = 0
1018a9867a6SSlawomir Mrozowicz 				},
102acf86169SPablo de Lara 				.iv_size = { 0 }
1038a9867a6SSlawomir Mrozowicz 			}, }
1048a9867a6SSlawomir Mrozowicz 		}, }
1058a9867a6SSlawomir Mrozowicz 	},
1068a9867a6SSlawomir Mrozowicz 	{	/* SHA224 HMAC */
1078a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1088a9867a6SSlawomir Mrozowicz 		{.sym = {
1098a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1108a9867a6SSlawomir Mrozowicz 			{.auth = {
1118a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
1128a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1138a9867a6SSlawomir Mrozowicz 				.key_size = {
114e5e7bc71SPablo de Lara 					.min = 1,
1158a9867a6SSlawomir Mrozowicz 					.max = 64,
116e5e7bc71SPablo de Lara 					.increment = 1
1178a9867a6SSlawomir Mrozowicz 				},
1188a9867a6SSlawomir Mrozowicz 				.digest_size = {
119c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
1208a9867a6SSlawomir Mrozowicz 					.max = 28,
121c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
1228a9867a6SSlawomir Mrozowicz 				},
123acf86169SPablo de Lara 				.iv_size = { 0 }
1248a9867a6SSlawomir Mrozowicz 			}, }
1258a9867a6SSlawomir Mrozowicz 		}, }
1268a9867a6SSlawomir Mrozowicz 	},
1278a9867a6SSlawomir Mrozowicz 	{	/* SHA224 */
1288a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1298a9867a6SSlawomir Mrozowicz 		{.sym = {
1308a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1318a9867a6SSlawomir Mrozowicz 			{.auth = {
1328a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224,
1338a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1348a9867a6SSlawomir Mrozowicz 				.key_size = {
1358a9867a6SSlawomir Mrozowicz 					.min = 0,
1368a9867a6SSlawomir Mrozowicz 					.max = 0,
1378a9867a6SSlawomir Mrozowicz 					.increment = 0
1388a9867a6SSlawomir Mrozowicz 				},
1398a9867a6SSlawomir Mrozowicz 				.digest_size = {
140c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
1418a9867a6SSlawomir Mrozowicz 					.max = 28,
142c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
1438a9867a6SSlawomir Mrozowicz 				},
144acf86169SPablo de Lara 				.iv_size = { 0 }
1458a9867a6SSlawomir Mrozowicz 			}, }
1468a9867a6SSlawomir Mrozowicz 		}, }
1478a9867a6SSlawomir Mrozowicz 	},
1488a9867a6SSlawomir Mrozowicz 	{	/* SHA256 HMAC */
1498a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1508a9867a6SSlawomir Mrozowicz 		{.sym = {
1518a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1528a9867a6SSlawomir Mrozowicz 			{.auth = {
1538a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
1548a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1558a9867a6SSlawomir Mrozowicz 				.key_size = {
156e5e7bc71SPablo de Lara 					.min = 1,
1578a9867a6SSlawomir Mrozowicz 					.max = 64,
158e5e7bc71SPablo de Lara 					.increment = 1
1598a9867a6SSlawomir Mrozowicz 				},
1608a9867a6SSlawomir Mrozowicz 				.digest_size = {
161c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
1628a9867a6SSlawomir Mrozowicz 					.max = 32,
163c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
1648a9867a6SSlawomir Mrozowicz 				},
165acf86169SPablo de Lara 				.iv_size = { 0 }
1668a9867a6SSlawomir Mrozowicz 			}, }
1678a9867a6SSlawomir Mrozowicz 		}, }
1688a9867a6SSlawomir Mrozowicz 	},
1698a9867a6SSlawomir Mrozowicz 	{	/* SHA256 */
1708a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1718a9867a6SSlawomir Mrozowicz 		{.sym = {
1728a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1738a9867a6SSlawomir Mrozowicz 			{.auth = {
1748a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256,
1758a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1768a9867a6SSlawomir Mrozowicz 				.key_size = {
1778a9867a6SSlawomir Mrozowicz 					.min = 0,
1788a9867a6SSlawomir Mrozowicz 					.max = 0,
1798a9867a6SSlawomir Mrozowicz 					.increment = 0
1808a9867a6SSlawomir Mrozowicz 				},
1818a9867a6SSlawomir Mrozowicz 				.digest_size = {
1828a9867a6SSlawomir Mrozowicz 					.min = 32,
1838a9867a6SSlawomir Mrozowicz 					.max = 32,
1848a9867a6SSlawomir Mrozowicz 					.increment = 0
1858a9867a6SSlawomir Mrozowicz 				},
186acf86169SPablo de Lara 				.iv_size = { 0 }
1878a9867a6SSlawomir Mrozowicz 			}, }
1888a9867a6SSlawomir Mrozowicz 		}, }
1898a9867a6SSlawomir Mrozowicz 	},
1908a9867a6SSlawomir Mrozowicz 	{	/* SHA384 HMAC */
1918a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1928a9867a6SSlawomir Mrozowicz 		{.sym = {
1938a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1948a9867a6SSlawomir Mrozowicz 			{.auth = {
1958a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
1968a9867a6SSlawomir Mrozowicz 				.block_size = 128,
1978a9867a6SSlawomir Mrozowicz 				.key_size = {
198e5e7bc71SPablo de Lara 					.min = 1,
1998a9867a6SSlawomir Mrozowicz 					.max = 128,
200e5e7bc71SPablo de Lara 					.increment = 1
2018a9867a6SSlawomir Mrozowicz 				},
2028a9867a6SSlawomir Mrozowicz 				.digest_size = {
203c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
2048a9867a6SSlawomir Mrozowicz 					.max = 48,
205c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
2068a9867a6SSlawomir Mrozowicz 				},
207acf86169SPablo de Lara 				.iv_size = { 0 }
2088a9867a6SSlawomir Mrozowicz 			}, }
2098a9867a6SSlawomir Mrozowicz 		}, }
2108a9867a6SSlawomir Mrozowicz 	},
2118a9867a6SSlawomir Mrozowicz 	{	/* SHA384 */
2128a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2138a9867a6SSlawomir Mrozowicz 		{.sym = {
2148a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2158a9867a6SSlawomir Mrozowicz 			{.auth = {
2168a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384,
2178a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2188a9867a6SSlawomir Mrozowicz 				.key_size = {
2198a9867a6SSlawomir Mrozowicz 					.min = 0,
2208a9867a6SSlawomir Mrozowicz 					.max = 0,
2218a9867a6SSlawomir Mrozowicz 					.increment = 0
2228a9867a6SSlawomir Mrozowicz 				},
2238a9867a6SSlawomir Mrozowicz 				.digest_size = {
2248a9867a6SSlawomir Mrozowicz 					.min = 48,
2258a9867a6SSlawomir Mrozowicz 					.max = 48,
2268a9867a6SSlawomir Mrozowicz 					.increment = 0
2278a9867a6SSlawomir Mrozowicz 				},
228acf86169SPablo de Lara 				.iv_size = { 0 }
2298a9867a6SSlawomir Mrozowicz 			}, }
2308a9867a6SSlawomir Mrozowicz 		}, }
2318a9867a6SSlawomir Mrozowicz 	},
2328a9867a6SSlawomir Mrozowicz 	{	/* SHA512 HMAC */
2338a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2348a9867a6SSlawomir Mrozowicz 		{.sym = {
2358a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2368a9867a6SSlawomir Mrozowicz 			{.auth = {
2378a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
2388a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2398a9867a6SSlawomir Mrozowicz 				.key_size = {
240e5e7bc71SPablo de Lara 					.min = 1,
2418a9867a6SSlawomir Mrozowicz 					.max = 128,
242e5e7bc71SPablo de Lara 					.increment = 1
2438a9867a6SSlawomir Mrozowicz 				},
2448a9867a6SSlawomir Mrozowicz 				.digest_size = {
245c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
2468a9867a6SSlawomir Mrozowicz 					.max = 64,
247c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
2488a9867a6SSlawomir Mrozowicz 				},
249acf86169SPablo de Lara 				.iv_size = { 0 }
2508a9867a6SSlawomir Mrozowicz 			}, }
2518a9867a6SSlawomir Mrozowicz 		}, }
2528a9867a6SSlawomir Mrozowicz 	},
2538a9867a6SSlawomir Mrozowicz 	{	/* SHA512  */
2548a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2558a9867a6SSlawomir Mrozowicz 		{.sym = {
2568a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2578a9867a6SSlawomir Mrozowicz 			{.auth = {
2588a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512,
2598a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2608a9867a6SSlawomir Mrozowicz 				.key_size = {
2618a9867a6SSlawomir Mrozowicz 					.min = 0,
2628a9867a6SSlawomir Mrozowicz 					.max = 0,
2638a9867a6SSlawomir Mrozowicz 					.increment = 0
2648a9867a6SSlawomir Mrozowicz 				},
2658a9867a6SSlawomir Mrozowicz 				.digest_size = {
2668a9867a6SSlawomir Mrozowicz 					.min = 64,
2678a9867a6SSlawomir Mrozowicz 					.max = 64,
2688a9867a6SSlawomir Mrozowicz 					.increment = 0
2698a9867a6SSlawomir Mrozowicz 				},
270acf86169SPablo de Lara 				.iv_size = { 0 }
2718a9867a6SSlawomir Mrozowicz 			}, }
2728a9867a6SSlawomir Mrozowicz 		}, }
2738a9867a6SSlawomir Mrozowicz 	},
2748a9867a6SSlawomir Mrozowicz 	{	/* AES CBC */
2758a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2768a9867a6SSlawomir Mrozowicz 		{.sym = {
2778a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
2788a9867a6SSlawomir Mrozowicz 			{.cipher = {
2798a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CBC,
2808a9867a6SSlawomir Mrozowicz 				.block_size = 16,
2818a9867a6SSlawomir Mrozowicz 				.key_size = {
2828a9867a6SSlawomir Mrozowicz 					.min = 16,
2838a9867a6SSlawomir Mrozowicz 					.max = 32,
2848a9867a6SSlawomir Mrozowicz 					.increment = 8
2858a9867a6SSlawomir Mrozowicz 				},
2868a9867a6SSlawomir Mrozowicz 				.iv_size = {
2878a9867a6SSlawomir Mrozowicz 					.min = 16,
2888a9867a6SSlawomir Mrozowicz 					.max = 16,
2898a9867a6SSlawomir Mrozowicz 					.increment = 0
2908a9867a6SSlawomir Mrozowicz 				}
2918a9867a6SSlawomir Mrozowicz 			}, }
2928a9867a6SSlawomir Mrozowicz 		}, }
2938a9867a6SSlawomir Mrozowicz 	},
2948a9867a6SSlawomir Mrozowicz 	{	/* AES CTR */
2958a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2968a9867a6SSlawomir Mrozowicz 		{.sym = {
2978a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
2988a9867a6SSlawomir Mrozowicz 			{.cipher = {
2998a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
3008a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3018a9867a6SSlawomir Mrozowicz 				.key_size = {
3028a9867a6SSlawomir Mrozowicz 					.min = 16,
3038a9867a6SSlawomir Mrozowicz 					.max = 32,
3048a9867a6SSlawomir Mrozowicz 					.increment = 8
3058a9867a6SSlawomir Mrozowicz 				},
3068a9867a6SSlawomir Mrozowicz 				.iv_size = {
3078a9867a6SSlawomir Mrozowicz 					.min = 16,
3088a9867a6SSlawomir Mrozowicz 					.max = 16,
3098a9867a6SSlawomir Mrozowicz 					.increment = 0
3108a9867a6SSlawomir Mrozowicz 				}
3118a9867a6SSlawomir Mrozowicz 			}, }
3128a9867a6SSlawomir Mrozowicz 		}, }
3138a9867a6SSlawomir Mrozowicz 	},
314b79e4c00SPablo de Lara 	{	/* AES GCM */
3158a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3168a9867a6SSlawomir Mrozowicz 		{.sym = {
317b79e4c00SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
318b79e4c00SPablo de Lara 			{.aead = {
319b79e4c00SPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
3208a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3218a9867a6SSlawomir Mrozowicz 				.key_size = {
3228a9867a6SSlawomir Mrozowicz 					.min = 16,
3238a9867a6SSlawomir Mrozowicz 					.max = 32,
3248a9867a6SSlawomir Mrozowicz 					.increment = 8
3258a9867a6SSlawomir Mrozowicz 				},
3268a9867a6SSlawomir Mrozowicz 				.digest_size = {
3278a9867a6SSlawomir Mrozowicz 					.min = 16,
3288a9867a6SSlawomir Mrozowicz 					.max = 16,
3298a9867a6SSlawomir Mrozowicz 					.increment = 0
3308a9867a6SSlawomir Mrozowicz 				},
3318a9867a6SSlawomir Mrozowicz 				.aad_size = {
3320625598aSArek Kusztal 					.min = 0,
3330625598aSArek Kusztal 					.max = 65535,
3340625598aSArek Kusztal 					.increment = 1
335acf86169SPablo de Lara 				},
3368a9867a6SSlawomir Mrozowicz 				.iv_size = {
3378a9867a6SSlawomir Mrozowicz 					.min = 12,
3388a9867a6SSlawomir Mrozowicz 					.max = 16,
3398a9867a6SSlawomir Mrozowicz 					.increment = 4
340b79e4c00SPablo de Lara 				},
3418a9867a6SSlawomir Mrozowicz 			}, }
3428a9867a6SSlawomir Mrozowicz 		}, }
3438a9867a6SSlawomir Mrozowicz 	},
3441a4998dcSPablo de Lara 	{	/* AES CCM */
3451a4998dcSPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3461a4998dcSPablo de Lara 		{.sym = {
3471a4998dcSPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
3481a4998dcSPablo de Lara 			{.aead = {
3491a4998dcSPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_CCM,
3501a4998dcSPablo de Lara 				.block_size = 16,
3511a4998dcSPablo de Lara 				.key_size = {
3521a4998dcSPablo de Lara 					.min = 16,
3531a4998dcSPablo de Lara 					.max = 32,
3541a4998dcSPablo de Lara 					.increment = 8
3551a4998dcSPablo de Lara 				},
3561a4998dcSPablo de Lara 				.digest_size = {
3571a4998dcSPablo de Lara 					.min = 4,
3581a4998dcSPablo de Lara 					.max = 16,
3591a4998dcSPablo de Lara 					.increment = 2
3601a4998dcSPablo de Lara 				},
3611a4998dcSPablo de Lara 				.aad_size = {
3621a4998dcSPablo de Lara 					.min = 0,
3631a4998dcSPablo de Lara 					.max = 65535,
3641a4998dcSPablo de Lara 					.increment = 1
3651a4998dcSPablo de Lara 				},
3661a4998dcSPablo de Lara 				.iv_size = {
3671a4998dcSPablo de Lara 					.min = 7,
3681a4998dcSPablo de Lara 					.max = 13,
3691a4998dcSPablo de Lara 					.increment = 1
3701a4998dcSPablo de Lara 				},
3711a4998dcSPablo de Lara 			}, }
3721a4998dcSPablo de Lara 		}, }
3731a4998dcSPablo de Lara 	},
3748a9867a6SSlawomir Mrozowicz 	{	/* AES GMAC (AUTH) */
3758a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3768a9867a6SSlawomir Mrozowicz 		{.sym = {
3778a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
3788a9867a6SSlawomir Mrozowicz 			{.auth = {
3798a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_AES_GMAC,
3808a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3818a9867a6SSlawomir Mrozowicz 				.key_size = {
3828a9867a6SSlawomir Mrozowicz 					.min = 16,
3838a9867a6SSlawomir Mrozowicz 					.max = 32,
3848a9867a6SSlawomir Mrozowicz 					.increment = 8
3858a9867a6SSlawomir Mrozowicz 				},
3868a9867a6SSlawomir Mrozowicz 				.digest_size = {
3878a9867a6SSlawomir Mrozowicz 					.min = 16,
3888a9867a6SSlawomir Mrozowicz 					.max = 16,
3898a9867a6SSlawomir Mrozowicz 					.increment = 0
3908a9867a6SSlawomir Mrozowicz 				},
391e32e4fa8SPablo de Lara 				.iv_size = {
392e32e4fa8SPablo de Lara 					.min = 12,
393e32e4fa8SPablo de Lara 					.max = 16,
3948a9867a6SSlawomir Mrozowicz 					.increment = 4
395e32e4fa8SPablo de Lara 				}
3968a9867a6SSlawomir Mrozowicz 			}, }
3978a9867a6SSlawomir Mrozowicz 		}, }
3988a9867a6SSlawomir Mrozowicz 	},
3998a9867a6SSlawomir Mrozowicz 	{	/* 3DES CBC */
4008a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4018a9867a6SSlawomir Mrozowicz 		{.sym = {
4028a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4038a9867a6SSlawomir Mrozowicz 			{.cipher = {
4048a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
4058a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4068a9867a6SSlawomir Mrozowicz 				.key_size = {
4079607e37eSMarko Kovacevic 					.min = 8,
4088a9867a6SSlawomir Mrozowicz 					.max = 24,
4098a9867a6SSlawomir Mrozowicz 					.increment = 8
4108a9867a6SSlawomir Mrozowicz 				},
4118a9867a6SSlawomir Mrozowicz 				.iv_size = {
4128a9867a6SSlawomir Mrozowicz 					.min = 8,
4138a9867a6SSlawomir Mrozowicz 					.max = 8,
4148a9867a6SSlawomir Mrozowicz 					.increment = 0
4158a9867a6SSlawomir Mrozowicz 				}
4168a9867a6SSlawomir Mrozowicz 			}, }
4178a9867a6SSlawomir Mrozowicz 		}, }
4188a9867a6SSlawomir Mrozowicz 	},
4198a9867a6SSlawomir Mrozowicz 	{	/* 3DES CTR */
4208a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4218a9867a6SSlawomir Mrozowicz 		{.sym = {
4228a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4238a9867a6SSlawomir Mrozowicz 			{.cipher = {
4248a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CTR,
4258a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4268a9867a6SSlawomir Mrozowicz 				.key_size = {
4278a9867a6SSlawomir Mrozowicz 					.min = 16,
4288a9867a6SSlawomir Mrozowicz 					.max = 24,
4298a9867a6SSlawomir Mrozowicz 					.increment = 8
4308a9867a6SSlawomir Mrozowicz 				},
4318a9867a6SSlawomir Mrozowicz 				.iv_size = {
4328a9867a6SSlawomir Mrozowicz 					.min = 8,
4338a9867a6SSlawomir Mrozowicz 					.max = 8,
4348a9867a6SSlawomir Mrozowicz 					.increment = 0
4358a9867a6SSlawomir Mrozowicz 				}
4368a9867a6SSlawomir Mrozowicz 			}, }
4378a9867a6SSlawomir Mrozowicz 		}, }
4388a9867a6SSlawomir Mrozowicz 	},
439c1734807SPablo de Lara 	{	/* DES CBC */
440c1734807SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
441c1734807SPablo de Lara 		{.sym = {
442c1734807SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
443c1734807SPablo de Lara 			{.cipher = {
444c1734807SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_CBC,
445c1734807SPablo de Lara 				.block_size = 8,
446c1734807SPablo de Lara 				.key_size = {
447c1734807SPablo de Lara 					.min = 8,
448c1734807SPablo de Lara 					.max = 8,
449c1734807SPablo de Lara 					.increment = 0
450c1734807SPablo de Lara 				},
451c1734807SPablo de Lara 				.iv_size = {
452c1734807SPablo de Lara 					.min = 8,
453c1734807SPablo de Lara 					.max = 8,
454c1734807SPablo de Lara 					.increment = 0
455c1734807SPablo de Lara 				}
456c1734807SPablo de Lara 			}, }
457c1734807SPablo de Lara 		}, }
458c1734807SPablo de Lara 	},
4591dee7bc7SPablo de Lara 	{	/* DES DOCSIS BPI */
4601dee7bc7SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4611dee7bc7SPablo de Lara 		{.sym = {
4621dee7bc7SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4631dee7bc7SPablo de Lara 			{.cipher = {
4641dee7bc7SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_DOCSISBPI,
4651dee7bc7SPablo de Lara 				.block_size = 8,
4661dee7bc7SPablo de Lara 				.key_size = {
4671dee7bc7SPablo de Lara 					.min = 8,
4681dee7bc7SPablo de Lara 					.max = 8,
4691dee7bc7SPablo de Lara 					.increment = 0
4701dee7bc7SPablo de Lara 				},
4711dee7bc7SPablo de Lara 				.iv_size = {
4721dee7bc7SPablo de Lara 					.min = 8,
4731dee7bc7SPablo de Lara 					.max = 8,
4741dee7bc7SPablo de Lara 					.increment = 0
4751dee7bc7SPablo de Lara 				}
4761dee7bc7SPablo de Lara 			}, }
4771dee7bc7SPablo de Lara 		}, }
4781dee7bc7SPablo de Lara 	},
4793e9d6bd4SSunila Sahu 	{	/* RSA */
4803e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
4813e9d6bd4SSunila Sahu 		{.asym = {
4823e9d6bd4SSunila Sahu 			.xform_capa = {
4833e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_RSA,
4843e9d6bd4SSunila Sahu 				.op_types = ((1 << RTE_CRYPTO_ASYM_OP_SIGN) |
4853e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_VERIFY) |
4863e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
4873e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),
4883e9d6bd4SSunila Sahu 				{
4893e9d6bd4SSunila Sahu 				.modlen = {
4903e9d6bd4SSunila Sahu 				/* min length is based on openssl rsa keygen */
4913e9d6bd4SSunila Sahu 				.min = 30,
4923e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
4933e9d6bd4SSunila Sahu 				.max = 0,
4943e9d6bd4SSunila Sahu 				.increment = 1
4953e9d6bd4SSunila Sahu 				}, }
4963e9d6bd4SSunila Sahu 			}
4973e9d6bd4SSunila Sahu 		},
4983e9d6bd4SSunila Sahu 		}
4993e9d6bd4SSunila Sahu 	},
5003e9d6bd4SSunila Sahu 	{	/* modexp */
5013e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
5023e9d6bd4SSunila Sahu 		{.asym = {
5033e9d6bd4SSunila Sahu 			.xform_capa = {
5043e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
5053e9d6bd4SSunila Sahu 				.op_types = 0,
5063e9d6bd4SSunila Sahu 				{
5073e9d6bd4SSunila Sahu 				.modlen = {
5083e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on min length */
5093e9d6bd4SSunila Sahu 				.min = 0,
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 	{	/* modinv */
5193e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
5203e9d6bd4SSunila Sahu 		{.asym = {
5213e9d6bd4SSunila Sahu 			.xform_capa = {
5223e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODINV,
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 	},
536ac42813aSSunila Sahu 	{	/* dh */
537ac42813aSSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
538ac42813aSSunila Sahu 		{.asym = {
539ac42813aSSunila Sahu 			.xform_capa = {
540ac42813aSSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_DH,
541ac42813aSSunila Sahu 				.op_types =
5425fa1fb29SArek Kusztal 				((1<<RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE) |
5435fa1fb29SArek Kusztal 				(1 << RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE |
544ac42813aSSunila Sahu 				(1 <<
5455fa1fb29SArek Kusztal 				RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE))),
546ac42813aSSunila Sahu 				{
547ac42813aSSunila Sahu 				.modlen = {
548ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on min length */
549ac42813aSSunila Sahu 				.min = 0,
550ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on max length */
551ac42813aSSunila Sahu 				.max = 0,
552ac42813aSSunila Sahu 				.increment = 1
553ac42813aSSunila Sahu 				}, }
554ac42813aSSunila Sahu 			}
555ac42813aSSunila Sahu 		},
556ac42813aSSunila Sahu 		}
557ac42813aSSunila Sahu 	},
558ac42813aSSunila Sahu 	{	/* dsa */
559ac42813aSSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
560ac42813aSSunila Sahu 		{.asym = {
561ac42813aSSunila Sahu 			.xform_capa = {
562ac42813aSSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_DSA,
563ac42813aSSunila Sahu 				.op_types =
564ac42813aSSunila Sahu 				((1<<RTE_CRYPTO_ASYM_OP_SIGN) |
565ac42813aSSunila Sahu 				(1 << RTE_CRYPTO_ASYM_OP_VERIFY)),
566ac42813aSSunila Sahu 				{
567ac42813aSSunila Sahu 				.modlen = {
568ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on min length */
569ac42813aSSunila Sahu 				.min = 0,
570ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on max length */
571ac42813aSSunila Sahu 				.max = 0,
572ac42813aSSunila Sahu 				.increment = 1
573ac42813aSSunila Sahu 				}, }
574ac42813aSSunila Sahu 			}
575ac42813aSSunila Sahu 		},
576ac42813aSSunila Sahu 		}
577ac42813aSSunila Sahu 	},
5788a9867a6SSlawomir Mrozowicz 
5798a9867a6SSlawomir Mrozowicz 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
5808a9867a6SSlawomir Mrozowicz };
5818a9867a6SSlawomir Mrozowicz 
5828a9867a6SSlawomir Mrozowicz 
5838a9867a6SSlawomir Mrozowicz /** Configure device */
5848a9867a6SSlawomir Mrozowicz static int
58560e686c2SFan Zhang openssl_pmd_config(__rte_unused struct rte_cryptodev *dev,
58660e686c2SFan Zhang 		__rte_unused struct rte_cryptodev_config *config)
5878a9867a6SSlawomir Mrozowicz {
5888a9867a6SSlawomir Mrozowicz 	return 0;
5898a9867a6SSlawomir Mrozowicz }
5908a9867a6SSlawomir Mrozowicz 
5918a9867a6SSlawomir Mrozowicz /** Start device */
5928a9867a6SSlawomir Mrozowicz static int
5938a9867a6SSlawomir Mrozowicz openssl_pmd_start(__rte_unused struct rte_cryptodev *dev)
5948a9867a6SSlawomir Mrozowicz {
5958a9867a6SSlawomir Mrozowicz 	return 0;
5968a9867a6SSlawomir Mrozowicz }
5978a9867a6SSlawomir Mrozowicz 
5988a9867a6SSlawomir Mrozowicz /** Stop device */
5998a9867a6SSlawomir Mrozowicz static void
6008a9867a6SSlawomir Mrozowicz openssl_pmd_stop(__rte_unused struct rte_cryptodev *dev)
6018a9867a6SSlawomir Mrozowicz {
6028a9867a6SSlawomir Mrozowicz }
6038a9867a6SSlawomir Mrozowicz 
6048a9867a6SSlawomir Mrozowicz /** Close device */
6058a9867a6SSlawomir Mrozowicz static int
6068a9867a6SSlawomir Mrozowicz openssl_pmd_close(__rte_unused struct rte_cryptodev *dev)
6078a9867a6SSlawomir Mrozowicz {
6088a9867a6SSlawomir Mrozowicz 	return 0;
6098a9867a6SSlawomir Mrozowicz }
6108a9867a6SSlawomir Mrozowicz 
6118a9867a6SSlawomir Mrozowicz 
6128a9867a6SSlawomir Mrozowicz /** Get device statistics */
6138a9867a6SSlawomir Mrozowicz static void
6148a9867a6SSlawomir Mrozowicz openssl_pmd_stats_get(struct rte_cryptodev *dev,
6158a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_stats *stats)
6168a9867a6SSlawomir Mrozowicz {
6178a9867a6SSlawomir Mrozowicz 	int qp_id;
6188a9867a6SSlawomir Mrozowicz 
6198a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
6208a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
6218a9867a6SSlawomir Mrozowicz 
6228a9867a6SSlawomir Mrozowicz 		stats->enqueued_count += qp->stats.enqueued_count;
6238a9867a6SSlawomir Mrozowicz 		stats->dequeued_count += qp->stats.dequeued_count;
6248a9867a6SSlawomir Mrozowicz 
6258a9867a6SSlawomir Mrozowicz 		stats->enqueue_err_count += qp->stats.enqueue_err_count;
6268a9867a6SSlawomir Mrozowicz 		stats->dequeue_err_count += qp->stats.dequeue_err_count;
6278a9867a6SSlawomir Mrozowicz 	}
6288a9867a6SSlawomir Mrozowicz }
6298a9867a6SSlawomir Mrozowicz 
6308a9867a6SSlawomir Mrozowicz /** Reset device statistics */
6318a9867a6SSlawomir Mrozowicz static void
6328a9867a6SSlawomir Mrozowicz openssl_pmd_stats_reset(struct rte_cryptodev *dev)
6338a9867a6SSlawomir Mrozowicz {
6348a9867a6SSlawomir Mrozowicz 	int qp_id;
6358a9867a6SSlawomir Mrozowicz 
6368a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
6378a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
6388a9867a6SSlawomir Mrozowicz 
6398a9867a6SSlawomir Mrozowicz 		memset(&qp->stats, 0, sizeof(qp->stats));
6408a9867a6SSlawomir Mrozowicz 	}
6418a9867a6SSlawomir Mrozowicz }
6428a9867a6SSlawomir Mrozowicz 
6438a9867a6SSlawomir Mrozowicz 
6448a9867a6SSlawomir Mrozowicz /** Get device info */
6458a9867a6SSlawomir Mrozowicz static void
6468a9867a6SSlawomir Mrozowicz openssl_pmd_info_get(struct rte_cryptodev *dev,
6478a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_info *dev_info)
6488a9867a6SSlawomir Mrozowicz {
6498a9867a6SSlawomir Mrozowicz 	struct openssl_private *internals = dev->data->dev_private;
6508a9867a6SSlawomir Mrozowicz 
6518a9867a6SSlawomir Mrozowicz 	if (dev_info != NULL) {
6527a364faeSSlawomir Mrozowicz 		dev_info->driver_id = dev->driver_id;
6538a9867a6SSlawomir Mrozowicz 		dev_info->feature_flags = dev->feature_flags;
6548a9867a6SSlawomir Mrozowicz 		dev_info->capabilities = openssl_pmd_capabilities;
6558a9867a6SSlawomir Mrozowicz 		dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
656e1fc5b76SPablo de Lara 		/* No limit of number of sessions */
657e1fc5b76SPablo de Lara 		dev_info->sym.max_nb_sessions = 0;
6588a9867a6SSlawomir Mrozowicz 	}
6598a9867a6SSlawomir Mrozowicz }
6608a9867a6SSlawomir Mrozowicz 
6618a9867a6SSlawomir Mrozowicz /** Release queue pair */
6628a9867a6SSlawomir Mrozowicz static int
6638a9867a6SSlawomir Mrozowicz openssl_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
6648a9867a6SSlawomir Mrozowicz {
6658a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL) {
666a4d69a51SFan Zhang 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
667a4d69a51SFan Zhang 
668a4d69a51SFan Zhang 		rte_ring_free(qp->processed_ops);
669a4d69a51SFan Zhang 
6708a9867a6SSlawomir Mrozowicz 		rte_free(dev->data->queue_pairs[qp_id]);
6718a9867a6SSlawomir Mrozowicz 		dev->data->queue_pairs[qp_id] = NULL;
6728a9867a6SSlawomir Mrozowicz 	}
6738a9867a6SSlawomir Mrozowicz 	return 0;
6748a9867a6SSlawomir Mrozowicz }
6758a9867a6SSlawomir Mrozowicz 
6768a9867a6SSlawomir Mrozowicz /** set a unique name for the queue pair based on it's name, dev_id and qp_id */
6778a9867a6SSlawomir Mrozowicz static int
6788a9867a6SSlawomir Mrozowicz openssl_pmd_qp_set_unique_name(struct rte_cryptodev *dev,
6798a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp)
6808a9867a6SSlawomir Mrozowicz {
6818a9867a6SSlawomir Mrozowicz 	unsigned int n = snprintf(qp->name, sizeof(qp->name),
6828a9867a6SSlawomir Mrozowicz 			"openssl_pmd_%u_qp_%u",
6838a9867a6SSlawomir Mrozowicz 			dev->data->dev_id, qp->id);
6848a9867a6SSlawomir Mrozowicz 
6856ab25e63STomasz Duszynski 	if (n >= sizeof(qp->name))
6868a9867a6SSlawomir Mrozowicz 		return -1;
6878a9867a6SSlawomir Mrozowicz 
6888a9867a6SSlawomir Mrozowicz 	return 0;
6898a9867a6SSlawomir Mrozowicz }
6908a9867a6SSlawomir Mrozowicz 
6918a9867a6SSlawomir Mrozowicz 
6928a9867a6SSlawomir Mrozowicz /** Create a ring to place processed operations on */
6938a9867a6SSlawomir Mrozowicz static struct rte_ring *
6948a9867a6SSlawomir Mrozowicz openssl_pmd_qp_create_processed_ops_ring(struct openssl_qp *qp,
6958a9867a6SSlawomir Mrozowicz 		unsigned int ring_size, int socket_id)
6968a9867a6SSlawomir Mrozowicz {
6978a9867a6SSlawomir Mrozowicz 	struct rte_ring *r;
6988a9867a6SSlawomir Mrozowicz 
6998a9867a6SSlawomir Mrozowicz 	r = rte_ring_lookup(qp->name);
7008a9867a6SSlawomir Mrozowicz 	if (r) {
701636e7392SBruce Richardson 		if (rte_ring_get_size(r) >= ring_size) {
702094b2386SNaga Suresh Somarowthu 			OPENSSL_LOG(INFO,
7038a9867a6SSlawomir Mrozowicz 					"Reusing existing ring %s for processed ops",
7048a9867a6SSlawomir Mrozowicz 				 qp->name);
7058a9867a6SSlawomir Mrozowicz 			return r;
7068a9867a6SSlawomir Mrozowicz 		}
7078a9867a6SSlawomir Mrozowicz 
708094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR,
7098a9867a6SSlawomir Mrozowicz 				"Unable to reuse existing ring %s for processed ops",
7108a9867a6SSlawomir Mrozowicz 			 qp->name);
7118a9867a6SSlawomir Mrozowicz 		return NULL;
7128a9867a6SSlawomir Mrozowicz 	}
7138a9867a6SSlawomir Mrozowicz 
7148a9867a6SSlawomir Mrozowicz 	return rte_ring_create(qp->name, ring_size, socket_id,
7158a9867a6SSlawomir Mrozowicz 			RING_F_SP_ENQ | RING_F_SC_DEQ);
7168a9867a6SSlawomir Mrozowicz }
7178a9867a6SSlawomir Mrozowicz 
7188a9867a6SSlawomir Mrozowicz 
7198a9867a6SSlawomir Mrozowicz /** Setup a queue pair */
7208a9867a6SSlawomir Mrozowicz static int
7218a9867a6SSlawomir Mrozowicz openssl_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
7228a9867a6SSlawomir Mrozowicz 		const struct rte_cryptodev_qp_conf *qp_conf,
723725d2a7fSFan Zhang 		int socket_id)
7248a9867a6SSlawomir Mrozowicz {
7258a9867a6SSlawomir Mrozowicz 	struct openssl_qp *qp = NULL;
7268a9867a6SSlawomir Mrozowicz 
7278a9867a6SSlawomir Mrozowicz 	/* Free memory prior to re-allocation if needed. */
7288a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL)
7298a9867a6SSlawomir Mrozowicz 		openssl_pmd_qp_release(dev, qp_id);
7308a9867a6SSlawomir Mrozowicz 
7318a9867a6SSlawomir Mrozowicz 	/* Allocate the queue pair data structure. */
7328a9867a6SSlawomir Mrozowicz 	qp = rte_zmalloc_socket("OPENSSL PMD Queue Pair", sizeof(*qp),
7338a9867a6SSlawomir Mrozowicz 					RTE_CACHE_LINE_SIZE, socket_id);
7348a9867a6SSlawomir Mrozowicz 	if (qp == NULL)
7358a9867a6SSlawomir Mrozowicz 		return -ENOMEM;
7368a9867a6SSlawomir Mrozowicz 
7378a9867a6SSlawomir Mrozowicz 	qp->id = qp_id;
7388a9867a6SSlawomir Mrozowicz 	dev->data->queue_pairs[qp_id] = qp;
7398a9867a6SSlawomir Mrozowicz 
7408a9867a6SSlawomir Mrozowicz 	if (openssl_pmd_qp_set_unique_name(dev, qp))
7418a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
7428a9867a6SSlawomir Mrozowicz 
7438a9867a6SSlawomir Mrozowicz 	qp->processed_ops = openssl_pmd_qp_create_processed_ops_ring(qp,
7448a9867a6SSlawomir Mrozowicz 			qp_conf->nb_descriptors, socket_id);
7458a9867a6SSlawomir Mrozowicz 	if (qp->processed_ops == NULL)
7468a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
7478a9867a6SSlawomir Mrozowicz 
748725d2a7fSFan Zhang 	qp->sess_mp = qp_conf->mp_session;
749725d2a7fSFan Zhang 	qp->sess_mp_priv = qp_conf->mp_session_private;
7508a9867a6SSlawomir Mrozowicz 
7518a9867a6SSlawomir Mrozowicz 	memset(&qp->stats, 0, sizeof(qp->stats));
7528a9867a6SSlawomir Mrozowicz 
7538a9867a6SSlawomir Mrozowicz 	return 0;
7548a9867a6SSlawomir Mrozowicz 
7558a9867a6SSlawomir Mrozowicz qp_setup_cleanup:
7568a9867a6SSlawomir Mrozowicz 	rte_free(qp);
7578a9867a6SSlawomir Mrozowicz 
7588a9867a6SSlawomir Mrozowicz 	return -1;
7598a9867a6SSlawomir Mrozowicz }
7608a9867a6SSlawomir Mrozowicz 
7613e9d6bd4SSunila Sahu /** Returns the size of the symmetric session structure */
7628a9867a6SSlawomir Mrozowicz static unsigned
763012c5076SPablo de Lara openssl_pmd_sym_session_get_size(struct rte_cryptodev *dev __rte_unused)
7648a9867a6SSlawomir Mrozowicz {
7658a9867a6SSlawomir Mrozowicz 	return sizeof(struct openssl_session);
7668a9867a6SSlawomir Mrozowicz }
7678a9867a6SSlawomir Mrozowicz 
7683e9d6bd4SSunila Sahu /** Returns the size of the asymmetric session structure */
7693e9d6bd4SSunila Sahu static unsigned
7703e9d6bd4SSunila Sahu openssl_pmd_asym_session_get_size(struct rte_cryptodev *dev __rte_unused)
7713e9d6bd4SSunila Sahu {
7723e9d6bd4SSunila Sahu 	return sizeof(struct openssl_asym_session);
7733e9d6bd4SSunila Sahu }
7743e9d6bd4SSunila Sahu 
7758a9867a6SSlawomir Mrozowicz /** Configure the session from a crypto xform chain */
776b3bbd9e5SSlawomir Mrozowicz static int
777012c5076SPablo de Lara openssl_pmd_sym_session_configure(struct rte_cryptodev *dev __rte_unused,
778b3bbd9e5SSlawomir Mrozowicz 		struct rte_crypto_sym_xform *xform,
779b3bbd9e5SSlawomir Mrozowicz 		struct rte_cryptodev_sym_session *sess,
780b3bbd9e5SSlawomir Mrozowicz 		struct rte_mempool *mempool)
7818a9867a6SSlawomir Mrozowicz {
782b3bbd9e5SSlawomir Mrozowicz 	void *sess_private_data;
78327391b53SPablo de Lara 	int ret;
784b3bbd9e5SSlawomir Mrozowicz 
7858a9867a6SSlawomir Mrozowicz 	if (unlikely(sess == NULL)) {
786094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR, "invalid session struct");
78727391b53SPablo de Lara 		return -EINVAL;
788b3bbd9e5SSlawomir Mrozowicz 	}
789b3bbd9e5SSlawomir Mrozowicz 
790b3bbd9e5SSlawomir Mrozowicz 	if (rte_mempool_get(mempool, &sess_private_data)) {
791094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR,
792b3bbd9e5SSlawomir Mrozowicz 			"Couldn't get object from session mempool");
79327391b53SPablo de Lara 		return -ENOMEM;
7948a9867a6SSlawomir Mrozowicz 	}
7958a9867a6SSlawomir Mrozowicz 
79627391b53SPablo de Lara 	ret = openssl_set_session_parameters(sess_private_data, xform);
79727391b53SPablo de Lara 	if (ret != 0) {
798094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR, "failed configure session parameters");
799b3bbd9e5SSlawomir Mrozowicz 
800b3bbd9e5SSlawomir Mrozowicz 		/* Return session to mempool */
801b3bbd9e5SSlawomir Mrozowicz 		rte_mempool_put(mempool, sess_private_data);
80227391b53SPablo de Lara 		return ret;
8038a9867a6SSlawomir Mrozowicz 	}
8048a9867a6SSlawomir Mrozowicz 
805012c5076SPablo de Lara 	set_sym_session_private_data(sess, dev->driver_id,
806b3bbd9e5SSlawomir Mrozowicz 			sess_private_data);
807b3bbd9e5SSlawomir Mrozowicz 
808b3bbd9e5SSlawomir Mrozowicz 	return 0;
8098a9867a6SSlawomir Mrozowicz }
8108a9867a6SSlawomir Mrozowicz 
8113e9d6bd4SSunila Sahu static int openssl_set_asym_session_parameters(
8123e9d6bd4SSunila Sahu 		struct openssl_asym_session *asym_session,
8133e9d6bd4SSunila Sahu 		struct rte_crypto_asym_xform *xform)
8143e9d6bd4SSunila Sahu {
815*4c7ae22fSKai Ji 	int ret = -1;
8163e9d6bd4SSunila Sahu 
817ac42813aSSunila Sahu 	if ((xform->xform_type != RTE_CRYPTO_ASYM_XFORM_DH) &&
818ac42813aSSunila Sahu 		(xform->next != NULL)) {
8193e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "chained xfrms are not supported on %s",
8203e9d6bd4SSunila Sahu 			rte_crypto_asym_xform_strings[xform->xform_type]);
821*4c7ae22fSKai Ji 		return ret;
8223e9d6bd4SSunila Sahu 	}
8233e9d6bd4SSunila Sahu 
8243e9d6bd4SSunila Sahu 	switch (xform->xform_type) {
8253e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_RSA:
8263e9d6bd4SSunila Sahu 	{
8273e9d6bd4SSunila Sahu 		BIGNUM *n = NULL;
8283e9d6bd4SSunila Sahu 		BIGNUM *e = NULL;
8293e9d6bd4SSunila Sahu 		BIGNUM *d = NULL;
8303e9d6bd4SSunila Sahu 		BIGNUM *p = NULL, *q = NULL, *dmp1 = NULL;
8313e9d6bd4SSunila Sahu 		BIGNUM *iqmp = NULL, *dmq1 = NULL;
8323e9d6bd4SSunila Sahu 
8333e9d6bd4SSunila Sahu 		/* copy xfrm data into rsa struct */
8343e9d6bd4SSunila Sahu 		n = BN_bin2bn((const unsigned char *)xform->rsa.n.data,
8353e9d6bd4SSunila Sahu 				xform->rsa.n.length, n);
8363e9d6bd4SSunila Sahu 		e = BN_bin2bn((const unsigned char *)xform->rsa.e.data,
8373e9d6bd4SSunila Sahu 				xform->rsa.e.length, e);
8383e9d6bd4SSunila Sahu 
8393e9d6bd4SSunila Sahu 		if (!n || !e)
8403e9d6bd4SSunila Sahu 			goto err_rsa;
8413e9d6bd4SSunila Sahu 
842d7bd42f6SKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
843d7bd42f6SKai Ji 		OSSL_PARAM_BLD * param_bld = OSSL_PARAM_BLD_new();
844d7bd42f6SKai Ji 		if (!param_bld) {
845d7bd42f6SKai Ji 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
846d7bd42f6SKai Ji 			goto err_rsa;
847d7bd42f6SKai Ji 		}
848d7bd42f6SKai Ji 
849d7bd42f6SKai Ji 		if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_RSA_N, n)
850d7bd42f6SKai Ji 			|| !OSSL_PARAM_BLD_push_BN(param_bld,
851d7bd42f6SKai Ji 					OSSL_PKEY_PARAM_RSA_E, e)) {
852d7bd42f6SKai Ji 			OSSL_PARAM_BLD_free(param_bld);
853d7bd42f6SKai Ji 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
854d7bd42f6SKai Ji 			goto err_rsa;
855d7bd42f6SKai Ji 		}
856d7bd42f6SKai Ji 
857d7bd42f6SKai Ji 		if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) {
858d7bd42f6SKai Ji 			d = BN_bin2bn(
859d7bd42f6SKai Ji 			(const unsigned char *)xform->rsa.d.data,
860d7bd42f6SKai Ji 			xform->rsa.d.length,
861d7bd42f6SKai Ji 			d);
862d7bd42f6SKai Ji 			if (!d) {
863d7bd42f6SKai Ji 				OSSL_PARAM_BLD_free(param_bld);
864d7bd42f6SKai Ji 				goto err_rsa;
865d7bd42f6SKai Ji 			}
866d7bd42f6SKai Ji 		} else {
867d7bd42f6SKai Ji 			p = BN_bin2bn((const unsigned char *)
868d7bd42f6SKai Ji 					xform->rsa.qt.p.data,
869d7bd42f6SKai Ji 					xform->rsa.qt.p.length,
870d7bd42f6SKai Ji 					p);
871d7bd42f6SKai Ji 			q = BN_bin2bn((const unsigned char *)
872d7bd42f6SKai Ji 					xform->rsa.qt.q.data,
873d7bd42f6SKai Ji 					xform->rsa.qt.q.length,
874d7bd42f6SKai Ji 					q);
875d7bd42f6SKai Ji 			dmp1 = BN_bin2bn((const unsigned char *)
876d7bd42f6SKai Ji 					xform->rsa.qt.dP.data,
877d7bd42f6SKai Ji 					xform->rsa.qt.dP.length,
878d7bd42f6SKai Ji 					dmp1);
879d7bd42f6SKai Ji 			dmq1 = BN_bin2bn((const unsigned char *)
880d7bd42f6SKai Ji 					xform->rsa.qt.dQ.data,
881d7bd42f6SKai Ji 					xform->rsa.qt.dQ.length,
882d7bd42f6SKai Ji 					dmq1);
883d7bd42f6SKai Ji 			iqmp = BN_bin2bn((const unsigned char *)
884d7bd42f6SKai Ji 					xform->rsa.qt.qInv.data,
885d7bd42f6SKai Ji 					xform->rsa.qt.qInv.length,
886d7bd42f6SKai Ji 					iqmp);
887d7bd42f6SKai Ji 
888d7bd42f6SKai Ji 			if (!p || !q || !dmp1 || !dmq1 || !iqmp) {
889d7bd42f6SKai Ji 				OSSL_PARAM_BLD_free(param_bld);
890d7bd42f6SKai Ji 				goto err_rsa;
891d7bd42f6SKai Ji 			}
892d7bd42f6SKai Ji 
893d7bd42f6SKai Ji 			if (!OSSL_PARAM_BLD_push_BN(param_bld,
894d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_FACTOR1, p)
895d7bd42f6SKai Ji 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
896d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_FACTOR2, q)
897d7bd42f6SKai Ji 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
898d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_EXPONENT1, dmp1)
899d7bd42f6SKai Ji 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
900d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_EXPONENT2, dmq1)
901d7bd42f6SKai Ji 				|| !OSSL_PARAM_BLD_push_BN(param_bld,
902d7bd42f6SKai Ji 							OSSL_PKEY_PARAM_RSA_COEFFICIENT1, iqmp)) {
903d7bd42f6SKai Ji 				OSSL_PARAM_BLD_free(param_bld);
904d7bd42f6SKai Ji 				goto err_rsa;
905d7bd42f6SKai Ji 			}
906d7bd42f6SKai Ji 		}
907d7bd42f6SKai Ji 
908d7bd42f6SKai Ji 		if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_RSA_N, n)
909d7bd42f6SKai Ji 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_RSA_E, e)
910d7bd42f6SKai Ji 			|| !OSSL_PARAM_BLD_push_BN(param_bld,
911d7bd42f6SKai Ji 						OSSL_PKEY_PARAM_RSA_D, d)) {
912d7bd42f6SKai Ji 			OSSL_PARAM_BLD_free(param_bld);
913d7bd42f6SKai Ji 			goto err_rsa;
914d7bd42f6SKai Ji 		}
915d7bd42f6SKai Ji 
916d7bd42f6SKai Ji 		EVP_PKEY_CTX *key_ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL);
917d7bd42f6SKai Ji 		EVP_PKEY *pkey = NULL;
918d7bd42f6SKai Ji 		EVP_PKEY_CTX *rsa_ctx = NULL;
919d7bd42f6SKai Ji 		OSSL_PARAM *params = NULL;
920d7bd42f6SKai Ji 
921d7bd42f6SKai Ji 		params = OSSL_PARAM_BLD_to_param(param_bld);
922d7bd42f6SKai Ji 		if (!params) {
923d7bd42f6SKai Ji 			OSSL_PARAM_BLD_free(param_bld);
924d7bd42f6SKai Ji 			goto err_rsa;
925d7bd42f6SKai Ji 		}
926d7bd42f6SKai Ji 
927d7bd42f6SKai Ji 		if (key_ctx == NULL
928d7bd42f6SKai Ji 			|| EVP_PKEY_fromdata_init(key_ctx) <= 0
929d7bd42f6SKai Ji 			|| EVP_PKEY_fromdata(key_ctx, &pkey,
930d7bd42f6SKai Ji 				EVP_PKEY_KEYPAIR, params) <= 0) {
931d7bd42f6SKai Ji 			OSSL_PARAM_free(params);
932d7bd42f6SKai Ji 			goto err_rsa;
933d7bd42f6SKai Ji 		}
934d7bd42f6SKai Ji 
935d7bd42f6SKai Ji 		rsa_ctx = EVP_PKEY_CTX_new(pkey, NULL);
936d7bd42f6SKai Ji 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA;
937d7bd42f6SKai Ji 		asym_session->u.r.ctx = rsa_ctx;
938d7bd42f6SKai Ji 		EVP_PKEY_CTX_free(key_ctx);
939d7bd42f6SKai Ji 		OSSL_PARAM_free(params);
940d7bd42f6SKai Ji 		break;
941d7bd42f6SKai Ji #else
9423e9d6bd4SSunila Sahu 		RSA *rsa = RSA_new();
9433e9d6bd4SSunila Sahu 		if (rsa == NULL)
9443e9d6bd4SSunila Sahu 			goto err_rsa;
9453e9d6bd4SSunila Sahu 
9463e9d6bd4SSunila Sahu 		if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) {
9473e9d6bd4SSunila Sahu 			d = BN_bin2bn(
9483e9d6bd4SSunila Sahu 			(const unsigned char *)xform->rsa.d.data,
9493e9d6bd4SSunila Sahu 			xform->rsa.d.length,
9503e9d6bd4SSunila Sahu 			d);
9513e9d6bd4SSunila Sahu 			if (!d) {
9523e9d6bd4SSunila Sahu 				RSA_free(rsa);
9533e9d6bd4SSunila Sahu 				goto err_rsa;
9543e9d6bd4SSunila Sahu 			}
9553e9d6bd4SSunila Sahu 		} else {
9563e9d6bd4SSunila Sahu 			p = BN_bin2bn((const unsigned char *)
9573e9d6bd4SSunila Sahu 					xform->rsa.qt.p.data,
9583e9d6bd4SSunila Sahu 					xform->rsa.qt.p.length,
9593e9d6bd4SSunila Sahu 					p);
9603e9d6bd4SSunila Sahu 			q = BN_bin2bn((const unsigned char *)
9613e9d6bd4SSunila Sahu 					xform->rsa.qt.q.data,
9623e9d6bd4SSunila Sahu 					xform->rsa.qt.q.length,
9633e9d6bd4SSunila Sahu 					q);
9643e9d6bd4SSunila Sahu 			dmp1 = BN_bin2bn((const unsigned char *)
9653e9d6bd4SSunila Sahu 					xform->rsa.qt.dP.data,
9663e9d6bd4SSunila Sahu 					xform->rsa.qt.dP.length,
9673e9d6bd4SSunila Sahu 					dmp1);
9683e9d6bd4SSunila Sahu 			dmq1 = BN_bin2bn((const unsigned char *)
9693e9d6bd4SSunila Sahu 					xform->rsa.qt.dQ.data,
9703e9d6bd4SSunila Sahu 					xform->rsa.qt.dQ.length,
9713e9d6bd4SSunila Sahu 					dmq1);
9723e9d6bd4SSunila Sahu 			iqmp = BN_bin2bn((const unsigned char *)
9733e9d6bd4SSunila Sahu 					xform->rsa.qt.qInv.data,
9743e9d6bd4SSunila Sahu 					xform->rsa.qt.qInv.length,
9753e9d6bd4SSunila Sahu 					iqmp);
9763e9d6bd4SSunila Sahu 
9773e9d6bd4SSunila Sahu 			if (!p || !q || !dmp1 || !dmq1 || !iqmp) {
9783e9d6bd4SSunila Sahu 				RSA_free(rsa);
9793e9d6bd4SSunila Sahu 				goto err_rsa;
9803e9d6bd4SSunila Sahu 			}
9810b5284adSAshish Gupta 			ret = set_rsa_params(rsa, p, q);
9823e9d6bd4SSunila Sahu 			if (ret) {
9833e9d6bd4SSunila Sahu 				OPENSSL_LOG(ERR,
9843e9d6bd4SSunila Sahu 					"failed to set rsa params\n");
9853e9d6bd4SSunila Sahu 				RSA_free(rsa);
9863e9d6bd4SSunila Sahu 				goto err_rsa;
9873e9d6bd4SSunila Sahu 			}
9880b5284adSAshish Gupta 			ret = set_rsa_crt_params(rsa, dmp1, dmq1, iqmp);
9893e9d6bd4SSunila Sahu 			if (ret) {
9903e9d6bd4SSunila Sahu 				OPENSSL_LOG(ERR,
9913e9d6bd4SSunila Sahu 					"failed to set crt params\n");
9923e9d6bd4SSunila Sahu 				RSA_free(rsa);
9933e9d6bd4SSunila Sahu 				/*
9943e9d6bd4SSunila Sahu 				 * set already populated params to NULL
9953e9d6bd4SSunila Sahu 				 * as its freed by call to RSA_free
9963e9d6bd4SSunila Sahu 				 */
9973e9d6bd4SSunila Sahu 				p = q = NULL;
9983e9d6bd4SSunila Sahu 				goto err_rsa;
9993e9d6bd4SSunila Sahu 			}
10003e9d6bd4SSunila Sahu 		}
10013e9d6bd4SSunila Sahu 
10020b5284adSAshish Gupta 		ret = set_rsa_keys(rsa, n, e, d);
10033e9d6bd4SSunila Sahu 		if (ret) {
10043e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR, "Failed to load rsa keys\n");
10053e9d6bd4SSunila Sahu 			RSA_free(rsa);
1006*4c7ae22fSKai Ji 			return ret;
10073e9d6bd4SSunila Sahu 		}
10083e9d6bd4SSunila Sahu 		asym_session->u.r.rsa = rsa;
10093e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA;
10103e9d6bd4SSunila Sahu 		break;
1011d7bd42f6SKai Ji #endif
10123e9d6bd4SSunila Sahu err_rsa:
101377411bd6SArek Kusztal 		BN_clear_free(n);
101477411bd6SArek Kusztal 		BN_clear_free(e);
101577411bd6SArek Kusztal 		BN_clear_free(d);
101677411bd6SArek Kusztal 		BN_clear_free(p);
101777411bd6SArek Kusztal 		BN_clear_free(q);
101877411bd6SArek Kusztal 		BN_clear_free(dmp1);
101977411bd6SArek Kusztal 		BN_clear_free(dmq1);
102077411bd6SArek Kusztal 		BN_clear_free(iqmp);
10213e9d6bd4SSunila Sahu 
10223e9d6bd4SSunila Sahu 		return -1;
10233e9d6bd4SSunila Sahu 	}
10243e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
10253e9d6bd4SSunila Sahu 	{
10263e9d6bd4SSunila Sahu 		struct rte_crypto_modex_xform *xfrm = &(xform->modex);
10273e9d6bd4SSunila Sahu 
10283e9d6bd4SSunila Sahu 		BN_CTX *ctx = BN_CTX_new();
10293e9d6bd4SSunila Sahu 		if (ctx == NULL) {
10303e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR,
10313e9d6bd4SSunila Sahu 				" failed to allocate resources\n");
1032*4c7ae22fSKai Ji 			return ret;
10333e9d6bd4SSunila Sahu 		}
10343e9d6bd4SSunila Sahu 		BN_CTX_start(ctx);
10353e9d6bd4SSunila Sahu 		BIGNUM *mod = BN_CTX_get(ctx);
10363e9d6bd4SSunila Sahu 		BIGNUM *exp = BN_CTX_get(ctx);
10373e9d6bd4SSunila Sahu 		if (mod == NULL || exp == NULL) {
10383e9d6bd4SSunila Sahu 			BN_CTX_end(ctx);
10393e9d6bd4SSunila Sahu 			BN_CTX_free(ctx);
1040*4c7ae22fSKai Ji 			return ret;
10413e9d6bd4SSunila Sahu 		}
10423e9d6bd4SSunila Sahu 
10433e9d6bd4SSunila Sahu 		mod = BN_bin2bn((const unsigned char *)
10443e9d6bd4SSunila Sahu 				xfrm->modulus.data,
10453e9d6bd4SSunila Sahu 				xfrm->modulus.length, mod);
10463e9d6bd4SSunila Sahu 		exp = BN_bin2bn((const unsigned char *)
10473e9d6bd4SSunila Sahu 				xfrm->exponent.data,
10483e9d6bd4SSunila Sahu 				xfrm->exponent.length, exp);
10493e9d6bd4SSunila Sahu 		asym_session->u.e.ctx = ctx;
10503e9d6bd4SSunila Sahu 		asym_session->u.e.mod = mod;
10513e9d6bd4SSunila Sahu 		asym_session->u.e.exp = exp;
10523e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
10533e9d6bd4SSunila Sahu 		break;
10543e9d6bd4SSunila Sahu 	}
10553e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
10563e9d6bd4SSunila Sahu 	{
10573e9d6bd4SSunila Sahu 		struct rte_crypto_modinv_xform *xfrm = &(xform->modinv);
10583e9d6bd4SSunila Sahu 
10593e9d6bd4SSunila Sahu 		BN_CTX *ctx = BN_CTX_new();
10603e9d6bd4SSunila Sahu 		if (ctx == NULL) {
10613e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR,
10623e9d6bd4SSunila Sahu 				" failed to allocate resources\n");
1063*4c7ae22fSKai Ji 			return ret;
10643e9d6bd4SSunila Sahu 		}
10653e9d6bd4SSunila Sahu 		BN_CTX_start(ctx);
10663e9d6bd4SSunila Sahu 		BIGNUM *mod = BN_CTX_get(ctx);
10673e9d6bd4SSunila Sahu 		if (mod == NULL) {
10683e9d6bd4SSunila Sahu 			BN_CTX_end(ctx);
10693e9d6bd4SSunila Sahu 			BN_CTX_free(ctx);
1070*4c7ae22fSKai Ji 			return ret;
10713e9d6bd4SSunila Sahu 		}
10723e9d6bd4SSunila Sahu 
10733e9d6bd4SSunila Sahu 		mod = BN_bin2bn((const unsigned char *)
10743e9d6bd4SSunila Sahu 				xfrm->modulus.data,
10753e9d6bd4SSunila Sahu 				xfrm->modulus.length,
10763e9d6bd4SSunila Sahu 				mod);
10773e9d6bd4SSunila Sahu 		asym_session->u.m.ctx = ctx;
10783e9d6bd4SSunila Sahu 		asym_session->u.m.modulus = mod;
10793e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODINV;
10803e9d6bd4SSunila Sahu 		break;
10813e9d6bd4SSunila Sahu 	}
1082ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DH:
1083ac42813aSSunila Sahu 	{
1084ac42813aSSunila Sahu 		BIGNUM *p = NULL;
1085ac42813aSSunila Sahu 		BIGNUM *g = NULL;
1086ac42813aSSunila Sahu 
1087ac42813aSSunila Sahu 		p = BN_bin2bn((const unsigned char *)
1088ac42813aSSunila Sahu 				xform->dh.p.data,
1089ac42813aSSunila Sahu 				xform->dh.p.length,
1090ac42813aSSunila Sahu 				p);
1091ac42813aSSunila Sahu 		g = BN_bin2bn((const unsigned char *)
1092ac42813aSSunila Sahu 				xform->dh.g.data,
1093ac42813aSSunila Sahu 				xform->dh.g.length,
1094ac42813aSSunila Sahu 				g);
1095ac42813aSSunila Sahu 		if (!p || !g)
1096ac42813aSSunila Sahu 			goto err_dh;
1097ac42813aSSunila Sahu 
1098c794b40cSKai Ji 		DH *dh = NULL;
1099c794b40cSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1100c794b40cSKai Ji 		OSSL_PARAM_BLD *param_bld = NULL;
1101c794b40cSKai Ji 		param_bld = OSSL_PARAM_BLD_new();
1102c794b40cSKai Ji 		if (!param_bld) {
1103c794b40cSKai Ji 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
1104c794b40cSKai Ji 			goto err_dh;
1105c794b40cSKai Ji 		}
1106c794b40cSKai Ji 		if ((!OSSL_PARAM_BLD_push_utf8_string(param_bld,
1107c794b40cSKai Ji 					"group", "ffdhe2048", 0))
1108c794b40cSKai Ji 			|| (!OSSL_PARAM_BLD_push_BN(param_bld,
1109c794b40cSKai Ji 					OSSL_PKEY_PARAM_FFC_P, p))
1110c794b40cSKai Ji 			|| (!OSSL_PARAM_BLD_push_BN(param_bld,
1111c794b40cSKai Ji 					OSSL_PKEY_PARAM_FFC_G, g))) {
1112c794b40cSKai Ji 			OSSL_PARAM_BLD_free(param_bld);
1113c794b40cSKai Ji 			goto err_dh;
1114c794b40cSKai Ji 		}
1115c794b40cSKai Ji 
1116c794b40cSKai Ji 		OSSL_PARAM_BLD *param_bld_peer = NULL;
1117c794b40cSKai Ji 		param_bld_peer = OSSL_PARAM_BLD_new();
1118c794b40cSKai Ji 		if (!param_bld_peer) {
1119c794b40cSKai Ji 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
1120c794b40cSKai Ji 			OSSL_PARAM_BLD_free(param_bld);
1121c794b40cSKai Ji 			goto err_dh;
1122c794b40cSKai Ji 		}
1123c794b40cSKai Ji 		if ((!OSSL_PARAM_BLD_push_utf8_string(param_bld_peer,
1124c794b40cSKai Ji 					"group", "ffdhe2048", 0))
1125c794b40cSKai Ji 			|| (!OSSL_PARAM_BLD_push_BN(param_bld_peer,
1126c794b40cSKai Ji 					OSSL_PKEY_PARAM_FFC_P, p))
1127c794b40cSKai Ji 			|| (!OSSL_PARAM_BLD_push_BN(param_bld_peer,
1128c794b40cSKai Ji 					OSSL_PKEY_PARAM_FFC_G, g))) {
1129c794b40cSKai Ji 			OSSL_PARAM_BLD_free(param_bld);
1130c794b40cSKai Ji 			OSSL_PARAM_BLD_free(param_bld_peer);
1131c794b40cSKai Ji 			goto err_dh;
1132c794b40cSKai Ji 		}
1133c794b40cSKai Ji 
1134c794b40cSKai Ji 		asym_session->u.dh.param_bld = param_bld;
1135c794b40cSKai Ji 		asym_session->u.dh.param_bld_peer = param_bld_peer;
1136c794b40cSKai Ji #else
1137c794b40cSKai Ji 		dh = DH_new();
1138ac42813aSSunila Sahu 		if (dh == NULL) {
1139ac42813aSSunila Sahu 			OPENSSL_LOG(ERR,
1140ac42813aSSunila Sahu 				"failed to allocate resources\n");
1141ac42813aSSunila Sahu 			goto err_dh;
1142ac42813aSSunila Sahu 		}
11430b5284adSAshish Gupta 		ret = set_dh_params(dh, p, g);
1144ac42813aSSunila Sahu 		if (ret) {
1145ac42813aSSunila Sahu 			DH_free(dh);
1146ac42813aSSunila Sahu 			goto err_dh;
1147ac42813aSSunila Sahu 		}
1148c794b40cSKai Ji #endif
1149ac42813aSSunila Sahu 		asym_session->u.dh.dh_key = dh;
1150ac42813aSSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DH;
1151ac42813aSSunila Sahu 		break;
1152ac42813aSSunila Sahu 
1153ac42813aSSunila Sahu err_dh:
1154ac42813aSSunila Sahu 		OPENSSL_LOG(ERR, " failed to set dh params\n");
1155ac42813aSSunila Sahu 		BN_free(p);
1156ac42813aSSunila Sahu 		BN_free(g);
1157ac42813aSSunila Sahu 		return -1;
1158ac42813aSSunila Sahu 	}
1159ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DSA:
1160ac42813aSSunila Sahu 	{
1161*4c7ae22fSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1162*4c7ae22fSKai Ji 		BIGNUM *p = NULL, *g = NULL;
1163*4c7ae22fSKai Ji 		BIGNUM *q = NULL, *priv_key = NULL;
1164*4c7ae22fSKai Ji 		BIGNUM *pub_key = BN_new();
1165*4c7ae22fSKai Ji 		BN_zero(pub_key);
1166*4c7ae22fSKai Ji 		OSSL_PARAM_BLD *param_bld = NULL;
1167*4c7ae22fSKai Ji 
1168*4c7ae22fSKai Ji 		p = BN_bin2bn((const unsigned char *)
1169*4c7ae22fSKai Ji 				xform->dsa.p.data,
1170*4c7ae22fSKai Ji 				xform->dsa.p.length,
1171*4c7ae22fSKai Ji 				p);
1172*4c7ae22fSKai Ji 
1173*4c7ae22fSKai Ji 		g = BN_bin2bn((const unsigned char *)
1174*4c7ae22fSKai Ji 				xform->dsa.g.data,
1175*4c7ae22fSKai Ji 				xform->dsa.g.length,
1176*4c7ae22fSKai Ji 				g);
1177*4c7ae22fSKai Ji 
1178*4c7ae22fSKai Ji 		q = BN_bin2bn((const unsigned char *)
1179*4c7ae22fSKai Ji 				xform->dsa.q.data,
1180*4c7ae22fSKai Ji 				xform->dsa.q.length,
1181*4c7ae22fSKai Ji 				q);
1182*4c7ae22fSKai Ji 		if (!p || !q || !g)
1183*4c7ae22fSKai Ji 			goto err_dsa;
1184*4c7ae22fSKai Ji 
1185*4c7ae22fSKai Ji 		priv_key = BN_bin2bn((const unsigned char *)
1186*4c7ae22fSKai Ji 				xform->dsa.x.data,
1187*4c7ae22fSKai Ji 				xform->dsa.x.length,
1188*4c7ae22fSKai Ji 				priv_key);
1189*4c7ae22fSKai Ji 		if (priv_key == NULL)
1190*4c7ae22fSKai Ji 			goto err_dsa;
1191*4c7ae22fSKai Ji 
1192*4c7ae22fSKai Ji 		param_bld = OSSL_PARAM_BLD_new();
1193*4c7ae22fSKai Ji 		if (!param_bld) {
1194*4c7ae22fSKai Ji 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
1195*4c7ae22fSKai Ji 			goto err_dsa;
1196*4c7ae22fSKai Ji 		}
1197*4c7ae22fSKai Ji 
1198*4c7ae22fSKai Ji 		if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_FFC_P, p)
1199*4c7ae22fSKai Ji 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_FFC_G, g)
1200*4c7ae22fSKai Ji 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_FFC_Q, q)
1201*4c7ae22fSKai Ji 			|| !OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_PRIV_KEY, priv_key)) {
1202*4c7ae22fSKai Ji 			OSSL_PARAM_BLD_free(param_bld);
1203*4c7ae22fSKai Ji 			OPENSSL_LOG(ERR, "failed to allocate resources\n");
1204*4c7ae22fSKai Ji 			goto err_dsa;
1205*4c7ae22fSKai Ji 		}
1206*4c7ae22fSKai Ji 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DSA;
1207*4c7ae22fSKai Ji 		asym_session->u.s.param_bld = param_bld;
1208*4c7ae22fSKai Ji 
1209*4c7ae22fSKai Ji 		break;
1210*4c7ae22fSKai Ji #else
1211ac42813aSSunila Sahu 		BIGNUM *p = NULL, *g = NULL;
1212ac42813aSSunila Sahu 		BIGNUM *q = NULL, *priv_key = NULL;
1213ac42813aSSunila Sahu 		BIGNUM *pub_key = BN_new();
1214ac42813aSSunila Sahu 		BN_zero(pub_key);
1215ac42813aSSunila Sahu 
1216ac42813aSSunila Sahu 		p = BN_bin2bn((const unsigned char *)
1217ac42813aSSunila Sahu 				xform->dsa.p.data,
1218ac42813aSSunila Sahu 				xform->dsa.p.length,
1219ac42813aSSunila Sahu 				p);
1220ac42813aSSunila Sahu 
1221ac42813aSSunila Sahu 		g = BN_bin2bn((const unsigned char *)
1222ac42813aSSunila Sahu 				xform->dsa.g.data,
1223ac42813aSSunila Sahu 				xform->dsa.g.length,
1224ac42813aSSunila Sahu 				g);
1225ac42813aSSunila Sahu 
1226ac42813aSSunila Sahu 		q = BN_bin2bn((const unsigned char *)
1227ac42813aSSunila Sahu 				xform->dsa.q.data,
1228ac42813aSSunila Sahu 				xform->dsa.q.length,
1229ac42813aSSunila Sahu 				q);
1230ac42813aSSunila Sahu 		if (!p || !q || !g)
1231ac42813aSSunila Sahu 			goto err_dsa;
1232ac42813aSSunila Sahu 
1233ac42813aSSunila Sahu 		priv_key = BN_bin2bn((const unsigned char *)
1234ac42813aSSunila Sahu 				xform->dsa.x.data,
1235ac42813aSSunila Sahu 				xform->dsa.x.length,
1236ac42813aSSunila Sahu 				priv_key);
1237ac42813aSSunila Sahu 		if (priv_key == NULL)
1238ac42813aSSunila Sahu 			goto err_dsa;
1239ac42813aSSunila Sahu 
1240ac42813aSSunila Sahu 		DSA *dsa = DSA_new();
1241ac42813aSSunila Sahu 		if (dsa == NULL) {
1242ac42813aSSunila Sahu 			OPENSSL_LOG(ERR,
1243ac42813aSSunila Sahu 				" failed to allocate resources\n");
1244ac42813aSSunila Sahu 			goto err_dsa;
1245ac42813aSSunila Sahu 		}
1246ac42813aSSunila Sahu 
12470b5284adSAshish Gupta 		ret = set_dsa_params(dsa, p, q, g);
1248ac42813aSSunila Sahu 		if (ret) {
1249ac42813aSSunila Sahu 			DSA_free(dsa);
1250ac42813aSSunila Sahu 			OPENSSL_LOG(ERR, "Failed to dsa params\n");
1251ac42813aSSunila Sahu 			goto err_dsa;
1252ac42813aSSunila Sahu 		}
1253ac42813aSSunila Sahu 
1254ac42813aSSunila Sahu 		/*
1255ac42813aSSunila Sahu 		 * openssl 1.1.0 mandate that public key can't be
1256ac42813aSSunila Sahu 		 * NULL in very first call. so set a dummy pub key.
1257ac42813aSSunila Sahu 		 * to keep consistency, lets follow same approach for
1258ac42813aSSunila Sahu 		 * both versions
1259ac42813aSSunila Sahu 		 */
1260ac42813aSSunila Sahu 		/* just set dummy public for very 1st call */
12610b5284adSAshish Gupta 		ret = set_dsa_keys(dsa, pub_key, priv_key);
1262ac42813aSSunila Sahu 		if (ret) {
1263ac42813aSSunila Sahu 			DSA_free(dsa);
1264ac42813aSSunila Sahu 			OPENSSL_LOG(ERR, "Failed to set keys\n");
1265ac42813aSSunila Sahu 			return -1;
1266ac42813aSSunila Sahu 		}
1267ac42813aSSunila Sahu 		asym_session->u.s.dsa = dsa;
1268ac42813aSSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DSA;
1269ac42813aSSunila Sahu 		break;
1270*4c7ae22fSKai Ji #endif
1271ac42813aSSunila Sahu err_dsa:
1272ac42813aSSunila Sahu 		BN_free(p);
1273ac42813aSSunila Sahu 		BN_free(q);
1274ac42813aSSunila Sahu 		BN_free(g);
1275ac42813aSSunila Sahu 		BN_free(priv_key);
1276ac42813aSSunila Sahu 		BN_free(pub_key);
1277ac42813aSSunila Sahu 		return -1;
1278ac42813aSSunila Sahu 	}
12793e9d6bd4SSunila Sahu 	default:
1280*4c7ae22fSKai Ji 		return ret;
12813e9d6bd4SSunila Sahu 	}
12823e9d6bd4SSunila Sahu 
12833e9d6bd4SSunila Sahu 	return 0;
12843e9d6bd4SSunila Sahu }
12853e9d6bd4SSunila Sahu 
12863e9d6bd4SSunila Sahu /** Configure the session from a crypto xform chain */
12873e9d6bd4SSunila Sahu static int
12883e9d6bd4SSunila Sahu openssl_pmd_asym_session_configure(struct rte_cryptodev *dev __rte_unused,
12893e9d6bd4SSunila Sahu 		struct rte_crypto_asym_xform *xform,
12901f1e4b7cSCiara Power 		struct rte_cryptodev_asym_session *sess)
12913e9d6bd4SSunila Sahu {
12923e9d6bd4SSunila Sahu 	void *asym_sess_private_data;
12933e9d6bd4SSunila Sahu 	int ret;
12943e9d6bd4SSunila Sahu 
12953e9d6bd4SSunila Sahu 	if (unlikely(sess == NULL)) {
12963e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "invalid asymmetric session struct");
12973e9d6bd4SSunila Sahu 		return -EINVAL;
12983e9d6bd4SSunila Sahu 	}
12993e9d6bd4SSunila Sahu 
13001f1e4b7cSCiara Power 	asym_sess_private_data = sess->sess_private_data;
13013e9d6bd4SSunila Sahu 	ret = openssl_set_asym_session_parameters(asym_sess_private_data,
13023e9d6bd4SSunila Sahu 			xform);
13033e9d6bd4SSunila Sahu 	if (ret != 0) {
13043e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "failed configure session parameters");
13053e9d6bd4SSunila Sahu 		return ret;
13063e9d6bd4SSunila Sahu 	}
13073e9d6bd4SSunila Sahu 
13083e9d6bd4SSunila Sahu 	return 0;
13093e9d6bd4SSunila Sahu }
13108a9867a6SSlawomir Mrozowicz 
13118a9867a6SSlawomir Mrozowicz /** Clear the memory of session so it doesn't leave key material behind */
13128a9867a6SSlawomir Mrozowicz static void
1313012c5076SPablo de Lara openssl_pmd_sym_session_clear(struct rte_cryptodev *dev,
1314b3bbd9e5SSlawomir Mrozowicz 		struct rte_cryptodev_sym_session *sess)
13158a9867a6SSlawomir Mrozowicz {
1316b3bbd9e5SSlawomir Mrozowicz 	uint8_t index = dev->driver_id;
1317012c5076SPablo de Lara 	void *sess_priv = get_sym_session_private_data(sess, index);
1318b3bbd9e5SSlawomir Mrozowicz 
1319b3bbd9e5SSlawomir Mrozowicz 	/* Zero out the whole structure */
1320b3bbd9e5SSlawomir Mrozowicz 	if (sess_priv) {
1321b3bbd9e5SSlawomir Mrozowicz 		openssl_reset_session(sess_priv);
1322b3bbd9e5SSlawomir Mrozowicz 		memset(sess_priv, 0, sizeof(struct openssl_session));
1323b3bbd9e5SSlawomir Mrozowicz 		struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
1324012c5076SPablo de Lara 		set_sym_session_private_data(sess, index, NULL);
1325b3bbd9e5SSlawomir Mrozowicz 		rte_mempool_put(sess_mp, sess_priv);
13268a9867a6SSlawomir Mrozowicz 	}
13278a9867a6SSlawomir Mrozowicz }
13288a9867a6SSlawomir Mrozowicz 
13293e9d6bd4SSunila Sahu static void openssl_reset_asym_session(struct openssl_asym_session *sess)
13303e9d6bd4SSunila Sahu {
13313e9d6bd4SSunila Sahu 	switch (sess->xfrm_type) {
13323e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_RSA:
1333d7bd42f6SKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1334d7bd42f6SKai Ji 		if (sess->u.r.ctx)
1335d7bd42f6SKai Ji 			EVP_PKEY_CTX_free(sess->u.r.ctx);
1336d7bd42f6SKai Ji #else
13373e9d6bd4SSunila Sahu 		if (sess->u.r.rsa)
13383e9d6bd4SSunila Sahu 			RSA_free(sess->u.r.rsa);
1339d7bd42f6SKai Ji #endif
13403e9d6bd4SSunila Sahu 		break;
13413e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
13423e9d6bd4SSunila Sahu 		if (sess->u.e.ctx) {
13433e9d6bd4SSunila Sahu 			BN_CTX_end(sess->u.e.ctx);
13443e9d6bd4SSunila Sahu 			BN_CTX_free(sess->u.e.ctx);
13453e9d6bd4SSunila Sahu 		}
13463e9d6bd4SSunila Sahu 		break;
13473e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
13483e9d6bd4SSunila Sahu 		if (sess->u.m.ctx) {
13493e9d6bd4SSunila Sahu 			BN_CTX_end(sess->u.m.ctx);
13503e9d6bd4SSunila Sahu 			BN_CTX_free(sess->u.m.ctx);
13513e9d6bd4SSunila Sahu 		}
13523e9d6bd4SSunila Sahu 		break;
1353ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DH:
1354c794b40cSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1355c794b40cSKai Ji 		sess->u.dh.param_bld = NULL;
1356c794b40cSKai Ji 		sess->u.dh.param_bld_peer = NULL;
1357c794b40cSKai Ji #else
1358ac42813aSSunila Sahu 		if (sess->u.dh.dh_key)
1359ac42813aSSunila Sahu 			DH_free(sess->u.dh.dh_key);
1360c794b40cSKai Ji #endif
1361ac42813aSSunila Sahu 		break;
1362ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DSA:
1363*4c7ae22fSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
1364*4c7ae22fSKai Ji 		sess->u.s.param_bld = NULL;
1365*4c7ae22fSKai Ji #else
1366ac42813aSSunila Sahu 		if (sess->u.s.dsa)
1367ac42813aSSunila Sahu 			DSA_free(sess->u.s.dsa);
1368*4c7ae22fSKai Ji #endif
1369ac42813aSSunila Sahu 		break;
13703e9d6bd4SSunila Sahu 	default:
13713e9d6bd4SSunila Sahu 		break;
13723e9d6bd4SSunila Sahu 	}
13733e9d6bd4SSunila Sahu }
13743e9d6bd4SSunila Sahu 
13753e9d6bd4SSunila Sahu /** Clear the memory of asymmetric session
13763e9d6bd4SSunila Sahu  * so it doesn't leave key material behind
13773e9d6bd4SSunila Sahu  */
13783e9d6bd4SSunila Sahu static void
13791f1e4b7cSCiara Power openssl_pmd_asym_session_clear(struct rte_cryptodev *dev __rte_unused,
13803e9d6bd4SSunila Sahu 		struct rte_cryptodev_asym_session *sess)
13813e9d6bd4SSunila Sahu {
13821f1e4b7cSCiara Power 	void *sess_priv = sess->sess_private_data;
13833e9d6bd4SSunila Sahu 
13843e9d6bd4SSunila Sahu 	/* Zero out the whole structure */
13853e9d6bd4SSunila Sahu 	if (sess_priv) {
13863e9d6bd4SSunila Sahu 		openssl_reset_asym_session(sess_priv);
13873e9d6bd4SSunila Sahu 		memset(sess_priv, 0, sizeof(struct openssl_asym_session));
13883e9d6bd4SSunila Sahu 	}
13893e9d6bd4SSunila Sahu }
13903e9d6bd4SSunila Sahu 
13918a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops openssl_pmd_ops = {
13928a9867a6SSlawomir Mrozowicz 		.dev_configure		= openssl_pmd_config,
13938a9867a6SSlawomir Mrozowicz 		.dev_start		= openssl_pmd_start,
13948a9867a6SSlawomir Mrozowicz 		.dev_stop		= openssl_pmd_stop,
13958a9867a6SSlawomir Mrozowicz 		.dev_close		= openssl_pmd_close,
13968a9867a6SSlawomir Mrozowicz 
13978a9867a6SSlawomir Mrozowicz 		.stats_get		= openssl_pmd_stats_get,
13988a9867a6SSlawomir Mrozowicz 		.stats_reset		= openssl_pmd_stats_reset,
13998a9867a6SSlawomir Mrozowicz 
14008a9867a6SSlawomir Mrozowicz 		.dev_infos_get		= openssl_pmd_info_get,
14018a9867a6SSlawomir Mrozowicz 
14028a9867a6SSlawomir Mrozowicz 		.queue_pair_setup	= openssl_pmd_qp_setup,
14038a9867a6SSlawomir Mrozowicz 		.queue_pair_release	= openssl_pmd_qp_release,
14048a9867a6SSlawomir Mrozowicz 
1405012c5076SPablo de Lara 		.sym_session_get_size	= openssl_pmd_sym_session_get_size,
14063e9d6bd4SSunila Sahu 		.asym_session_get_size	= openssl_pmd_asym_session_get_size,
1407012c5076SPablo de Lara 		.sym_session_configure	= openssl_pmd_sym_session_configure,
14083e9d6bd4SSunila Sahu 		.asym_session_configure	= openssl_pmd_asym_session_configure,
14093e9d6bd4SSunila Sahu 		.sym_session_clear	= openssl_pmd_sym_session_clear,
14103e9d6bd4SSunila Sahu 		.asym_session_clear	= openssl_pmd_asym_session_clear
14118a9867a6SSlawomir Mrozowicz };
14128a9867a6SSlawomir Mrozowicz 
14138a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops *rte_openssl_pmd_ops = &openssl_pmd_ops;
1414