xref: /dpdk/drivers/crypto/openssl/rte_openssl_pmd_ops.c (revision 3e9d6bd447fbf567df50c456caa2a6f7b1c78e74)
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>
98a9867a6SSlawomir Mrozowicz #include <rte_cryptodev_pmd.h>
108a9867a6SSlawomir Mrozowicz 
118a9867a6SSlawomir Mrozowicz #include "rte_openssl_pmd_private.h"
12*3e9d6bd4SSunila Sahu #include "compat.h"
138a9867a6SSlawomir Mrozowicz 
148a9867a6SSlawomir Mrozowicz 
158a9867a6SSlawomir Mrozowicz static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
168a9867a6SSlawomir Mrozowicz 	{	/* MD5 HMAC */
178a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
188a9867a6SSlawomir Mrozowicz 		{.sym = {
198a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
208a9867a6SSlawomir Mrozowicz 			{.auth = {
218a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5_HMAC,
228a9867a6SSlawomir Mrozowicz 				.block_size = 64,
238a9867a6SSlawomir Mrozowicz 				.key_size = {
24e5e7bc71SPablo de Lara 					.min = 1,
258a9867a6SSlawomir Mrozowicz 					.max = 64,
26e5e7bc71SPablo de Lara 					.increment = 1
278a9867a6SSlawomir Mrozowicz 				},
288a9867a6SSlawomir Mrozowicz 				.digest_size = {
298a9867a6SSlawomir Mrozowicz 					.min = 16,
308a9867a6SSlawomir Mrozowicz 					.max = 16,
318a9867a6SSlawomir Mrozowicz 					.increment = 0
328a9867a6SSlawomir Mrozowicz 				},
33acf86169SPablo de Lara 				.iv_size = { 0 }
348a9867a6SSlawomir Mrozowicz 			}, }
358a9867a6SSlawomir Mrozowicz 		}, }
368a9867a6SSlawomir Mrozowicz 	},
378a9867a6SSlawomir Mrozowicz 	{	/* MD5 */
388a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
398a9867a6SSlawomir Mrozowicz 		{.sym = {
408a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
418a9867a6SSlawomir Mrozowicz 			{.auth = {
428a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5,
438a9867a6SSlawomir Mrozowicz 				.block_size = 64,
448a9867a6SSlawomir Mrozowicz 				.key_size = {
458a9867a6SSlawomir Mrozowicz 					.min = 0,
468a9867a6SSlawomir Mrozowicz 					.max = 0,
478a9867a6SSlawomir Mrozowicz 					.increment = 0
488a9867a6SSlawomir Mrozowicz 				},
498a9867a6SSlawomir Mrozowicz 				.digest_size = {
508a9867a6SSlawomir Mrozowicz 					.min = 16,
518a9867a6SSlawomir Mrozowicz 					.max = 16,
528a9867a6SSlawomir Mrozowicz 					.increment = 0
538a9867a6SSlawomir Mrozowicz 				},
54acf86169SPablo de Lara 				.iv_size = { 0 }
558a9867a6SSlawomir Mrozowicz 			}, }
568a9867a6SSlawomir Mrozowicz 		}, }
578a9867a6SSlawomir Mrozowicz 	},
588a9867a6SSlawomir Mrozowicz 	{	/* SHA1 HMAC */
598a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
608a9867a6SSlawomir Mrozowicz 		{.sym = {
618a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
628a9867a6SSlawomir Mrozowicz 			{.auth = {
638a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
648a9867a6SSlawomir Mrozowicz 				.block_size = 64,
658a9867a6SSlawomir Mrozowicz 				.key_size = {
66e5e7bc71SPablo de Lara 					.min = 1,
678a9867a6SSlawomir Mrozowicz 					.max = 64,
68e5e7bc71SPablo de Lara 					.increment = 1
698a9867a6SSlawomir Mrozowicz 				},
708a9867a6SSlawomir Mrozowicz 				.digest_size = {
718a9867a6SSlawomir Mrozowicz 					.min = 20,
728a9867a6SSlawomir Mrozowicz 					.max = 20,
738a9867a6SSlawomir Mrozowicz 					.increment = 0
748a9867a6SSlawomir Mrozowicz 				},
75acf86169SPablo de Lara 				.iv_size = { 0 }
768a9867a6SSlawomir Mrozowicz 			}, }
778a9867a6SSlawomir Mrozowicz 		}, }
788a9867a6SSlawomir Mrozowicz 	},
798a9867a6SSlawomir Mrozowicz 	{	/* SHA1 */
808a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
818a9867a6SSlawomir Mrozowicz 		{.sym = {
828a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
838a9867a6SSlawomir Mrozowicz 			{.auth = {
848a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1,
858a9867a6SSlawomir Mrozowicz 				.block_size = 64,
868a9867a6SSlawomir Mrozowicz 				.key_size = {
878a9867a6SSlawomir Mrozowicz 					.min = 0,
888a9867a6SSlawomir Mrozowicz 					.max = 0,
898a9867a6SSlawomir Mrozowicz 					.increment = 0
908a9867a6SSlawomir Mrozowicz 				},
918a9867a6SSlawomir Mrozowicz 				.digest_size = {
928a9867a6SSlawomir Mrozowicz 					.min = 20,
938a9867a6SSlawomir Mrozowicz 					.max = 20,
948a9867a6SSlawomir Mrozowicz 					.increment = 0
958a9867a6SSlawomir Mrozowicz 				},
96acf86169SPablo de Lara 				.iv_size = { 0 }
978a9867a6SSlawomir Mrozowicz 			}, }
988a9867a6SSlawomir Mrozowicz 		}, }
998a9867a6SSlawomir Mrozowicz 	},
1008a9867a6SSlawomir Mrozowicz 	{	/* SHA224 HMAC */
1018a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1028a9867a6SSlawomir Mrozowicz 		{.sym = {
1038a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1048a9867a6SSlawomir Mrozowicz 			{.auth = {
1058a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
1068a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1078a9867a6SSlawomir Mrozowicz 				.key_size = {
108e5e7bc71SPablo de Lara 					.min = 1,
1098a9867a6SSlawomir Mrozowicz 					.max = 64,
110e5e7bc71SPablo de Lara 					.increment = 1
1118a9867a6SSlawomir Mrozowicz 				},
1128a9867a6SSlawomir Mrozowicz 				.digest_size = {
1138a9867a6SSlawomir Mrozowicz 					.min = 28,
1148a9867a6SSlawomir Mrozowicz 					.max = 28,
1158a9867a6SSlawomir Mrozowicz 					.increment = 0
1168a9867a6SSlawomir Mrozowicz 				},
117acf86169SPablo de Lara 				.iv_size = { 0 }
1188a9867a6SSlawomir Mrozowicz 			}, }
1198a9867a6SSlawomir Mrozowicz 		}, }
1208a9867a6SSlawomir Mrozowicz 	},
1218a9867a6SSlawomir Mrozowicz 	{	/* SHA224 */
1228a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1238a9867a6SSlawomir Mrozowicz 		{.sym = {
1248a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1258a9867a6SSlawomir Mrozowicz 			{.auth = {
1268a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224,
1278a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1288a9867a6SSlawomir Mrozowicz 				.key_size = {
1298a9867a6SSlawomir Mrozowicz 					.min = 0,
1308a9867a6SSlawomir Mrozowicz 					.max = 0,
1318a9867a6SSlawomir Mrozowicz 					.increment = 0
1328a9867a6SSlawomir Mrozowicz 				},
1338a9867a6SSlawomir Mrozowicz 				.digest_size = {
1348a9867a6SSlawomir Mrozowicz 					.min = 28,
1358a9867a6SSlawomir Mrozowicz 					.max = 28,
1368a9867a6SSlawomir Mrozowicz 					.increment = 0
1378a9867a6SSlawomir Mrozowicz 				},
138acf86169SPablo de Lara 				.iv_size = { 0 }
1398a9867a6SSlawomir Mrozowicz 			}, }
1408a9867a6SSlawomir Mrozowicz 		}, }
1418a9867a6SSlawomir Mrozowicz 	},
1428a9867a6SSlawomir Mrozowicz 	{	/* SHA256 HMAC */
1438a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1448a9867a6SSlawomir Mrozowicz 		{.sym = {
1458a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1468a9867a6SSlawomir Mrozowicz 			{.auth = {
1478a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
1488a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1498a9867a6SSlawomir Mrozowicz 				.key_size = {
150e5e7bc71SPablo de Lara 					.min = 1,
1518a9867a6SSlawomir Mrozowicz 					.max = 64,
152e5e7bc71SPablo de Lara 					.increment = 1
1538a9867a6SSlawomir Mrozowicz 				},
1548a9867a6SSlawomir Mrozowicz 				.digest_size = {
1558a9867a6SSlawomir Mrozowicz 					.min = 32,
1568a9867a6SSlawomir Mrozowicz 					.max = 32,
1578a9867a6SSlawomir Mrozowicz 					.increment = 0
1588a9867a6SSlawomir Mrozowicz 				},
159acf86169SPablo de Lara 				.iv_size = { 0 }
1608a9867a6SSlawomir Mrozowicz 			}, }
1618a9867a6SSlawomir Mrozowicz 		}, }
1628a9867a6SSlawomir Mrozowicz 	},
1638a9867a6SSlawomir Mrozowicz 	{	/* SHA256 */
1648a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1658a9867a6SSlawomir Mrozowicz 		{.sym = {
1668a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1678a9867a6SSlawomir Mrozowicz 			{.auth = {
1688a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256,
1698a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1708a9867a6SSlawomir Mrozowicz 				.key_size = {
1718a9867a6SSlawomir Mrozowicz 					.min = 0,
1728a9867a6SSlawomir Mrozowicz 					.max = 0,
1738a9867a6SSlawomir Mrozowicz 					.increment = 0
1748a9867a6SSlawomir Mrozowicz 				},
1758a9867a6SSlawomir Mrozowicz 				.digest_size = {
1768a9867a6SSlawomir Mrozowicz 					.min = 32,
1778a9867a6SSlawomir Mrozowicz 					.max = 32,
1788a9867a6SSlawomir Mrozowicz 					.increment = 0
1798a9867a6SSlawomir Mrozowicz 				},
180acf86169SPablo de Lara 				.iv_size = { 0 }
1818a9867a6SSlawomir Mrozowicz 			}, }
1828a9867a6SSlawomir Mrozowicz 		}, }
1838a9867a6SSlawomir Mrozowicz 	},
1848a9867a6SSlawomir Mrozowicz 	{	/* SHA384 HMAC */
1858a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1868a9867a6SSlawomir Mrozowicz 		{.sym = {
1878a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1888a9867a6SSlawomir Mrozowicz 			{.auth = {
1898a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
1908a9867a6SSlawomir Mrozowicz 				.block_size = 128,
1918a9867a6SSlawomir Mrozowicz 				.key_size = {
192e5e7bc71SPablo de Lara 					.min = 1,
1938a9867a6SSlawomir Mrozowicz 					.max = 128,
194e5e7bc71SPablo de Lara 					.increment = 1
1958a9867a6SSlawomir Mrozowicz 				},
1968a9867a6SSlawomir Mrozowicz 				.digest_size = {
1978a9867a6SSlawomir Mrozowicz 					.min = 48,
1988a9867a6SSlawomir Mrozowicz 					.max = 48,
1998a9867a6SSlawomir Mrozowicz 					.increment = 0
2008a9867a6SSlawomir Mrozowicz 				},
201acf86169SPablo de Lara 				.iv_size = { 0 }
2028a9867a6SSlawomir Mrozowicz 			}, }
2038a9867a6SSlawomir Mrozowicz 		}, }
2048a9867a6SSlawomir Mrozowicz 	},
2058a9867a6SSlawomir Mrozowicz 	{	/* SHA384 */
2068a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2078a9867a6SSlawomir Mrozowicz 		{.sym = {
2088a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2098a9867a6SSlawomir Mrozowicz 			{.auth = {
2108a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384,
2118a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2128a9867a6SSlawomir Mrozowicz 				.key_size = {
2138a9867a6SSlawomir Mrozowicz 					.min = 0,
2148a9867a6SSlawomir Mrozowicz 					.max = 0,
2158a9867a6SSlawomir Mrozowicz 					.increment = 0
2168a9867a6SSlawomir Mrozowicz 				},
2178a9867a6SSlawomir Mrozowicz 				.digest_size = {
2188a9867a6SSlawomir Mrozowicz 					.min = 48,
2198a9867a6SSlawomir Mrozowicz 					.max = 48,
2208a9867a6SSlawomir Mrozowicz 					.increment = 0
2218a9867a6SSlawomir Mrozowicz 				},
222acf86169SPablo de Lara 				.iv_size = { 0 }
2238a9867a6SSlawomir Mrozowicz 			}, }
2248a9867a6SSlawomir Mrozowicz 		}, }
2258a9867a6SSlawomir Mrozowicz 	},
2268a9867a6SSlawomir Mrozowicz 	{	/* SHA512 HMAC */
2278a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2288a9867a6SSlawomir Mrozowicz 		{.sym = {
2298a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2308a9867a6SSlawomir Mrozowicz 			{.auth = {
2318a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
2328a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2338a9867a6SSlawomir Mrozowicz 				.key_size = {
234e5e7bc71SPablo de Lara 					.min = 1,
2358a9867a6SSlawomir Mrozowicz 					.max = 128,
236e5e7bc71SPablo de Lara 					.increment = 1
2378a9867a6SSlawomir Mrozowicz 				},
2388a9867a6SSlawomir Mrozowicz 				.digest_size = {
2398a9867a6SSlawomir Mrozowicz 					.min = 64,
2408a9867a6SSlawomir Mrozowicz 					.max = 64,
2418a9867a6SSlawomir Mrozowicz 					.increment = 0
2428a9867a6SSlawomir Mrozowicz 				},
243acf86169SPablo de Lara 				.iv_size = { 0 }
2448a9867a6SSlawomir Mrozowicz 			}, }
2458a9867a6SSlawomir Mrozowicz 		}, }
2468a9867a6SSlawomir Mrozowicz 	},
2478a9867a6SSlawomir Mrozowicz 	{	/* SHA512  */
2488a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2498a9867a6SSlawomir Mrozowicz 		{.sym = {
2508a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2518a9867a6SSlawomir Mrozowicz 			{.auth = {
2528a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512,
2538a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2548a9867a6SSlawomir Mrozowicz 				.key_size = {
2558a9867a6SSlawomir Mrozowicz 					.min = 0,
2568a9867a6SSlawomir Mrozowicz 					.max = 0,
2578a9867a6SSlawomir Mrozowicz 					.increment = 0
2588a9867a6SSlawomir Mrozowicz 				},
2598a9867a6SSlawomir Mrozowicz 				.digest_size = {
2608a9867a6SSlawomir Mrozowicz 					.min = 64,
2618a9867a6SSlawomir Mrozowicz 					.max = 64,
2628a9867a6SSlawomir Mrozowicz 					.increment = 0
2638a9867a6SSlawomir Mrozowicz 				},
264acf86169SPablo de Lara 				.iv_size = { 0 }
2658a9867a6SSlawomir Mrozowicz 			}, }
2668a9867a6SSlawomir Mrozowicz 		}, }
2678a9867a6SSlawomir Mrozowicz 	},
2688a9867a6SSlawomir Mrozowicz 	{	/* AES CBC */
2698a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2708a9867a6SSlawomir Mrozowicz 		{.sym = {
2718a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
2728a9867a6SSlawomir Mrozowicz 			{.cipher = {
2738a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CBC,
2748a9867a6SSlawomir Mrozowicz 				.block_size = 16,
2758a9867a6SSlawomir Mrozowicz 				.key_size = {
2768a9867a6SSlawomir Mrozowicz 					.min = 16,
2778a9867a6SSlawomir Mrozowicz 					.max = 32,
2788a9867a6SSlawomir Mrozowicz 					.increment = 8
2798a9867a6SSlawomir Mrozowicz 				},
2808a9867a6SSlawomir Mrozowicz 				.iv_size = {
2818a9867a6SSlawomir Mrozowicz 					.min = 16,
2828a9867a6SSlawomir Mrozowicz 					.max = 16,
2838a9867a6SSlawomir Mrozowicz 					.increment = 0
2848a9867a6SSlawomir Mrozowicz 				}
2858a9867a6SSlawomir Mrozowicz 			}, }
2868a9867a6SSlawomir Mrozowicz 		}, }
2878a9867a6SSlawomir Mrozowicz 	},
2888a9867a6SSlawomir Mrozowicz 	{	/* AES CTR */
2898a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2908a9867a6SSlawomir Mrozowicz 		{.sym = {
2918a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
2928a9867a6SSlawomir Mrozowicz 			{.cipher = {
2938a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
2948a9867a6SSlawomir Mrozowicz 				.block_size = 16,
2958a9867a6SSlawomir Mrozowicz 				.key_size = {
2968a9867a6SSlawomir Mrozowicz 					.min = 16,
2978a9867a6SSlawomir Mrozowicz 					.max = 32,
2988a9867a6SSlawomir Mrozowicz 					.increment = 8
2998a9867a6SSlawomir Mrozowicz 				},
3008a9867a6SSlawomir Mrozowicz 				.iv_size = {
3018a9867a6SSlawomir Mrozowicz 					.min = 16,
3028a9867a6SSlawomir Mrozowicz 					.max = 16,
3038a9867a6SSlawomir Mrozowicz 					.increment = 0
3048a9867a6SSlawomir Mrozowicz 				}
3058a9867a6SSlawomir Mrozowicz 			}, }
3068a9867a6SSlawomir Mrozowicz 		}, }
3078a9867a6SSlawomir Mrozowicz 	},
308b79e4c00SPablo de Lara 	{	/* AES GCM */
3098a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3108a9867a6SSlawomir Mrozowicz 		{.sym = {
311b79e4c00SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
312b79e4c00SPablo de Lara 			{.aead = {
313b79e4c00SPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
3148a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3158a9867a6SSlawomir Mrozowicz 				.key_size = {
3168a9867a6SSlawomir Mrozowicz 					.min = 16,
3178a9867a6SSlawomir Mrozowicz 					.max = 32,
3188a9867a6SSlawomir Mrozowicz 					.increment = 8
3198a9867a6SSlawomir Mrozowicz 				},
3208a9867a6SSlawomir Mrozowicz 				.digest_size = {
3218a9867a6SSlawomir Mrozowicz 					.min = 16,
3228a9867a6SSlawomir Mrozowicz 					.max = 16,
3238a9867a6SSlawomir Mrozowicz 					.increment = 0
3248a9867a6SSlawomir Mrozowicz 				},
3258a9867a6SSlawomir Mrozowicz 				.aad_size = {
3260625598aSArek Kusztal 					.min = 0,
3270625598aSArek Kusztal 					.max = 65535,
3280625598aSArek Kusztal 					.increment = 1
329acf86169SPablo de Lara 				},
3308a9867a6SSlawomir Mrozowicz 				.iv_size = {
3318a9867a6SSlawomir Mrozowicz 					.min = 12,
3328a9867a6SSlawomir Mrozowicz 					.max = 16,
3338a9867a6SSlawomir Mrozowicz 					.increment = 4
334b79e4c00SPablo de Lara 				},
3358a9867a6SSlawomir Mrozowicz 			}, }
3368a9867a6SSlawomir Mrozowicz 		}, }
3378a9867a6SSlawomir Mrozowicz 	},
3381a4998dcSPablo de Lara 	{	/* AES CCM */
3391a4998dcSPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3401a4998dcSPablo de Lara 		{.sym = {
3411a4998dcSPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
3421a4998dcSPablo de Lara 			{.aead = {
3431a4998dcSPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_CCM,
3441a4998dcSPablo de Lara 				.block_size = 16,
3451a4998dcSPablo de Lara 				.key_size = {
3461a4998dcSPablo de Lara 					.min = 16,
3471a4998dcSPablo de Lara 					.max = 32,
3481a4998dcSPablo de Lara 					.increment = 8
3491a4998dcSPablo de Lara 				},
3501a4998dcSPablo de Lara 				.digest_size = {
3511a4998dcSPablo de Lara 					.min = 4,
3521a4998dcSPablo de Lara 					.max = 16,
3531a4998dcSPablo de Lara 					.increment = 2
3541a4998dcSPablo de Lara 				},
3551a4998dcSPablo de Lara 				.aad_size = {
3561a4998dcSPablo de Lara 					.min = 0,
3571a4998dcSPablo de Lara 					.max = 65535,
3581a4998dcSPablo de Lara 					.increment = 1
3591a4998dcSPablo de Lara 				},
3601a4998dcSPablo de Lara 				.iv_size = {
3611a4998dcSPablo de Lara 					.min = 7,
3621a4998dcSPablo de Lara 					.max = 13,
3631a4998dcSPablo de Lara 					.increment = 1
3641a4998dcSPablo de Lara 				},
3651a4998dcSPablo de Lara 			}, }
3661a4998dcSPablo de Lara 		}, }
3671a4998dcSPablo de Lara 	},
3688a9867a6SSlawomir Mrozowicz 	{	/* AES GMAC (AUTH) */
3698a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3708a9867a6SSlawomir Mrozowicz 		{.sym = {
3718a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
3728a9867a6SSlawomir Mrozowicz 			{.auth = {
3738a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_AES_GMAC,
3748a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3758a9867a6SSlawomir Mrozowicz 				.key_size = {
3768a9867a6SSlawomir Mrozowicz 					.min = 16,
3778a9867a6SSlawomir Mrozowicz 					.max = 32,
3788a9867a6SSlawomir Mrozowicz 					.increment = 8
3798a9867a6SSlawomir Mrozowicz 				},
3808a9867a6SSlawomir Mrozowicz 				.digest_size = {
3818a9867a6SSlawomir Mrozowicz 					.min = 16,
3828a9867a6SSlawomir Mrozowicz 					.max = 16,
3838a9867a6SSlawomir Mrozowicz 					.increment = 0
3848a9867a6SSlawomir Mrozowicz 				},
385e32e4fa8SPablo de Lara 				.iv_size = {
386e32e4fa8SPablo de Lara 					.min = 12,
387e32e4fa8SPablo de Lara 					.max = 16,
3888a9867a6SSlawomir Mrozowicz 					.increment = 4
389e32e4fa8SPablo de Lara 				}
3908a9867a6SSlawomir Mrozowicz 			}, }
3918a9867a6SSlawomir Mrozowicz 		}, }
3928a9867a6SSlawomir Mrozowicz 	},
3938a9867a6SSlawomir Mrozowicz 	{	/* 3DES CBC */
3948a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3958a9867a6SSlawomir Mrozowicz 		{.sym = {
3968a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
3978a9867a6SSlawomir Mrozowicz 			{.cipher = {
3988a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
3998a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4008a9867a6SSlawomir Mrozowicz 				.key_size = {
4019607e37eSMarko Kovacevic 					.min = 8,
4028a9867a6SSlawomir Mrozowicz 					.max = 24,
4038a9867a6SSlawomir Mrozowicz 					.increment = 8
4048a9867a6SSlawomir Mrozowicz 				},
4058a9867a6SSlawomir Mrozowicz 				.iv_size = {
4068a9867a6SSlawomir Mrozowicz 					.min = 8,
4078a9867a6SSlawomir Mrozowicz 					.max = 8,
4088a9867a6SSlawomir Mrozowicz 					.increment = 0
4098a9867a6SSlawomir Mrozowicz 				}
4108a9867a6SSlawomir Mrozowicz 			}, }
4118a9867a6SSlawomir Mrozowicz 		}, }
4128a9867a6SSlawomir Mrozowicz 	},
4138a9867a6SSlawomir Mrozowicz 	{	/* 3DES CTR */
4148a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4158a9867a6SSlawomir Mrozowicz 		{.sym = {
4168a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4178a9867a6SSlawomir Mrozowicz 			{.cipher = {
4188a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CTR,
4198a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4208a9867a6SSlawomir Mrozowicz 				.key_size = {
4218a9867a6SSlawomir Mrozowicz 					.min = 16,
4228a9867a6SSlawomir Mrozowicz 					.max = 24,
4238a9867a6SSlawomir Mrozowicz 					.increment = 8
4248a9867a6SSlawomir Mrozowicz 				},
4258a9867a6SSlawomir Mrozowicz 				.iv_size = {
4268a9867a6SSlawomir Mrozowicz 					.min = 8,
4278a9867a6SSlawomir Mrozowicz 					.max = 8,
4288a9867a6SSlawomir Mrozowicz 					.increment = 0
4298a9867a6SSlawomir Mrozowicz 				}
4308a9867a6SSlawomir Mrozowicz 			}, }
4318a9867a6SSlawomir Mrozowicz 		}, }
4328a9867a6SSlawomir Mrozowicz 	},
433c1734807SPablo de Lara 	{	/* DES CBC */
434c1734807SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
435c1734807SPablo de Lara 		{.sym = {
436c1734807SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
437c1734807SPablo de Lara 			{.cipher = {
438c1734807SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_CBC,
439c1734807SPablo de Lara 				.block_size = 8,
440c1734807SPablo de Lara 				.key_size = {
441c1734807SPablo de Lara 					.min = 8,
442c1734807SPablo de Lara 					.max = 8,
443c1734807SPablo de Lara 					.increment = 0
444c1734807SPablo de Lara 				},
445c1734807SPablo de Lara 				.iv_size = {
446c1734807SPablo de Lara 					.min = 8,
447c1734807SPablo de Lara 					.max = 8,
448c1734807SPablo de Lara 					.increment = 0
449c1734807SPablo de Lara 				}
450c1734807SPablo de Lara 			}, }
451c1734807SPablo de Lara 		}, }
452c1734807SPablo de Lara 	},
4531dee7bc7SPablo de Lara 	{	/* DES DOCSIS BPI */
4541dee7bc7SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4551dee7bc7SPablo de Lara 		{.sym = {
4561dee7bc7SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4571dee7bc7SPablo de Lara 			{.cipher = {
4581dee7bc7SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_DOCSISBPI,
4591dee7bc7SPablo de Lara 				.block_size = 8,
4601dee7bc7SPablo de Lara 				.key_size = {
4611dee7bc7SPablo de Lara 					.min = 8,
4621dee7bc7SPablo de Lara 					.max = 8,
4631dee7bc7SPablo de Lara 					.increment = 0
4641dee7bc7SPablo de Lara 				},
4651dee7bc7SPablo de Lara 				.iv_size = {
4661dee7bc7SPablo de Lara 					.min = 8,
4671dee7bc7SPablo de Lara 					.max = 8,
4681dee7bc7SPablo de Lara 					.increment = 0
4691dee7bc7SPablo de Lara 				}
4701dee7bc7SPablo de Lara 			}, }
4711dee7bc7SPablo de Lara 		}, }
4721dee7bc7SPablo de Lara 	},
473*3e9d6bd4SSunila Sahu 	{	/* RSA */
474*3e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
475*3e9d6bd4SSunila Sahu 		{.asym = {
476*3e9d6bd4SSunila Sahu 			.xform_capa = {
477*3e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_RSA,
478*3e9d6bd4SSunila Sahu 				.op_types = ((1 << RTE_CRYPTO_ASYM_OP_SIGN) |
479*3e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_VERIFY) |
480*3e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
481*3e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),
482*3e9d6bd4SSunila Sahu 				{
483*3e9d6bd4SSunila Sahu 				.modlen = {
484*3e9d6bd4SSunila Sahu 				/* min length is based on openssl rsa keygen */
485*3e9d6bd4SSunila Sahu 				.min = 30,
486*3e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
487*3e9d6bd4SSunila Sahu 				.max = 0,
488*3e9d6bd4SSunila Sahu 				.increment = 1
489*3e9d6bd4SSunila Sahu 				}, }
490*3e9d6bd4SSunila Sahu 			}
491*3e9d6bd4SSunila Sahu 		},
492*3e9d6bd4SSunila Sahu 		}
493*3e9d6bd4SSunila Sahu 	},
494*3e9d6bd4SSunila Sahu 	{	/* modexp */
495*3e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
496*3e9d6bd4SSunila Sahu 		{.asym = {
497*3e9d6bd4SSunila Sahu 			.xform_capa = {
498*3e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
499*3e9d6bd4SSunila Sahu 				.op_types = 0,
500*3e9d6bd4SSunila Sahu 				{
501*3e9d6bd4SSunila Sahu 				.modlen = {
502*3e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on min length */
503*3e9d6bd4SSunila Sahu 				.min = 0,
504*3e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
505*3e9d6bd4SSunila Sahu 				.max = 0,
506*3e9d6bd4SSunila Sahu 				.increment = 1
507*3e9d6bd4SSunila Sahu 				}, }
508*3e9d6bd4SSunila Sahu 			}
509*3e9d6bd4SSunila Sahu 		},
510*3e9d6bd4SSunila Sahu 		}
511*3e9d6bd4SSunila Sahu 	},
512*3e9d6bd4SSunila Sahu 	{	/* modinv */
513*3e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
514*3e9d6bd4SSunila Sahu 		{.asym = {
515*3e9d6bd4SSunila Sahu 			.xform_capa = {
516*3e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODINV,
517*3e9d6bd4SSunila Sahu 				.op_types = 0,
518*3e9d6bd4SSunila Sahu 				{
519*3e9d6bd4SSunila Sahu 				.modlen = {
520*3e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on min length */
521*3e9d6bd4SSunila Sahu 				.min = 0,
522*3e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
523*3e9d6bd4SSunila Sahu 				.max = 0,
524*3e9d6bd4SSunila Sahu 				.increment = 1
525*3e9d6bd4SSunila Sahu 				}, }
526*3e9d6bd4SSunila Sahu 			}
527*3e9d6bd4SSunila Sahu 		},
528*3e9d6bd4SSunila Sahu 		}
529*3e9d6bd4SSunila Sahu 	},
5308a9867a6SSlawomir Mrozowicz 
5318a9867a6SSlawomir Mrozowicz 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
5328a9867a6SSlawomir Mrozowicz };
5338a9867a6SSlawomir Mrozowicz 
5348a9867a6SSlawomir Mrozowicz 
5358a9867a6SSlawomir Mrozowicz /** Configure device */
5368a9867a6SSlawomir Mrozowicz static int
53760e686c2SFan Zhang openssl_pmd_config(__rte_unused struct rte_cryptodev *dev,
53860e686c2SFan Zhang 		__rte_unused struct rte_cryptodev_config *config)
5398a9867a6SSlawomir Mrozowicz {
5408a9867a6SSlawomir Mrozowicz 	return 0;
5418a9867a6SSlawomir Mrozowicz }
5428a9867a6SSlawomir Mrozowicz 
5438a9867a6SSlawomir Mrozowicz /** Start device */
5448a9867a6SSlawomir Mrozowicz static int
5458a9867a6SSlawomir Mrozowicz openssl_pmd_start(__rte_unused struct rte_cryptodev *dev)
5468a9867a6SSlawomir Mrozowicz {
5478a9867a6SSlawomir Mrozowicz 	return 0;
5488a9867a6SSlawomir Mrozowicz }
5498a9867a6SSlawomir Mrozowicz 
5508a9867a6SSlawomir Mrozowicz /** Stop device */
5518a9867a6SSlawomir Mrozowicz static void
5528a9867a6SSlawomir Mrozowicz openssl_pmd_stop(__rte_unused struct rte_cryptodev *dev)
5538a9867a6SSlawomir Mrozowicz {
5548a9867a6SSlawomir Mrozowicz }
5558a9867a6SSlawomir Mrozowicz 
5568a9867a6SSlawomir Mrozowicz /** Close device */
5578a9867a6SSlawomir Mrozowicz static int
5588a9867a6SSlawomir Mrozowicz openssl_pmd_close(__rte_unused struct rte_cryptodev *dev)
5598a9867a6SSlawomir Mrozowicz {
5608a9867a6SSlawomir Mrozowicz 	return 0;
5618a9867a6SSlawomir Mrozowicz }
5628a9867a6SSlawomir Mrozowicz 
5638a9867a6SSlawomir Mrozowicz 
5648a9867a6SSlawomir Mrozowicz /** Get device statistics */
5658a9867a6SSlawomir Mrozowicz static void
5668a9867a6SSlawomir Mrozowicz openssl_pmd_stats_get(struct rte_cryptodev *dev,
5678a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_stats *stats)
5688a9867a6SSlawomir Mrozowicz {
5698a9867a6SSlawomir Mrozowicz 	int qp_id;
5708a9867a6SSlawomir Mrozowicz 
5718a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
5728a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
5738a9867a6SSlawomir Mrozowicz 
5748a9867a6SSlawomir Mrozowicz 		stats->enqueued_count += qp->stats.enqueued_count;
5758a9867a6SSlawomir Mrozowicz 		stats->dequeued_count += qp->stats.dequeued_count;
5768a9867a6SSlawomir Mrozowicz 
5778a9867a6SSlawomir Mrozowicz 		stats->enqueue_err_count += qp->stats.enqueue_err_count;
5788a9867a6SSlawomir Mrozowicz 		stats->dequeue_err_count += qp->stats.dequeue_err_count;
5798a9867a6SSlawomir Mrozowicz 	}
5808a9867a6SSlawomir Mrozowicz }
5818a9867a6SSlawomir Mrozowicz 
5828a9867a6SSlawomir Mrozowicz /** Reset device statistics */
5838a9867a6SSlawomir Mrozowicz static void
5848a9867a6SSlawomir Mrozowicz openssl_pmd_stats_reset(struct rte_cryptodev *dev)
5858a9867a6SSlawomir Mrozowicz {
5868a9867a6SSlawomir Mrozowicz 	int qp_id;
5878a9867a6SSlawomir Mrozowicz 
5888a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
5898a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
5908a9867a6SSlawomir Mrozowicz 
5918a9867a6SSlawomir Mrozowicz 		memset(&qp->stats, 0, sizeof(qp->stats));
5928a9867a6SSlawomir Mrozowicz 	}
5938a9867a6SSlawomir Mrozowicz }
5948a9867a6SSlawomir Mrozowicz 
5958a9867a6SSlawomir Mrozowicz 
5968a9867a6SSlawomir Mrozowicz /** Get device info */
5978a9867a6SSlawomir Mrozowicz static void
5988a9867a6SSlawomir Mrozowicz openssl_pmd_info_get(struct rte_cryptodev *dev,
5998a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_info *dev_info)
6008a9867a6SSlawomir Mrozowicz {
6018a9867a6SSlawomir Mrozowicz 	struct openssl_private *internals = dev->data->dev_private;
6028a9867a6SSlawomir Mrozowicz 
6038a9867a6SSlawomir Mrozowicz 	if (dev_info != NULL) {
6047a364faeSSlawomir Mrozowicz 		dev_info->driver_id = dev->driver_id;
6058a9867a6SSlawomir Mrozowicz 		dev_info->feature_flags = dev->feature_flags;
6068a9867a6SSlawomir Mrozowicz 		dev_info->capabilities = openssl_pmd_capabilities;
6078a9867a6SSlawomir Mrozowicz 		dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
608e1fc5b76SPablo de Lara 		/* No limit of number of sessions */
609e1fc5b76SPablo de Lara 		dev_info->sym.max_nb_sessions = 0;
6108a9867a6SSlawomir Mrozowicz 	}
6118a9867a6SSlawomir Mrozowicz }
6128a9867a6SSlawomir Mrozowicz 
6138a9867a6SSlawomir Mrozowicz /** Release queue pair */
6148a9867a6SSlawomir Mrozowicz static int
6158a9867a6SSlawomir Mrozowicz openssl_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
6168a9867a6SSlawomir Mrozowicz {
6178a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL) {
6188a9867a6SSlawomir Mrozowicz 		rte_free(dev->data->queue_pairs[qp_id]);
6198a9867a6SSlawomir Mrozowicz 		dev->data->queue_pairs[qp_id] = NULL;
6208a9867a6SSlawomir Mrozowicz 	}
6218a9867a6SSlawomir Mrozowicz 	return 0;
6228a9867a6SSlawomir Mrozowicz }
6238a9867a6SSlawomir Mrozowicz 
6248a9867a6SSlawomir Mrozowicz /** set a unique name for the queue pair based on it's name, dev_id and qp_id */
6258a9867a6SSlawomir Mrozowicz static int
6268a9867a6SSlawomir Mrozowicz openssl_pmd_qp_set_unique_name(struct rte_cryptodev *dev,
6278a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp)
6288a9867a6SSlawomir Mrozowicz {
6298a9867a6SSlawomir Mrozowicz 	unsigned int n = snprintf(qp->name, sizeof(qp->name),
6308a9867a6SSlawomir Mrozowicz 			"openssl_pmd_%u_qp_%u",
6318a9867a6SSlawomir Mrozowicz 			dev->data->dev_id, qp->id);
6328a9867a6SSlawomir Mrozowicz 
6336ab25e63STomasz Duszynski 	if (n >= sizeof(qp->name))
6348a9867a6SSlawomir Mrozowicz 		return -1;
6358a9867a6SSlawomir Mrozowicz 
6368a9867a6SSlawomir Mrozowicz 	return 0;
6378a9867a6SSlawomir Mrozowicz }
6388a9867a6SSlawomir Mrozowicz 
6398a9867a6SSlawomir Mrozowicz 
6408a9867a6SSlawomir Mrozowicz /** Create a ring to place processed operations on */
6418a9867a6SSlawomir Mrozowicz static struct rte_ring *
6428a9867a6SSlawomir Mrozowicz openssl_pmd_qp_create_processed_ops_ring(struct openssl_qp *qp,
6438a9867a6SSlawomir Mrozowicz 		unsigned int ring_size, int socket_id)
6448a9867a6SSlawomir Mrozowicz {
6458a9867a6SSlawomir Mrozowicz 	struct rte_ring *r;
6468a9867a6SSlawomir Mrozowicz 
6478a9867a6SSlawomir Mrozowicz 	r = rte_ring_lookup(qp->name);
6488a9867a6SSlawomir Mrozowicz 	if (r) {
649636e7392SBruce Richardson 		if (rte_ring_get_size(r) >= ring_size) {
650094b2386SNaga Suresh Somarowthu 			OPENSSL_LOG(INFO,
6518a9867a6SSlawomir Mrozowicz 					"Reusing existing ring %s for processed ops",
6528a9867a6SSlawomir Mrozowicz 				 qp->name);
6538a9867a6SSlawomir Mrozowicz 			return r;
6548a9867a6SSlawomir Mrozowicz 		}
6558a9867a6SSlawomir Mrozowicz 
656094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR,
6578a9867a6SSlawomir Mrozowicz 				"Unable to reuse existing ring %s for processed ops",
6588a9867a6SSlawomir Mrozowicz 			 qp->name);
6598a9867a6SSlawomir Mrozowicz 		return NULL;
6608a9867a6SSlawomir Mrozowicz 	}
6618a9867a6SSlawomir Mrozowicz 
6628a9867a6SSlawomir Mrozowicz 	return rte_ring_create(qp->name, ring_size, socket_id,
6638a9867a6SSlawomir Mrozowicz 			RING_F_SP_ENQ | RING_F_SC_DEQ);
6648a9867a6SSlawomir Mrozowicz }
6658a9867a6SSlawomir Mrozowicz 
6668a9867a6SSlawomir Mrozowicz 
6678a9867a6SSlawomir Mrozowicz /** Setup a queue pair */
6688a9867a6SSlawomir Mrozowicz static int
6698a9867a6SSlawomir Mrozowicz openssl_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
6708a9867a6SSlawomir Mrozowicz 		const struct rte_cryptodev_qp_conf *qp_conf,
671f7db6f82SPablo de Lara 		int socket_id, struct rte_mempool *session_pool)
6728a9867a6SSlawomir Mrozowicz {
6738a9867a6SSlawomir Mrozowicz 	struct openssl_qp *qp = NULL;
6748a9867a6SSlawomir Mrozowicz 
6758a9867a6SSlawomir Mrozowicz 	/* Free memory prior to re-allocation if needed. */
6768a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL)
6778a9867a6SSlawomir Mrozowicz 		openssl_pmd_qp_release(dev, qp_id);
6788a9867a6SSlawomir Mrozowicz 
6798a9867a6SSlawomir Mrozowicz 	/* Allocate the queue pair data structure. */
6808a9867a6SSlawomir Mrozowicz 	qp = rte_zmalloc_socket("OPENSSL PMD Queue Pair", sizeof(*qp),
6818a9867a6SSlawomir Mrozowicz 					RTE_CACHE_LINE_SIZE, socket_id);
6828a9867a6SSlawomir Mrozowicz 	if (qp == NULL)
6838a9867a6SSlawomir Mrozowicz 		return -ENOMEM;
6848a9867a6SSlawomir Mrozowicz 
6858a9867a6SSlawomir Mrozowicz 	qp->id = qp_id;
6868a9867a6SSlawomir Mrozowicz 	dev->data->queue_pairs[qp_id] = qp;
6878a9867a6SSlawomir Mrozowicz 
6888a9867a6SSlawomir Mrozowicz 	if (openssl_pmd_qp_set_unique_name(dev, qp))
6898a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
6908a9867a6SSlawomir Mrozowicz 
6918a9867a6SSlawomir Mrozowicz 	qp->processed_ops = openssl_pmd_qp_create_processed_ops_ring(qp,
6928a9867a6SSlawomir Mrozowicz 			qp_conf->nb_descriptors, socket_id);
6938a9867a6SSlawomir Mrozowicz 	if (qp->processed_ops == NULL)
6948a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
6958a9867a6SSlawomir Mrozowicz 
696f7db6f82SPablo de Lara 	qp->sess_mp = session_pool;
6978a9867a6SSlawomir Mrozowicz 
6988a9867a6SSlawomir Mrozowicz 	memset(&qp->stats, 0, sizeof(qp->stats));
6998a9867a6SSlawomir Mrozowicz 
7008a9867a6SSlawomir Mrozowicz 	return 0;
7018a9867a6SSlawomir Mrozowicz 
7028a9867a6SSlawomir Mrozowicz qp_setup_cleanup:
7038a9867a6SSlawomir Mrozowicz 	if (qp)
7048a9867a6SSlawomir Mrozowicz 		rte_free(qp);
7058a9867a6SSlawomir Mrozowicz 
7068a9867a6SSlawomir Mrozowicz 	return -1;
7078a9867a6SSlawomir Mrozowicz }
7088a9867a6SSlawomir Mrozowicz 
7098a9867a6SSlawomir Mrozowicz /** Return the number of allocated queue pairs */
7108a9867a6SSlawomir Mrozowicz static uint32_t
7118a9867a6SSlawomir Mrozowicz openssl_pmd_qp_count(struct rte_cryptodev *dev)
7128a9867a6SSlawomir Mrozowicz {
7138a9867a6SSlawomir Mrozowicz 	return dev->data->nb_queue_pairs;
7148a9867a6SSlawomir Mrozowicz }
7158a9867a6SSlawomir Mrozowicz 
716*3e9d6bd4SSunila Sahu /** Returns the size of the symmetric session structure */
7178a9867a6SSlawomir Mrozowicz static unsigned
718012c5076SPablo de Lara openssl_pmd_sym_session_get_size(struct rte_cryptodev *dev __rte_unused)
7198a9867a6SSlawomir Mrozowicz {
7208a9867a6SSlawomir Mrozowicz 	return sizeof(struct openssl_session);
7218a9867a6SSlawomir Mrozowicz }
7228a9867a6SSlawomir Mrozowicz 
723*3e9d6bd4SSunila Sahu /** Returns the size of the asymmetric session structure */
724*3e9d6bd4SSunila Sahu static unsigned
725*3e9d6bd4SSunila Sahu openssl_pmd_asym_session_get_size(struct rte_cryptodev *dev __rte_unused)
726*3e9d6bd4SSunila Sahu {
727*3e9d6bd4SSunila Sahu 	return sizeof(struct openssl_asym_session);
728*3e9d6bd4SSunila Sahu }
729*3e9d6bd4SSunila Sahu 
7308a9867a6SSlawomir Mrozowicz /** Configure the session from a crypto xform chain */
731b3bbd9e5SSlawomir Mrozowicz static int
732012c5076SPablo de Lara openssl_pmd_sym_session_configure(struct rte_cryptodev *dev __rte_unused,
733b3bbd9e5SSlawomir Mrozowicz 		struct rte_crypto_sym_xform *xform,
734b3bbd9e5SSlawomir Mrozowicz 		struct rte_cryptodev_sym_session *sess,
735b3bbd9e5SSlawomir Mrozowicz 		struct rte_mempool *mempool)
7368a9867a6SSlawomir Mrozowicz {
737b3bbd9e5SSlawomir Mrozowicz 	void *sess_private_data;
73827391b53SPablo de Lara 	int ret;
739b3bbd9e5SSlawomir Mrozowicz 
7408a9867a6SSlawomir Mrozowicz 	if (unlikely(sess == NULL)) {
741094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR, "invalid session struct");
74227391b53SPablo de Lara 		return -EINVAL;
743b3bbd9e5SSlawomir Mrozowicz 	}
744b3bbd9e5SSlawomir Mrozowicz 
745b3bbd9e5SSlawomir Mrozowicz 	if (rte_mempool_get(mempool, &sess_private_data)) {
746094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR,
747b3bbd9e5SSlawomir Mrozowicz 			"Couldn't get object from session mempool");
74827391b53SPablo de Lara 		return -ENOMEM;
7498a9867a6SSlawomir Mrozowicz 	}
7508a9867a6SSlawomir Mrozowicz 
75127391b53SPablo de Lara 	ret = openssl_set_session_parameters(sess_private_data, xform);
75227391b53SPablo de Lara 	if (ret != 0) {
753094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR, "failed configure session parameters");
754b3bbd9e5SSlawomir Mrozowicz 
755b3bbd9e5SSlawomir Mrozowicz 		/* Return session to mempool */
756b3bbd9e5SSlawomir Mrozowicz 		rte_mempool_put(mempool, sess_private_data);
75727391b53SPablo de Lara 		return ret;
7588a9867a6SSlawomir Mrozowicz 	}
7598a9867a6SSlawomir Mrozowicz 
760012c5076SPablo de Lara 	set_sym_session_private_data(sess, dev->driver_id,
761b3bbd9e5SSlawomir Mrozowicz 			sess_private_data);
762b3bbd9e5SSlawomir Mrozowicz 
763b3bbd9e5SSlawomir Mrozowicz 	return 0;
7648a9867a6SSlawomir Mrozowicz }
7658a9867a6SSlawomir Mrozowicz 
766*3e9d6bd4SSunila Sahu static int openssl_set_asym_session_parameters(
767*3e9d6bd4SSunila Sahu 		struct openssl_asym_session *asym_session,
768*3e9d6bd4SSunila Sahu 		struct rte_crypto_asym_xform *xform)
769*3e9d6bd4SSunila Sahu {
770*3e9d6bd4SSunila Sahu 	int ret = 0;
771*3e9d6bd4SSunila Sahu 
772*3e9d6bd4SSunila Sahu 	if (xform->next != NULL) {
773*3e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "chained xfrms are not supported on %s",
774*3e9d6bd4SSunila Sahu 			rte_crypto_asym_xform_strings[xform->xform_type]);
775*3e9d6bd4SSunila Sahu 		return -1;
776*3e9d6bd4SSunila Sahu 	}
777*3e9d6bd4SSunila Sahu 
778*3e9d6bd4SSunila Sahu 	switch (xform->xform_type) {
779*3e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_RSA:
780*3e9d6bd4SSunila Sahu 	{
781*3e9d6bd4SSunila Sahu 		BIGNUM *n = NULL;
782*3e9d6bd4SSunila Sahu 		BIGNUM *e = NULL;
783*3e9d6bd4SSunila Sahu 		BIGNUM *d = NULL;
784*3e9d6bd4SSunila Sahu 		BIGNUM *p = NULL, *q = NULL, *dmp1 = NULL;
785*3e9d6bd4SSunila Sahu 		BIGNUM *iqmp = NULL, *dmq1 = NULL;
786*3e9d6bd4SSunila Sahu 
787*3e9d6bd4SSunila Sahu 		/* copy xfrm data into rsa struct */
788*3e9d6bd4SSunila Sahu 		n = BN_bin2bn((const unsigned char *)xform->rsa.n.data,
789*3e9d6bd4SSunila Sahu 				xform->rsa.n.length, n);
790*3e9d6bd4SSunila Sahu 		e = BN_bin2bn((const unsigned char *)xform->rsa.e.data,
791*3e9d6bd4SSunila Sahu 				xform->rsa.e.length, e);
792*3e9d6bd4SSunila Sahu 
793*3e9d6bd4SSunila Sahu 		if (!n || !e)
794*3e9d6bd4SSunila Sahu 			goto err_rsa;
795*3e9d6bd4SSunila Sahu 
796*3e9d6bd4SSunila Sahu 		RSA *rsa = RSA_new();
797*3e9d6bd4SSunila Sahu 		if (rsa == NULL)
798*3e9d6bd4SSunila Sahu 			goto err_rsa;
799*3e9d6bd4SSunila Sahu 
800*3e9d6bd4SSunila Sahu 		if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) {
801*3e9d6bd4SSunila Sahu 			d = BN_bin2bn(
802*3e9d6bd4SSunila Sahu 			(const unsigned char *)xform->rsa.d.data,
803*3e9d6bd4SSunila Sahu 			xform->rsa.d.length,
804*3e9d6bd4SSunila Sahu 			d);
805*3e9d6bd4SSunila Sahu 			if (!d) {
806*3e9d6bd4SSunila Sahu 				RSA_free(rsa);
807*3e9d6bd4SSunila Sahu 				goto err_rsa;
808*3e9d6bd4SSunila Sahu 			}
809*3e9d6bd4SSunila Sahu 		} else {
810*3e9d6bd4SSunila Sahu 			p = BN_bin2bn((const unsigned char *)
811*3e9d6bd4SSunila Sahu 					xform->rsa.qt.p.data,
812*3e9d6bd4SSunila Sahu 					xform->rsa.qt.p.length,
813*3e9d6bd4SSunila Sahu 					p);
814*3e9d6bd4SSunila Sahu 			q = BN_bin2bn((const unsigned char *)
815*3e9d6bd4SSunila Sahu 					xform->rsa.qt.q.data,
816*3e9d6bd4SSunila Sahu 					xform->rsa.qt.q.length,
817*3e9d6bd4SSunila Sahu 					q);
818*3e9d6bd4SSunila Sahu 			dmp1 = BN_bin2bn((const unsigned char *)
819*3e9d6bd4SSunila Sahu 					xform->rsa.qt.dP.data,
820*3e9d6bd4SSunila Sahu 					xform->rsa.qt.dP.length,
821*3e9d6bd4SSunila Sahu 					dmp1);
822*3e9d6bd4SSunila Sahu 			dmq1 = BN_bin2bn((const unsigned char *)
823*3e9d6bd4SSunila Sahu 					xform->rsa.qt.dQ.data,
824*3e9d6bd4SSunila Sahu 					xform->rsa.qt.dQ.length,
825*3e9d6bd4SSunila Sahu 					dmq1);
826*3e9d6bd4SSunila Sahu 			iqmp = BN_bin2bn((const unsigned char *)
827*3e9d6bd4SSunila Sahu 					xform->rsa.qt.qInv.data,
828*3e9d6bd4SSunila Sahu 					xform->rsa.qt.qInv.length,
829*3e9d6bd4SSunila Sahu 					iqmp);
830*3e9d6bd4SSunila Sahu 
831*3e9d6bd4SSunila Sahu 			if (!p || !q || !dmp1 || !dmq1 || !iqmp) {
832*3e9d6bd4SSunila Sahu 				RSA_free(rsa);
833*3e9d6bd4SSunila Sahu 				goto err_rsa;
834*3e9d6bd4SSunila Sahu 			}
835*3e9d6bd4SSunila Sahu 			set_rsa_params(rsa, p, q, ret);
836*3e9d6bd4SSunila Sahu 			if (ret) {
837*3e9d6bd4SSunila Sahu 				OPENSSL_LOG(ERR,
838*3e9d6bd4SSunila Sahu 					"failed to set rsa params\n");
839*3e9d6bd4SSunila Sahu 				RSA_free(rsa);
840*3e9d6bd4SSunila Sahu 				goto err_rsa;
841*3e9d6bd4SSunila Sahu 			}
842*3e9d6bd4SSunila Sahu 			set_rsa_crt_params(rsa, dmp1, dmq1, iqmp, ret);
843*3e9d6bd4SSunila Sahu 			if (ret) {
844*3e9d6bd4SSunila Sahu 				OPENSSL_LOG(ERR,
845*3e9d6bd4SSunila Sahu 					"failed to set crt params\n");
846*3e9d6bd4SSunila Sahu 				RSA_free(rsa);
847*3e9d6bd4SSunila Sahu 				/*
848*3e9d6bd4SSunila Sahu 				 * set already populated params to NULL
849*3e9d6bd4SSunila Sahu 				 * as its freed by call to RSA_free
850*3e9d6bd4SSunila Sahu 				 */
851*3e9d6bd4SSunila Sahu 				p = q = NULL;
852*3e9d6bd4SSunila Sahu 				goto err_rsa;
853*3e9d6bd4SSunila Sahu 			}
854*3e9d6bd4SSunila Sahu 		}
855*3e9d6bd4SSunila Sahu 
856*3e9d6bd4SSunila Sahu 		set_rsa_keys(rsa, n, e, d, ret);
857*3e9d6bd4SSunila Sahu 		if (ret) {
858*3e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR, "Failed to load rsa keys\n");
859*3e9d6bd4SSunila Sahu 			RSA_free(rsa);
860*3e9d6bd4SSunila Sahu 			return -1;
861*3e9d6bd4SSunila Sahu 		}
862*3e9d6bd4SSunila Sahu 		asym_session->u.r.rsa = rsa;
863*3e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA;
864*3e9d6bd4SSunila Sahu 		break;
865*3e9d6bd4SSunila Sahu err_rsa:
866*3e9d6bd4SSunila Sahu 		if (n)
867*3e9d6bd4SSunila Sahu 			BN_free(n);
868*3e9d6bd4SSunila Sahu 		if (e)
869*3e9d6bd4SSunila Sahu 			BN_free(e);
870*3e9d6bd4SSunila Sahu 		if (d)
871*3e9d6bd4SSunila Sahu 			BN_free(d);
872*3e9d6bd4SSunila Sahu 		if (p)
873*3e9d6bd4SSunila Sahu 			BN_free(p);
874*3e9d6bd4SSunila Sahu 		if (q)
875*3e9d6bd4SSunila Sahu 			BN_free(q);
876*3e9d6bd4SSunila Sahu 		if (dmp1)
877*3e9d6bd4SSunila Sahu 			BN_free(dmp1);
878*3e9d6bd4SSunila Sahu 		if (dmq1)
879*3e9d6bd4SSunila Sahu 			BN_free(dmq1);
880*3e9d6bd4SSunila Sahu 		if (iqmp)
881*3e9d6bd4SSunila Sahu 			BN_free(iqmp);
882*3e9d6bd4SSunila Sahu 
883*3e9d6bd4SSunila Sahu 		return -1;
884*3e9d6bd4SSunila Sahu 	}
885*3e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
886*3e9d6bd4SSunila Sahu 	{
887*3e9d6bd4SSunila Sahu 		struct rte_crypto_modex_xform *xfrm = &(xform->modex);
888*3e9d6bd4SSunila Sahu 
889*3e9d6bd4SSunila Sahu 		BN_CTX *ctx = BN_CTX_new();
890*3e9d6bd4SSunila Sahu 		if (ctx == NULL) {
891*3e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR,
892*3e9d6bd4SSunila Sahu 				" failed to allocate resources\n");
893*3e9d6bd4SSunila Sahu 			return -1;
894*3e9d6bd4SSunila Sahu 		}
895*3e9d6bd4SSunila Sahu 		BN_CTX_start(ctx);
896*3e9d6bd4SSunila Sahu 		BIGNUM *mod = BN_CTX_get(ctx);
897*3e9d6bd4SSunila Sahu 		BIGNUM *exp = BN_CTX_get(ctx);
898*3e9d6bd4SSunila Sahu 		if (mod == NULL || exp == NULL) {
899*3e9d6bd4SSunila Sahu 			BN_CTX_end(ctx);
900*3e9d6bd4SSunila Sahu 			BN_CTX_free(ctx);
901*3e9d6bd4SSunila Sahu 			return -1;
902*3e9d6bd4SSunila Sahu 		}
903*3e9d6bd4SSunila Sahu 
904*3e9d6bd4SSunila Sahu 		mod = BN_bin2bn((const unsigned char *)
905*3e9d6bd4SSunila Sahu 				xfrm->modulus.data,
906*3e9d6bd4SSunila Sahu 				xfrm->modulus.length, mod);
907*3e9d6bd4SSunila Sahu 		exp = BN_bin2bn((const unsigned char *)
908*3e9d6bd4SSunila Sahu 				xfrm->exponent.data,
909*3e9d6bd4SSunila Sahu 				xfrm->exponent.length, exp);
910*3e9d6bd4SSunila Sahu 		asym_session->u.e.ctx = ctx;
911*3e9d6bd4SSunila Sahu 		asym_session->u.e.mod = mod;
912*3e9d6bd4SSunila Sahu 		asym_session->u.e.exp = exp;
913*3e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
914*3e9d6bd4SSunila Sahu 		break;
915*3e9d6bd4SSunila Sahu 	}
916*3e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
917*3e9d6bd4SSunila Sahu 	{
918*3e9d6bd4SSunila Sahu 		struct rte_crypto_modinv_xform *xfrm = &(xform->modinv);
919*3e9d6bd4SSunila Sahu 
920*3e9d6bd4SSunila Sahu 		BN_CTX *ctx = BN_CTX_new();
921*3e9d6bd4SSunila Sahu 		if (ctx == NULL) {
922*3e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR,
923*3e9d6bd4SSunila Sahu 				" failed to allocate resources\n");
924*3e9d6bd4SSunila Sahu 			return -1;
925*3e9d6bd4SSunila Sahu 		}
926*3e9d6bd4SSunila Sahu 		BN_CTX_start(ctx);
927*3e9d6bd4SSunila Sahu 		BIGNUM *mod = BN_CTX_get(ctx);
928*3e9d6bd4SSunila Sahu 		if (mod == NULL) {
929*3e9d6bd4SSunila Sahu 			BN_CTX_end(ctx);
930*3e9d6bd4SSunila Sahu 			BN_CTX_free(ctx);
931*3e9d6bd4SSunila Sahu 			return -1;
932*3e9d6bd4SSunila Sahu 		}
933*3e9d6bd4SSunila Sahu 
934*3e9d6bd4SSunila Sahu 		mod = BN_bin2bn((const unsigned char *)
935*3e9d6bd4SSunila Sahu 				xfrm->modulus.data,
936*3e9d6bd4SSunila Sahu 				xfrm->modulus.length,
937*3e9d6bd4SSunila Sahu 				mod);
938*3e9d6bd4SSunila Sahu 		asym_session->u.m.ctx = ctx;
939*3e9d6bd4SSunila Sahu 		asym_session->u.m.modulus = mod;
940*3e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODINV;
941*3e9d6bd4SSunila Sahu 		break;
942*3e9d6bd4SSunila Sahu 	}
943*3e9d6bd4SSunila Sahu 	default:
944*3e9d6bd4SSunila Sahu 		return -1;
945*3e9d6bd4SSunila Sahu 	}
946*3e9d6bd4SSunila Sahu 
947*3e9d6bd4SSunila Sahu 	return 0;
948*3e9d6bd4SSunila Sahu }
949*3e9d6bd4SSunila Sahu 
950*3e9d6bd4SSunila Sahu /** Configure the session from a crypto xform chain */
951*3e9d6bd4SSunila Sahu static int
952*3e9d6bd4SSunila Sahu openssl_pmd_asym_session_configure(struct rte_cryptodev *dev __rte_unused,
953*3e9d6bd4SSunila Sahu 		struct rte_crypto_asym_xform *xform,
954*3e9d6bd4SSunila Sahu 		struct rte_cryptodev_asym_session *sess,
955*3e9d6bd4SSunila Sahu 		struct rte_mempool *mempool)
956*3e9d6bd4SSunila Sahu {
957*3e9d6bd4SSunila Sahu 	void *asym_sess_private_data;
958*3e9d6bd4SSunila Sahu 	int ret;
959*3e9d6bd4SSunila Sahu 
960*3e9d6bd4SSunila Sahu 	if (unlikely(sess == NULL)) {
961*3e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "invalid asymmetric session struct");
962*3e9d6bd4SSunila Sahu 		return -EINVAL;
963*3e9d6bd4SSunila Sahu 	}
964*3e9d6bd4SSunila Sahu 
965*3e9d6bd4SSunila Sahu 	if (rte_mempool_get(mempool, &asym_sess_private_data)) {
966*3e9d6bd4SSunila Sahu 		CDEV_LOG_ERR(
967*3e9d6bd4SSunila Sahu 			"Couldn't get object from session mempool");
968*3e9d6bd4SSunila Sahu 		return -ENOMEM;
969*3e9d6bd4SSunila Sahu 	}
970*3e9d6bd4SSunila Sahu 
971*3e9d6bd4SSunila Sahu 	ret = openssl_set_asym_session_parameters(asym_sess_private_data,
972*3e9d6bd4SSunila Sahu 			xform);
973*3e9d6bd4SSunila Sahu 	if (ret != 0) {
974*3e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "failed configure session parameters");
975*3e9d6bd4SSunila Sahu 
976*3e9d6bd4SSunila Sahu 		/* Return session to mempool */
977*3e9d6bd4SSunila Sahu 		rte_mempool_put(mempool, asym_sess_private_data);
978*3e9d6bd4SSunila Sahu 		return ret;
979*3e9d6bd4SSunila Sahu 	}
980*3e9d6bd4SSunila Sahu 
981*3e9d6bd4SSunila Sahu 	set_asym_session_private_data(sess, dev->driver_id,
982*3e9d6bd4SSunila Sahu 			asym_sess_private_data);
983*3e9d6bd4SSunila Sahu 
984*3e9d6bd4SSunila Sahu 	return 0;
985*3e9d6bd4SSunila Sahu }
9868a9867a6SSlawomir Mrozowicz 
9878a9867a6SSlawomir Mrozowicz /** Clear the memory of session so it doesn't leave key material behind */
9888a9867a6SSlawomir Mrozowicz static void
989012c5076SPablo de Lara openssl_pmd_sym_session_clear(struct rte_cryptodev *dev,
990b3bbd9e5SSlawomir Mrozowicz 		struct rte_cryptodev_sym_session *sess)
9918a9867a6SSlawomir Mrozowicz {
992b3bbd9e5SSlawomir Mrozowicz 	uint8_t index = dev->driver_id;
993012c5076SPablo de Lara 	void *sess_priv = get_sym_session_private_data(sess, index);
994b3bbd9e5SSlawomir Mrozowicz 
995b3bbd9e5SSlawomir Mrozowicz 	/* Zero out the whole structure */
996b3bbd9e5SSlawomir Mrozowicz 	if (sess_priv) {
997b3bbd9e5SSlawomir Mrozowicz 		openssl_reset_session(sess_priv);
998b3bbd9e5SSlawomir Mrozowicz 		memset(sess_priv, 0, sizeof(struct openssl_session));
999b3bbd9e5SSlawomir Mrozowicz 		struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
1000012c5076SPablo de Lara 		set_sym_session_private_data(sess, index, NULL);
1001b3bbd9e5SSlawomir Mrozowicz 		rte_mempool_put(sess_mp, sess_priv);
10028a9867a6SSlawomir Mrozowicz 	}
10038a9867a6SSlawomir Mrozowicz }
10048a9867a6SSlawomir Mrozowicz 
1005*3e9d6bd4SSunila Sahu static void openssl_reset_asym_session(struct openssl_asym_session *sess)
1006*3e9d6bd4SSunila Sahu {
1007*3e9d6bd4SSunila Sahu 	switch (sess->xfrm_type) {
1008*3e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_RSA:
1009*3e9d6bd4SSunila Sahu 		if (sess->u.r.rsa)
1010*3e9d6bd4SSunila Sahu 			RSA_free(sess->u.r.rsa);
1011*3e9d6bd4SSunila Sahu 		break;
1012*3e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
1013*3e9d6bd4SSunila Sahu 		if (sess->u.e.ctx) {
1014*3e9d6bd4SSunila Sahu 			BN_CTX_end(sess->u.e.ctx);
1015*3e9d6bd4SSunila Sahu 			BN_CTX_free(sess->u.e.ctx);
1016*3e9d6bd4SSunila Sahu 		}
1017*3e9d6bd4SSunila Sahu 		break;
1018*3e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
1019*3e9d6bd4SSunila Sahu 		if (sess->u.m.ctx) {
1020*3e9d6bd4SSunila Sahu 			BN_CTX_end(sess->u.m.ctx);
1021*3e9d6bd4SSunila Sahu 			BN_CTX_free(sess->u.m.ctx);
1022*3e9d6bd4SSunila Sahu 		}
1023*3e9d6bd4SSunila Sahu 		break;
1024*3e9d6bd4SSunila Sahu 	default:
1025*3e9d6bd4SSunila Sahu 		break;
1026*3e9d6bd4SSunila Sahu 	}
1027*3e9d6bd4SSunila Sahu }
1028*3e9d6bd4SSunila Sahu 
1029*3e9d6bd4SSunila Sahu /** Clear the memory of asymmetric session
1030*3e9d6bd4SSunila Sahu  * so it doesn't leave key material behind
1031*3e9d6bd4SSunila Sahu  */
1032*3e9d6bd4SSunila Sahu static void
1033*3e9d6bd4SSunila Sahu openssl_pmd_asym_session_clear(struct rte_cryptodev *dev,
1034*3e9d6bd4SSunila Sahu 		struct rte_cryptodev_asym_session *sess)
1035*3e9d6bd4SSunila Sahu {
1036*3e9d6bd4SSunila Sahu 	uint8_t index = dev->driver_id;
1037*3e9d6bd4SSunila Sahu 	void *sess_priv = get_asym_session_private_data(sess, index);
1038*3e9d6bd4SSunila Sahu 
1039*3e9d6bd4SSunila Sahu 	/* Zero out the whole structure */
1040*3e9d6bd4SSunila Sahu 	if (sess_priv) {
1041*3e9d6bd4SSunila Sahu 		openssl_reset_asym_session(sess_priv);
1042*3e9d6bd4SSunila Sahu 		memset(sess_priv, 0, sizeof(struct openssl_asym_session));
1043*3e9d6bd4SSunila Sahu 		struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
1044*3e9d6bd4SSunila Sahu 		set_asym_session_private_data(sess, index, NULL);
1045*3e9d6bd4SSunila Sahu 		rte_mempool_put(sess_mp, sess_priv);
1046*3e9d6bd4SSunila Sahu 	}
1047*3e9d6bd4SSunila Sahu }
1048*3e9d6bd4SSunila Sahu 
10498a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops openssl_pmd_ops = {
10508a9867a6SSlawomir Mrozowicz 		.dev_configure		= openssl_pmd_config,
10518a9867a6SSlawomir Mrozowicz 		.dev_start		= openssl_pmd_start,
10528a9867a6SSlawomir Mrozowicz 		.dev_stop		= openssl_pmd_stop,
10538a9867a6SSlawomir Mrozowicz 		.dev_close		= openssl_pmd_close,
10548a9867a6SSlawomir Mrozowicz 
10558a9867a6SSlawomir Mrozowicz 		.stats_get		= openssl_pmd_stats_get,
10568a9867a6SSlawomir Mrozowicz 		.stats_reset		= openssl_pmd_stats_reset,
10578a9867a6SSlawomir Mrozowicz 
10588a9867a6SSlawomir Mrozowicz 		.dev_infos_get		= openssl_pmd_info_get,
10598a9867a6SSlawomir Mrozowicz 
10608a9867a6SSlawomir Mrozowicz 		.queue_pair_setup	= openssl_pmd_qp_setup,
10618a9867a6SSlawomir Mrozowicz 		.queue_pair_release	= openssl_pmd_qp_release,
10628a9867a6SSlawomir Mrozowicz 		.queue_pair_count	= openssl_pmd_qp_count,
10638a9867a6SSlawomir Mrozowicz 
1064012c5076SPablo de Lara 		.sym_session_get_size	= openssl_pmd_sym_session_get_size,
1065*3e9d6bd4SSunila Sahu 		.asym_session_get_size	= openssl_pmd_asym_session_get_size,
1066012c5076SPablo de Lara 		.sym_session_configure	= openssl_pmd_sym_session_configure,
1067*3e9d6bd4SSunila Sahu 		.asym_session_configure	= openssl_pmd_asym_session_configure,
1068*3e9d6bd4SSunila Sahu 		.sym_session_clear	= openssl_pmd_sym_session_clear,
1069*3e9d6bd4SSunila Sahu 		.asym_session_clear	= openssl_pmd_asym_session_clear
10708a9867a6SSlawomir Mrozowicz };
10718a9867a6SSlawomir Mrozowicz 
10728a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops *rte_openssl_pmd_ops = &openssl_pmd_ops;
1073