xref: /dpdk/drivers/crypto/openssl/rte_openssl_pmd_ops.c (revision 5fa1fb299f76b11d643c23f7eff38a514e72c057)
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"
158a9867a6SSlawomir Mrozowicz 
168a9867a6SSlawomir Mrozowicz 
178a9867a6SSlawomir Mrozowicz static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
188a9867a6SSlawomir Mrozowicz 	{	/* MD5 HMAC */
198a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
208a9867a6SSlawomir Mrozowicz 		{.sym = {
218a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
228a9867a6SSlawomir Mrozowicz 			{.auth = {
238a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5_HMAC,
248a9867a6SSlawomir Mrozowicz 				.block_size = 64,
258a9867a6SSlawomir Mrozowicz 				.key_size = {
26e5e7bc71SPablo de Lara 					.min = 1,
278a9867a6SSlawomir Mrozowicz 					.max = 64,
28e5e7bc71SPablo de Lara 					.increment = 1
298a9867a6SSlawomir Mrozowicz 				},
308a9867a6SSlawomir Mrozowicz 				.digest_size = {
31c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
328a9867a6SSlawomir Mrozowicz 					.max = 16,
33c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
348a9867a6SSlawomir Mrozowicz 				},
35acf86169SPablo de Lara 				.iv_size = { 0 }
368a9867a6SSlawomir Mrozowicz 			}, }
378a9867a6SSlawomir Mrozowicz 		}, }
388a9867a6SSlawomir Mrozowicz 	},
398a9867a6SSlawomir Mrozowicz 	{	/* MD5 */
408a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
418a9867a6SSlawomir Mrozowicz 		{.sym = {
428a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
438a9867a6SSlawomir Mrozowicz 			{.auth = {
448a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5,
458a9867a6SSlawomir Mrozowicz 				.block_size = 64,
468a9867a6SSlawomir Mrozowicz 				.key_size = {
478a9867a6SSlawomir Mrozowicz 					.min = 0,
488a9867a6SSlawomir Mrozowicz 					.max = 0,
498a9867a6SSlawomir Mrozowicz 					.increment = 0
508a9867a6SSlawomir Mrozowicz 				},
518a9867a6SSlawomir Mrozowicz 				.digest_size = {
528a9867a6SSlawomir Mrozowicz 					.min = 16,
538a9867a6SSlawomir Mrozowicz 					.max = 16,
548a9867a6SSlawomir Mrozowicz 					.increment = 0
558a9867a6SSlawomir Mrozowicz 				},
56acf86169SPablo de Lara 				.iv_size = { 0 }
578a9867a6SSlawomir Mrozowicz 			}, }
588a9867a6SSlawomir Mrozowicz 		}, }
598a9867a6SSlawomir Mrozowicz 	},
608a9867a6SSlawomir Mrozowicz 	{	/* SHA1 HMAC */
618a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
628a9867a6SSlawomir Mrozowicz 		{.sym = {
638a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
648a9867a6SSlawomir Mrozowicz 			{.auth = {
658a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
668a9867a6SSlawomir Mrozowicz 				.block_size = 64,
678a9867a6SSlawomir Mrozowicz 				.key_size = {
68e5e7bc71SPablo de Lara 					.min = 1,
698a9867a6SSlawomir Mrozowicz 					.max = 64,
70e5e7bc71SPablo de Lara 					.increment = 1
718a9867a6SSlawomir Mrozowicz 				},
728a9867a6SSlawomir Mrozowicz 				.digest_size = {
73c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
748a9867a6SSlawomir Mrozowicz 					.max = 20,
75c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
768a9867a6SSlawomir Mrozowicz 				},
77acf86169SPablo de Lara 				.iv_size = { 0 }
788a9867a6SSlawomir Mrozowicz 			}, }
798a9867a6SSlawomir Mrozowicz 		}, }
808a9867a6SSlawomir Mrozowicz 	},
818a9867a6SSlawomir Mrozowicz 	{	/* SHA1 */
828a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
838a9867a6SSlawomir Mrozowicz 		{.sym = {
848a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
858a9867a6SSlawomir Mrozowicz 			{.auth = {
868a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1,
878a9867a6SSlawomir Mrozowicz 				.block_size = 64,
888a9867a6SSlawomir Mrozowicz 				.key_size = {
898a9867a6SSlawomir Mrozowicz 					.min = 0,
908a9867a6SSlawomir Mrozowicz 					.max = 0,
918a9867a6SSlawomir Mrozowicz 					.increment = 0
928a9867a6SSlawomir Mrozowicz 				},
938a9867a6SSlawomir Mrozowicz 				.digest_size = {
948a9867a6SSlawomir Mrozowicz 					.min = 20,
958a9867a6SSlawomir Mrozowicz 					.max = 20,
968a9867a6SSlawomir Mrozowicz 					.increment = 0
978a9867a6SSlawomir Mrozowicz 				},
98acf86169SPablo de Lara 				.iv_size = { 0 }
998a9867a6SSlawomir Mrozowicz 			}, }
1008a9867a6SSlawomir Mrozowicz 		}, }
1018a9867a6SSlawomir Mrozowicz 	},
1028a9867a6SSlawomir Mrozowicz 	{	/* SHA224 HMAC */
1038a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1048a9867a6SSlawomir Mrozowicz 		{.sym = {
1058a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1068a9867a6SSlawomir Mrozowicz 			{.auth = {
1078a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
1088a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1098a9867a6SSlawomir Mrozowicz 				.key_size = {
110e5e7bc71SPablo de Lara 					.min = 1,
1118a9867a6SSlawomir Mrozowicz 					.max = 64,
112e5e7bc71SPablo de Lara 					.increment = 1
1138a9867a6SSlawomir Mrozowicz 				},
1148a9867a6SSlawomir Mrozowicz 				.digest_size = {
115c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
1168a9867a6SSlawomir Mrozowicz 					.max = 28,
117c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
1188a9867a6SSlawomir Mrozowicz 				},
119acf86169SPablo de Lara 				.iv_size = { 0 }
1208a9867a6SSlawomir Mrozowicz 			}, }
1218a9867a6SSlawomir Mrozowicz 		}, }
1228a9867a6SSlawomir Mrozowicz 	},
1238a9867a6SSlawomir Mrozowicz 	{	/* SHA224 */
1248a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1258a9867a6SSlawomir Mrozowicz 		{.sym = {
1268a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1278a9867a6SSlawomir Mrozowicz 			{.auth = {
1288a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224,
1298a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1308a9867a6SSlawomir Mrozowicz 				.key_size = {
1318a9867a6SSlawomir Mrozowicz 					.min = 0,
1328a9867a6SSlawomir Mrozowicz 					.max = 0,
1338a9867a6SSlawomir Mrozowicz 					.increment = 0
1348a9867a6SSlawomir Mrozowicz 				},
1358a9867a6SSlawomir Mrozowicz 				.digest_size = {
136c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
1378a9867a6SSlawomir Mrozowicz 					.max = 28,
138c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
1398a9867a6SSlawomir Mrozowicz 				},
140acf86169SPablo de Lara 				.iv_size = { 0 }
1418a9867a6SSlawomir Mrozowicz 			}, }
1428a9867a6SSlawomir Mrozowicz 		}, }
1438a9867a6SSlawomir Mrozowicz 	},
1448a9867a6SSlawomir Mrozowicz 	{	/* SHA256 HMAC */
1458a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1468a9867a6SSlawomir Mrozowicz 		{.sym = {
1478a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1488a9867a6SSlawomir Mrozowicz 			{.auth = {
1498a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
1508a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1518a9867a6SSlawomir Mrozowicz 				.key_size = {
152e5e7bc71SPablo de Lara 					.min = 1,
1538a9867a6SSlawomir Mrozowicz 					.max = 64,
154e5e7bc71SPablo de Lara 					.increment = 1
1558a9867a6SSlawomir Mrozowicz 				},
1568a9867a6SSlawomir Mrozowicz 				.digest_size = {
157c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
1588a9867a6SSlawomir Mrozowicz 					.max = 32,
159c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
1608a9867a6SSlawomir Mrozowicz 				},
161acf86169SPablo de Lara 				.iv_size = { 0 }
1628a9867a6SSlawomir Mrozowicz 			}, }
1638a9867a6SSlawomir Mrozowicz 		}, }
1648a9867a6SSlawomir Mrozowicz 	},
1658a9867a6SSlawomir Mrozowicz 	{	/* SHA256 */
1668a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1678a9867a6SSlawomir Mrozowicz 		{.sym = {
1688a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1698a9867a6SSlawomir Mrozowicz 			{.auth = {
1708a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256,
1718a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1728a9867a6SSlawomir Mrozowicz 				.key_size = {
1738a9867a6SSlawomir Mrozowicz 					.min = 0,
1748a9867a6SSlawomir Mrozowicz 					.max = 0,
1758a9867a6SSlawomir Mrozowicz 					.increment = 0
1768a9867a6SSlawomir Mrozowicz 				},
1778a9867a6SSlawomir Mrozowicz 				.digest_size = {
1788a9867a6SSlawomir Mrozowicz 					.min = 32,
1798a9867a6SSlawomir Mrozowicz 					.max = 32,
1808a9867a6SSlawomir Mrozowicz 					.increment = 0
1818a9867a6SSlawomir Mrozowicz 				},
182acf86169SPablo de Lara 				.iv_size = { 0 }
1838a9867a6SSlawomir Mrozowicz 			}, }
1848a9867a6SSlawomir Mrozowicz 		}, }
1858a9867a6SSlawomir Mrozowicz 	},
1868a9867a6SSlawomir Mrozowicz 	{	/* SHA384 HMAC */
1878a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1888a9867a6SSlawomir Mrozowicz 		{.sym = {
1898a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1908a9867a6SSlawomir Mrozowicz 			{.auth = {
1918a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
1928a9867a6SSlawomir Mrozowicz 				.block_size = 128,
1938a9867a6SSlawomir Mrozowicz 				.key_size = {
194e5e7bc71SPablo de Lara 					.min = 1,
1958a9867a6SSlawomir Mrozowicz 					.max = 128,
196e5e7bc71SPablo de Lara 					.increment = 1
1978a9867a6SSlawomir Mrozowicz 				},
1988a9867a6SSlawomir Mrozowicz 				.digest_size = {
199c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
2008a9867a6SSlawomir Mrozowicz 					.max = 48,
201c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
2028a9867a6SSlawomir Mrozowicz 				},
203acf86169SPablo de Lara 				.iv_size = { 0 }
2048a9867a6SSlawomir Mrozowicz 			}, }
2058a9867a6SSlawomir Mrozowicz 		}, }
2068a9867a6SSlawomir Mrozowicz 	},
2078a9867a6SSlawomir Mrozowicz 	{	/* SHA384 */
2088a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2098a9867a6SSlawomir Mrozowicz 		{.sym = {
2108a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2118a9867a6SSlawomir Mrozowicz 			{.auth = {
2128a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384,
2138a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2148a9867a6SSlawomir Mrozowicz 				.key_size = {
2158a9867a6SSlawomir Mrozowicz 					.min = 0,
2168a9867a6SSlawomir Mrozowicz 					.max = 0,
2178a9867a6SSlawomir Mrozowicz 					.increment = 0
2188a9867a6SSlawomir Mrozowicz 				},
2198a9867a6SSlawomir Mrozowicz 				.digest_size = {
2208a9867a6SSlawomir Mrozowicz 					.min = 48,
2218a9867a6SSlawomir Mrozowicz 					.max = 48,
2228a9867a6SSlawomir Mrozowicz 					.increment = 0
2238a9867a6SSlawomir Mrozowicz 				},
224acf86169SPablo de Lara 				.iv_size = { 0 }
2258a9867a6SSlawomir Mrozowicz 			}, }
2268a9867a6SSlawomir Mrozowicz 		}, }
2278a9867a6SSlawomir Mrozowicz 	},
2288a9867a6SSlawomir Mrozowicz 	{	/* SHA512 HMAC */
2298a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2308a9867a6SSlawomir Mrozowicz 		{.sym = {
2318a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2328a9867a6SSlawomir Mrozowicz 			{.auth = {
2338a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
2348a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2358a9867a6SSlawomir Mrozowicz 				.key_size = {
236e5e7bc71SPablo de Lara 					.min = 1,
2378a9867a6SSlawomir Mrozowicz 					.max = 128,
238e5e7bc71SPablo de Lara 					.increment = 1
2398a9867a6SSlawomir Mrozowicz 				},
2408a9867a6SSlawomir Mrozowicz 				.digest_size = {
241c3d22a65SDmitry Eremin-Solenikov 					.min = 1,
2428a9867a6SSlawomir Mrozowicz 					.max = 64,
243c3d22a65SDmitry Eremin-Solenikov 					.increment = 1
2448a9867a6SSlawomir Mrozowicz 				},
245acf86169SPablo de Lara 				.iv_size = { 0 }
2468a9867a6SSlawomir Mrozowicz 			}, }
2478a9867a6SSlawomir Mrozowicz 		}, }
2488a9867a6SSlawomir Mrozowicz 	},
2498a9867a6SSlawomir Mrozowicz 	{	/* SHA512  */
2508a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2518a9867a6SSlawomir Mrozowicz 		{.sym = {
2528a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2538a9867a6SSlawomir Mrozowicz 			{.auth = {
2548a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512,
2558a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2568a9867a6SSlawomir Mrozowicz 				.key_size = {
2578a9867a6SSlawomir Mrozowicz 					.min = 0,
2588a9867a6SSlawomir Mrozowicz 					.max = 0,
2598a9867a6SSlawomir Mrozowicz 					.increment = 0
2608a9867a6SSlawomir Mrozowicz 				},
2618a9867a6SSlawomir Mrozowicz 				.digest_size = {
2628a9867a6SSlawomir Mrozowicz 					.min = 64,
2638a9867a6SSlawomir Mrozowicz 					.max = 64,
2648a9867a6SSlawomir Mrozowicz 					.increment = 0
2658a9867a6SSlawomir Mrozowicz 				},
266acf86169SPablo de Lara 				.iv_size = { 0 }
2678a9867a6SSlawomir Mrozowicz 			}, }
2688a9867a6SSlawomir Mrozowicz 		}, }
2698a9867a6SSlawomir Mrozowicz 	},
2708a9867a6SSlawomir Mrozowicz 	{	/* AES CBC */
2718a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2728a9867a6SSlawomir Mrozowicz 		{.sym = {
2738a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
2748a9867a6SSlawomir Mrozowicz 			{.cipher = {
2758a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CBC,
2768a9867a6SSlawomir Mrozowicz 				.block_size = 16,
2778a9867a6SSlawomir Mrozowicz 				.key_size = {
2788a9867a6SSlawomir Mrozowicz 					.min = 16,
2798a9867a6SSlawomir Mrozowicz 					.max = 32,
2808a9867a6SSlawomir Mrozowicz 					.increment = 8
2818a9867a6SSlawomir Mrozowicz 				},
2828a9867a6SSlawomir Mrozowicz 				.iv_size = {
2838a9867a6SSlawomir Mrozowicz 					.min = 16,
2848a9867a6SSlawomir Mrozowicz 					.max = 16,
2858a9867a6SSlawomir Mrozowicz 					.increment = 0
2868a9867a6SSlawomir Mrozowicz 				}
2878a9867a6SSlawomir Mrozowicz 			}, }
2888a9867a6SSlawomir Mrozowicz 		}, }
2898a9867a6SSlawomir Mrozowicz 	},
2908a9867a6SSlawomir Mrozowicz 	{	/* AES CTR */
2918a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2928a9867a6SSlawomir Mrozowicz 		{.sym = {
2938a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
2948a9867a6SSlawomir Mrozowicz 			{.cipher = {
2958a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
2968a9867a6SSlawomir Mrozowicz 				.block_size = 16,
2978a9867a6SSlawomir Mrozowicz 				.key_size = {
2988a9867a6SSlawomir Mrozowicz 					.min = 16,
2998a9867a6SSlawomir Mrozowicz 					.max = 32,
3008a9867a6SSlawomir Mrozowicz 					.increment = 8
3018a9867a6SSlawomir Mrozowicz 				},
3028a9867a6SSlawomir Mrozowicz 				.iv_size = {
3038a9867a6SSlawomir Mrozowicz 					.min = 16,
3048a9867a6SSlawomir Mrozowicz 					.max = 16,
3058a9867a6SSlawomir Mrozowicz 					.increment = 0
3068a9867a6SSlawomir Mrozowicz 				}
3078a9867a6SSlawomir Mrozowicz 			}, }
3088a9867a6SSlawomir Mrozowicz 		}, }
3098a9867a6SSlawomir Mrozowicz 	},
310b79e4c00SPablo de Lara 	{	/* AES GCM */
3118a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3128a9867a6SSlawomir Mrozowicz 		{.sym = {
313b79e4c00SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
314b79e4c00SPablo de Lara 			{.aead = {
315b79e4c00SPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
3168a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3178a9867a6SSlawomir Mrozowicz 				.key_size = {
3188a9867a6SSlawomir Mrozowicz 					.min = 16,
3198a9867a6SSlawomir Mrozowicz 					.max = 32,
3208a9867a6SSlawomir Mrozowicz 					.increment = 8
3218a9867a6SSlawomir Mrozowicz 				},
3228a9867a6SSlawomir Mrozowicz 				.digest_size = {
3238a9867a6SSlawomir Mrozowicz 					.min = 16,
3248a9867a6SSlawomir Mrozowicz 					.max = 16,
3258a9867a6SSlawomir Mrozowicz 					.increment = 0
3268a9867a6SSlawomir Mrozowicz 				},
3278a9867a6SSlawomir Mrozowicz 				.aad_size = {
3280625598aSArek Kusztal 					.min = 0,
3290625598aSArek Kusztal 					.max = 65535,
3300625598aSArek Kusztal 					.increment = 1
331acf86169SPablo de Lara 				},
3328a9867a6SSlawomir Mrozowicz 				.iv_size = {
3338a9867a6SSlawomir Mrozowicz 					.min = 12,
3348a9867a6SSlawomir Mrozowicz 					.max = 16,
3358a9867a6SSlawomir Mrozowicz 					.increment = 4
336b79e4c00SPablo de Lara 				},
3378a9867a6SSlawomir Mrozowicz 			}, }
3388a9867a6SSlawomir Mrozowicz 		}, }
3398a9867a6SSlawomir Mrozowicz 	},
3401a4998dcSPablo de Lara 	{	/* AES CCM */
3411a4998dcSPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3421a4998dcSPablo de Lara 		{.sym = {
3431a4998dcSPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
3441a4998dcSPablo de Lara 			{.aead = {
3451a4998dcSPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_CCM,
3461a4998dcSPablo de Lara 				.block_size = 16,
3471a4998dcSPablo de Lara 				.key_size = {
3481a4998dcSPablo de Lara 					.min = 16,
3491a4998dcSPablo de Lara 					.max = 32,
3501a4998dcSPablo de Lara 					.increment = 8
3511a4998dcSPablo de Lara 				},
3521a4998dcSPablo de Lara 				.digest_size = {
3531a4998dcSPablo de Lara 					.min = 4,
3541a4998dcSPablo de Lara 					.max = 16,
3551a4998dcSPablo de Lara 					.increment = 2
3561a4998dcSPablo de Lara 				},
3571a4998dcSPablo de Lara 				.aad_size = {
3581a4998dcSPablo de Lara 					.min = 0,
3591a4998dcSPablo de Lara 					.max = 65535,
3601a4998dcSPablo de Lara 					.increment = 1
3611a4998dcSPablo de Lara 				},
3621a4998dcSPablo de Lara 				.iv_size = {
3631a4998dcSPablo de Lara 					.min = 7,
3641a4998dcSPablo de Lara 					.max = 13,
3651a4998dcSPablo de Lara 					.increment = 1
3661a4998dcSPablo de Lara 				},
3671a4998dcSPablo de Lara 			}, }
3681a4998dcSPablo de Lara 		}, }
3691a4998dcSPablo de Lara 	},
3708a9867a6SSlawomir Mrozowicz 	{	/* AES GMAC (AUTH) */
3718a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3728a9867a6SSlawomir Mrozowicz 		{.sym = {
3738a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
3748a9867a6SSlawomir Mrozowicz 			{.auth = {
3758a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_AES_GMAC,
3768a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3778a9867a6SSlawomir Mrozowicz 				.key_size = {
3788a9867a6SSlawomir Mrozowicz 					.min = 16,
3798a9867a6SSlawomir Mrozowicz 					.max = 32,
3808a9867a6SSlawomir Mrozowicz 					.increment = 8
3818a9867a6SSlawomir Mrozowicz 				},
3828a9867a6SSlawomir Mrozowicz 				.digest_size = {
3838a9867a6SSlawomir Mrozowicz 					.min = 16,
3848a9867a6SSlawomir Mrozowicz 					.max = 16,
3858a9867a6SSlawomir Mrozowicz 					.increment = 0
3868a9867a6SSlawomir Mrozowicz 				},
387e32e4fa8SPablo de Lara 				.iv_size = {
388e32e4fa8SPablo de Lara 					.min = 12,
389e32e4fa8SPablo de Lara 					.max = 16,
3908a9867a6SSlawomir Mrozowicz 					.increment = 4
391e32e4fa8SPablo de Lara 				}
3928a9867a6SSlawomir Mrozowicz 			}, }
3938a9867a6SSlawomir Mrozowicz 		}, }
3948a9867a6SSlawomir Mrozowicz 	},
3958a9867a6SSlawomir Mrozowicz 	{	/* 3DES CBC */
3968a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3978a9867a6SSlawomir Mrozowicz 		{.sym = {
3988a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
3998a9867a6SSlawomir Mrozowicz 			{.cipher = {
4008a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
4018a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4028a9867a6SSlawomir Mrozowicz 				.key_size = {
4039607e37eSMarko Kovacevic 					.min = 8,
4048a9867a6SSlawomir Mrozowicz 					.max = 24,
4058a9867a6SSlawomir Mrozowicz 					.increment = 8
4068a9867a6SSlawomir Mrozowicz 				},
4078a9867a6SSlawomir Mrozowicz 				.iv_size = {
4088a9867a6SSlawomir Mrozowicz 					.min = 8,
4098a9867a6SSlawomir Mrozowicz 					.max = 8,
4108a9867a6SSlawomir Mrozowicz 					.increment = 0
4118a9867a6SSlawomir Mrozowicz 				}
4128a9867a6SSlawomir Mrozowicz 			}, }
4138a9867a6SSlawomir Mrozowicz 		}, }
4148a9867a6SSlawomir Mrozowicz 	},
4158a9867a6SSlawomir Mrozowicz 	{	/* 3DES CTR */
4168a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4178a9867a6SSlawomir Mrozowicz 		{.sym = {
4188a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4198a9867a6SSlawomir Mrozowicz 			{.cipher = {
4208a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CTR,
4218a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4228a9867a6SSlawomir Mrozowicz 				.key_size = {
4238a9867a6SSlawomir Mrozowicz 					.min = 16,
4248a9867a6SSlawomir Mrozowicz 					.max = 24,
4258a9867a6SSlawomir Mrozowicz 					.increment = 8
4268a9867a6SSlawomir Mrozowicz 				},
4278a9867a6SSlawomir Mrozowicz 				.iv_size = {
4288a9867a6SSlawomir Mrozowicz 					.min = 8,
4298a9867a6SSlawomir Mrozowicz 					.max = 8,
4308a9867a6SSlawomir Mrozowicz 					.increment = 0
4318a9867a6SSlawomir Mrozowicz 				}
4328a9867a6SSlawomir Mrozowicz 			}, }
4338a9867a6SSlawomir Mrozowicz 		}, }
4348a9867a6SSlawomir Mrozowicz 	},
435c1734807SPablo de Lara 	{	/* DES CBC */
436c1734807SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
437c1734807SPablo de Lara 		{.sym = {
438c1734807SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
439c1734807SPablo de Lara 			{.cipher = {
440c1734807SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_CBC,
441c1734807SPablo de Lara 				.block_size = 8,
442c1734807SPablo de Lara 				.key_size = {
443c1734807SPablo de Lara 					.min = 8,
444c1734807SPablo de Lara 					.max = 8,
445c1734807SPablo de Lara 					.increment = 0
446c1734807SPablo de Lara 				},
447c1734807SPablo de Lara 				.iv_size = {
448c1734807SPablo de Lara 					.min = 8,
449c1734807SPablo de Lara 					.max = 8,
450c1734807SPablo de Lara 					.increment = 0
451c1734807SPablo de Lara 				}
452c1734807SPablo de Lara 			}, }
453c1734807SPablo de Lara 		}, }
454c1734807SPablo de Lara 	},
4551dee7bc7SPablo de Lara 	{	/* DES DOCSIS BPI */
4561dee7bc7SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4571dee7bc7SPablo de Lara 		{.sym = {
4581dee7bc7SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4591dee7bc7SPablo de Lara 			{.cipher = {
4601dee7bc7SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_DOCSISBPI,
4611dee7bc7SPablo de Lara 				.block_size = 8,
4621dee7bc7SPablo de Lara 				.key_size = {
4631dee7bc7SPablo de Lara 					.min = 8,
4641dee7bc7SPablo de Lara 					.max = 8,
4651dee7bc7SPablo de Lara 					.increment = 0
4661dee7bc7SPablo de Lara 				},
4671dee7bc7SPablo de Lara 				.iv_size = {
4681dee7bc7SPablo de Lara 					.min = 8,
4691dee7bc7SPablo de Lara 					.max = 8,
4701dee7bc7SPablo de Lara 					.increment = 0
4711dee7bc7SPablo de Lara 				}
4721dee7bc7SPablo de Lara 			}, }
4731dee7bc7SPablo de Lara 		}, }
4741dee7bc7SPablo de Lara 	},
4753e9d6bd4SSunila Sahu 	{	/* RSA */
4763e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
4773e9d6bd4SSunila Sahu 		{.asym = {
4783e9d6bd4SSunila Sahu 			.xform_capa = {
4793e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_RSA,
4803e9d6bd4SSunila Sahu 				.op_types = ((1 << RTE_CRYPTO_ASYM_OP_SIGN) |
4813e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_VERIFY) |
4823e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
4833e9d6bd4SSunila Sahu 					(1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),
4843e9d6bd4SSunila Sahu 				{
4853e9d6bd4SSunila Sahu 				.modlen = {
4863e9d6bd4SSunila Sahu 				/* min length is based on openssl rsa keygen */
4873e9d6bd4SSunila Sahu 				.min = 30,
4883e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
4893e9d6bd4SSunila Sahu 				.max = 0,
4903e9d6bd4SSunila Sahu 				.increment = 1
4913e9d6bd4SSunila Sahu 				}, }
4923e9d6bd4SSunila Sahu 			}
4933e9d6bd4SSunila Sahu 		},
4943e9d6bd4SSunila Sahu 		}
4953e9d6bd4SSunila Sahu 	},
4963e9d6bd4SSunila Sahu 	{	/* modexp */
4973e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
4983e9d6bd4SSunila Sahu 		{.asym = {
4993e9d6bd4SSunila Sahu 			.xform_capa = {
5003e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
5013e9d6bd4SSunila Sahu 				.op_types = 0,
5023e9d6bd4SSunila Sahu 				{
5033e9d6bd4SSunila Sahu 				.modlen = {
5043e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on min length */
5053e9d6bd4SSunila Sahu 				.min = 0,
5063e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
5073e9d6bd4SSunila Sahu 				.max = 0,
5083e9d6bd4SSunila Sahu 				.increment = 1
5093e9d6bd4SSunila Sahu 				}, }
5103e9d6bd4SSunila Sahu 			}
5113e9d6bd4SSunila Sahu 		},
5123e9d6bd4SSunila Sahu 		}
5133e9d6bd4SSunila Sahu 	},
5143e9d6bd4SSunila Sahu 	{	/* modinv */
5153e9d6bd4SSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
5163e9d6bd4SSunila Sahu 		{.asym = {
5173e9d6bd4SSunila Sahu 			.xform_capa = {
5183e9d6bd4SSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_MODINV,
5193e9d6bd4SSunila Sahu 				.op_types = 0,
5203e9d6bd4SSunila Sahu 				{
5213e9d6bd4SSunila Sahu 				.modlen = {
5223e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on min length */
5233e9d6bd4SSunila Sahu 				.min = 0,
5243e9d6bd4SSunila Sahu 				/* value 0 symbolizes no limit on max length */
5253e9d6bd4SSunila Sahu 				.max = 0,
5263e9d6bd4SSunila Sahu 				.increment = 1
5273e9d6bd4SSunila Sahu 				}, }
5283e9d6bd4SSunila Sahu 			}
5293e9d6bd4SSunila Sahu 		},
5303e9d6bd4SSunila Sahu 		}
5313e9d6bd4SSunila Sahu 	},
532ac42813aSSunila Sahu 	{	/* dh */
533ac42813aSSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
534ac42813aSSunila Sahu 		{.asym = {
535ac42813aSSunila Sahu 			.xform_capa = {
536ac42813aSSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_DH,
537ac42813aSSunila Sahu 				.op_types =
538*5fa1fb29SArek Kusztal 				((1<<RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE) |
539*5fa1fb29SArek Kusztal 				(1 << RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE |
540ac42813aSSunila Sahu 				(1 <<
541*5fa1fb29SArek Kusztal 				RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE))),
542ac42813aSSunila Sahu 				{
543ac42813aSSunila Sahu 				.modlen = {
544ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on min length */
545ac42813aSSunila Sahu 				.min = 0,
546ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on max length */
547ac42813aSSunila Sahu 				.max = 0,
548ac42813aSSunila Sahu 				.increment = 1
549ac42813aSSunila Sahu 				}, }
550ac42813aSSunila Sahu 			}
551ac42813aSSunila Sahu 		},
552ac42813aSSunila Sahu 		}
553ac42813aSSunila Sahu 	},
554ac42813aSSunila Sahu 	{	/* dsa */
555ac42813aSSunila Sahu 		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
556ac42813aSSunila Sahu 		{.asym = {
557ac42813aSSunila Sahu 			.xform_capa = {
558ac42813aSSunila Sahu 				.xform_type = RTE_CRYPTO_ASYM_XFORM_DSA,
559ac42813aSSunila Sahu 				.op_types =
560ac42813aSSunila Sahu 				((1<<RTE_CRYPTO_ASYM_OP_SIGN) |
561ac42813aSSunila Sahu 				(1 << RTE_CRYPTO_ASYM_OP_VERIFY)),
562ac42813aSSunila Sahu 				{
563ac42813aSSunila Sahu 				.modlen = {
564ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on min length */
565ac42813aSSunila Sahu 				.min = 0,
566ac42813aSSunila Sahu 				/* value 0 symbolizes no limit on max length */
567ac42813aSSunila Sahu 				.max = 0,
568ac42813aSSunila Sahu 				.increment = 1
569ac42813aSSunila Sahu 				}, }
570ac42813aSSunila Sahu 			}
571ac42813aSSunila Sahu 		},
572ac42813aSSunila Sahu 		}
573ac42813aSSunila Sahu 	},
5748a9867a6SSlawomir Mrozowicz 
5758a9867a6SSlawomir Mrozowicz 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
5768a9867a6SSlawomir Mrozowicz };
5778a9867a6SSlawomir Mrozowicz 
5788a9867a6SSlawomir Mrozowicz 
5798a9867a6SSlawomir Mrozowicz /** Configure device */
5808a9867a6SSlawomir Mrozowicz static int
58160e686c2SFan Zhang openssl_pmd_config(__rte_unused struct rte_cryptodev *dev,
58260e686c2SFan Zhang 		__rte_unused struct rte_cryptodev_config *config)
5838a9867a6SSlawomir Mrozowicz {
5848a9867a6SSlawomir Mrozowicz 	return 0;
5858a9867a6SSlawomir Mrozowicz }
5868a9867a6SSlawomir Mrozowicz 
5878a9867a6SSlawomir Mrozowicz /** Start device */
5888a9867a6SSlawomir Mrozowicz static int
5898a9867a6SSlawomir Mrozowicz openssl_pmd_start(__rte_unused struct rte_cryptodev *dev)
5908a9867a6SSlawomir Mrozowicz {
5918a9867a6SSlawomir Mrozowicz 	return 0;
5928a9867a6SSlawomir Mrozowicz }
5938a9867a6SSlawomir Mrozowicz 
5948a9867a6SSlawomir Mrozowicz /** Stop device */
5958a9867a6SSlawomir Mrozowicz static void
5968a9867a6SSlawomir Mrozowicz openssl_pmd_stop(__rte_unused struct rte_cryptodev *dev)
5978a9867a6SSlawomir Mrozowicz {
5988a9867a6SSlawomir Mrozowicz }
5998a9867a6SSlawomir Mrozowicz 
6008a9867a6SSlawomir Mrozowicz /** Close device */
6018a9867a6SSlawomir Mrozowicz static int
6028a9867a6SSlawomir Mrozowicz openssl_pmd_close(__rte_unused struct rte_cryptodev *dev)
6038a9867a6SSlawomir Mrozowicz {
6048a9867a6SSlawomir Mrozowicz 	return 0;
6058a9867a6SSlawomir Mrozowicz }
6068a9867a6SSlawomir Mrozowicz 
6078a9867a6SSlawomir Mrozowicz 
6088a9867a6SSlawomir Mrozowicz /** Get device statistics */
6098a9867a6SSlawomir Mrozowicz static void
6108a9867a6SSlawomir Mrozowicz openssl_pmd_stats_get(struct rte_cryptodev *dev,
6118a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_stats *stats)
6128a9867a6SSlawomir Mrozowicz {
6138a9867a6SSlawomir Mrozowicz 	int qp_id;
6148a9867a6SSlawomir Mrozowicz 
6158a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
6168a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
6178a9867a6SSlawomir Mrozowicz 
6188a9867a6SSlawomir Mrozowicz 		stats->enqueued_count += qp->stats.enqueued_count;
6198a9867a6SSlawomir Mrozowicz 		stats->dequeued_count += qp->stats.dequeued_count;
6208a9867a6SSlawomir Mrozowicz 
6218a9867a6SSlawomir Mrozowicz 		stats->enqueue_err_count += qp->stats.enqueue_err_count;
6228a9867a6SSlawomir Mrozowicz 		stats->dequeue_err_count += qp->stats.dequeue_err_count;
6238a9867a6SSlawomir Mrozowicz 	}
6248a9867a6SSlawomir Mrozowicz }
6258a9867a6SSlawomir Mrozowicz 
6268a9867a6SSlawomir Mrozowicz /** Reset device statistics */
6278a9867a6SSlawomir Mrozowicz static void
6288a9867a6SSlawomir Mrozowicz openssl_pmd_stats_reset(struct rte_cryptodev *dev)
6298a9867a6SSlawomir Mrozowicz {
6308a9867a6SSlawomir Mrozowicz 	int qp_id;
6318a9867a6SSlawomir Mrozowicz 
6328a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
6338a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
6348a9867a6SSlawomir Mrozowicz 
6358a9867a6SSlawomir Mrozowicz 		memset(&qp->stats, 0, sizeof(qp->stats));
6368a9867a6SSlawomir Mrozowicz 	}
6378a9867a6SSlawomir Mrozowicz }
6388a9867a6SSlawomir Mrozowicz 
6398a9867a6SSlawomir Mrozowicz 
6408a9867a6SSlawomir Mrozowicz /** Get device info */
6418a9867a6SSlawomir Mrozowicz static void
6428a9867a6SSlawomir Mrozowicz openssl_pmd_info_get(struct rte_cryptodev *dev,
6438a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_info *dev_info)
6448a9867a6SSlawomir Mrozowicz {
6458a9867a6SSlawomir Mrozowicz 	struct openssl_private *internals = dev->data->dev_private;
6468a9867a6SSlawomir Mrozowicz 
6478a9867a6SSlawomir Mrozowicz 	if (dev_info != NULL) {
6487a364faeSSlawomir Mrozowicz 		dev_info->driver_id = dev->driver_id;
6498a9867a6SSlawomir Mrozowicz 		dev_info->feature_flags = dev->feature_flags;
6508a9867a6SSlawomir Mrozowicz 		dev_info->capabilities = openssl_pmd_capabilities;
6518a9867a6SSlawomir Mrozowicz 		dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
652e1fc5b76SPablo de Lara 		/* No limit of number of sessions */
653e1fc5b76SPablo de Lara 		dev_info->sym.max_nb_sessions = 0;
6548a9867a6SSlawomir Mrozowicz 	}
6558a9867a6SSlawomir Mrozowicz }
6568a9867a6SSlawomir Mrozowicz 
6578a9867a6SSlawomir Mrozowicz /** Release queue pair */
6588a9867a6SSlawomir Mrozowicz static int
6598a9867a6SSlawomir Mrozowicz openssl_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
6608a9867a6SSlawomir Mrozowicz {
6618a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL) {
662a4d69a51SFan Zhang 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
663a4d69a51SFan Zhang 
664a4d69a51SFan Zhang 		rte_ring_free(qp->processed_ops);
665a4d69a51SFan Zhang 
6668a9867a6SSlawomir Mrozowicz 		rte_free(dev->data->queue_pairs[qp_id]);
6678a9867a6SSlawomir Mrozowicz 		dev->data->queue_pairs[qp_id] = NULL;
6688a9867a6SSlawomir Mrozowicz 	}
6698a9867a6SSlawomir Mrozowicz 	return 0;
6708a9867a6SSlawomir Mrozowicz }
6718a9867a6SSlawomir Mrozowicz 
6728a9867a6SSlawomir Mrozowicz /** set a unique name for the queue pair based on it's name, dev_id and qp_id */
6738a9867a6SSlawomir Mrozowicz static int
6748a9867a6SSlawomir Mrozowicz openssl_pmd_qp_set_unique_name(struct rte_cryptodev *dev,
6758a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp)
6768a9867a6SSlawomir Mrozowicz {
6778a9867a6SSlawomir Mrozowicz 	unsigned int n = snprintf(qp->name, sizeof(qp->name),
6788a9867a6SSlawomir Mrozowicz 			"openssl_pmd_%u_qp_%u",
6798a9867a6SSlawomir Mrozowicz 			dev->data->dev_id, qp->id);
6808a9867a6SSlawomir Mrozowicz 
6816ab25e63STomasz Duszynski 	if (n >= sizeof(qp->name))
6828a9867a6SSlawomir Mrozowicz 		return -1;
6838a9867a6SSlawomir Mrozowicz 
6848a9867a6SSlawomir Mrozowicz 	return 0;
6858a9867a6SSlawomir Mrozowicz }
6868a9867a6SSlawomir Mrozowicz 
6878a9867a6SSlawomir Mrozowicz 
6888a9867a6SSlawomir Mrozowicz /** Create a ring to place processed operations on */
6898a9867a6SSlawomir Mrozowicz static struct rte_ring *
6908a9867a6SSlawomir Mrozowicz openssl_pmd_qp_create_processed_ops_ring(struct openssl_qp *qp,
6918a9867a6SSlawomir Mrozowicz 		unsigned int ring_size, int socket_id)
6928a9867a6SSlawomir Mrozowicz {
6938a9867a6SSlawomir Mrozowicz 	struct rte_ring *r;
6948a9867a6SSlawomir Mrozowicz 
6958a9867a6SSlawomir Mrozowicz 	r = rte_ring_lookup(qp->name);
6968a9867a6SSlawomir Mrozowicz 	if (r) {
697636e7392SBruce Richardson 		if (rte_ring_get_size(r) >= ring_size) {
698094b2386SNaga Suresh Somarowthu 			OPENSSL_LOG(INFO,
6998a9867a6SSlawomir Mrozowicz 					"Reusing existing ring %s for processed ops",
7008a9867a6SSlawomir Mrozowicz 				 qp->name);
7018a9867a6SSlawomir Mrozowicz 			return r;
7028a9867a6SSlawomir Mrozowicz 		}
7038a9867a6SSlawomir Mrozowicz 
704094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR,
7058a9867a6SSlawomir Mrozowicz 				"Unable to reuse existing ring %s for processed ops",
7068a9867a6SSlawomir Mrozowicz 			 qp->name);
7078a9867a6SSlawomir Mrozowicz 		return NULL;
7088a9867a6SSlawomir Mrozowicz 	}
7098a9867a6SSlawomir Mrozowicz 
7108a9867a6SSlawomir Mrozowicz 	return rte_ring_create(qp->name, ring_size, socket_id,
7118a9867a6SSlawomir Mrozowicz 			RING_F_SP_ENQ | RING_F_SC_DEQ);
7128a9867a6SSlawomir Mrozowicz }
7138a9867a6SSlawomir Mrozowicz 
7148a9867a6SSlawomir Mrozowicz 
7158a9867a6SSlawomir Mrozowicz /** Setup a queue pair */
7168a9867a6SSlawomir Mrozowicz static int
7178a9867a6SSlawomir Mrozowicz openssl_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
7188a9867a6SSlawomir Mrozowicz 		const struct rte_cryptodev_qp_conf *qp_conf,
719725d2a7fSFan Zhang 		int socket_id)
7208a9867a6SSlawomir Mrozowicz {
7218a9867a6SSlawomir Mrozowicz 	struct openssl_qp *qp = NULL;
7228a9867a6SSlawomir Mrozowicz 
7238a9867a6SSlawomir Mrozowicz 	/* Free memory prior to re-allocation if needed. */
7248a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL)
7258a9867a6SSlawomir Mrozowicz 		openssl_pmd_qp_release(dev, qp_id);
7268a9867a6SSlawomir Mrozowicz 
7278a9867a6SSlawomir Mrozowicz 	/* Allocate the queue pair data structure. */
7288a9867a6SSlawomir Mrozowicz 	qp = rte_zmalloc_socket("OPENSSL PMD Queue Pair", sizeof(*qp),
7298a9867a6SSlawomir Mrozowicz 					RTE_CACHE_LINE_SIZE, socket_id);
7308a9867a6SSlawomir Mrozowicz 	if (qp == NULL)
7318a9867a6SSlawomir Mrozowicz 		return -ENOMEM;
7328a9867a6SSlawomir Mrozowicz 
7338a9867a6SSlawomir Mrozowicz 	qp->id = qp_id;
7348a9867a6SSlawomir Mrozowicz 	dev->data->queue_pairs[qp_id] = qp;
7358a9867a6SSlawomir Mrozowicz 
7368a9867a6SSlawomir Mrozowicz 	if (openssl_pmd_qp_set_unique_name(dev, qp))
7378a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
7388a9867a6SSlawomir Mrozowicz 
7398a9867a6SSlawomir Mrozowicz 	qp->processed_ops = openssl_pmd_qp_create_processed_ops_ring(qp,
7408a9867a6SSlawomir Mrozowicz 			qp_conf->nb_descriptors, socket_id);
7418a9867a6SSlawomir Mrozowicz 	if (qp->processed_ops == NULL)
7428a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
7438a9867a6SSlawomir Mrozowicz 
744725d2a7fSFan Zhang 	qp->sess_mp = qp_conf->mp_session;
745725d2a7fSFan Zhang 	qp->sess_mp_priv = qp_conf->mp_session_private;
7468a9867a6SSlawomir Mrozowicz 
7478a9867a6SSlawomir Mrozowicz 	memset(&qp->stats, 0, sizeof(qp->stats));
7488a9867a6SSlawomir Mrozowicz 
7498a9867a6SSlawomir Mrozowicz 	return 0;
7508a9867a6SSlawomir Mrozowicz 
7518a9867a6SSlawomir Mrozowicz qp_setup_cleanup:
7528a9867a6SSlawomir Mrozowicz 	rte_free(qp);
7538a9867a6SSlawomir Mrozowicz 
7548a9867a6SSlawomir Mrozowicz 	return -1;
7558a9867a6SSlawomir Mrozowicz }
7568a9867a6SSlawomir Mrozowicz 
7573e9d6bd4SSunila Sahu /** Returns the size of the symmetric session structure */
7588a9867a6SSlawomir Mrozowicz static unsigned
759012c5076SPablo de Lara openssl_pmd_sym_session_get_size(struct rte_cryptodev *dev __rte_unused)
7608a9867a6SSlawomir Mrozowicz {
7618a9867a6SSlawomir Mrozowicz 	return sizeof(struct openssl_session);
7628a9867a6SSlawomir Mrozowicz }
7638a9867a6SSlawomir Mrozowicz 
7643e9d6bd4SSunila Sahu /** Returns the size of the asymmetric session structure */
7653e9d6bd4SSunila Sahu static unsigned
7663e9d6bd4SSunila Sahu openssl_pmd_asym_session_get_size(struct rte_cryptodev *dev __rte_unused)
7673e9d6bd4SSunila Sahu {
7683e9d6bd4SSunila Sahu 	return sizeof(struct openssl_asym_session);
7693e9d6bd4SSunila Sahu }
7703e9d6bd4SSunila Sahu 
7718a9867a6SSlawomir Mrozowicz /** Configure the session from a crypto xform chain */
772b3bbd9e5SSlawomir Mrozowicz static int
773012c5076SPablo de Lara openssl_pmd_sym_session_configure(struct rte_cryptodev *dev __rte_unused,
774b3bbd9e5SSlawomir Mrozowicz 		struct rte_crypto_sym_xform *xform,
775b3bbd9e5SSlawomir Mrozowicz 		struct rte_cryptodev_sym_session *sess,
776b3bbd9e5SSlawomir Mrozowicz 		struct rte_mempool *mempool)
7778a9867a6SSlawomir Mrozowicz {
778b3bbd9e5SSlawomir Mrozowicz 	void *sess_private_data;
77927391b53SPablo de Lara 	int ret;
780b3bbd9e5SSlawomir Mrozowicz 
7818a9867a6SSlawomir Mrozowicz 	if (unlikely(sess == NULL)) {
782094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR, "invalid session struct");
78327391b53SPablo de Lara 		return -EINVAL;
784b3bbd9e5SSlawomir Mrozowicz 	}
785b3bbd9e5SSlawomir Mrozowicz 
786b3bbd9e5SSlawomir Mrozowicz 	if (rte_mempool_get(mempool, &sess_private_data)) {
787094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR,
788b3bbd9e5SSlawomir Mrozowicz 			"Couldn't get object from session mempool");
78927391b53SPablo de Lara 		return -ENOMEM;
7908a9867a6SSlawomir Mrozowicz 	}
7918a9867a6SSlawomir Mrozowicz 
79227391b53SPablo de Lara 	ret = openssl_set_session_parameters(sess_private_data, xform);
79327391b53SPablo de Lara 	if (ret != 0) {
794094b2386SNaga Suresh Somarowthu 		OPENSSL_LOG(ERR, "failed configure session parameters");
795b3bbd9e5SSlawomir Mrozowicz 
796b3bbd9e5SSlawomir Mrozowicz 		/* Return session to mempool */
797b3bbd9e5SSlawomir Mrozowicz 		rte_mempool_put(mempool, sess_private_data);
79827391b53SPablo de Lara 		return ret;
7998a9867a6SSlawomir Mrozowicz 	}
8008a9867a6SSlawomir Mrozowicz 
801012c5076SPablo de Lara 	set_sym_session_private_data(sess, dev->driver_id,
802b3bbd9e5SSlawomir Mrozowicz 			sess_private_data);
803b3bbd9e5SSlawomir Mrozowicz 
804b3bbd9e5SSlawomir Mrozowicz 	return 0;
8058a9867a6SSlawomir Mrozowicz }
8068a9867a6SSlawomir Mrozowicz 
8073e9d6bd4SSunila Sahu static int openssl_set_asym_session_parameters(
8083e9d6bd4SSunila Sahu 		struct openssl_asym_session *asym_session,
8093e9d6bd4SSunila Sahu 		struct rte_crypto_asym_xform *xform)
8103e9d6bd4SSunila Sahu {
8113e9d6bd4SSunila Sahu 	int ret = 0;
8123e9d6bd4SSunila Sahu 
813ac42813aSSunila Sahu 	if ((xform->xform_type != RTE_CRYPTO_ASYM_XFORM_DH) &&
814ac42813aSSunila Sahu 		(xform->next != NULL)) {
8153e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "chained xfrms are not supported on %s",
8163e9d6bd4SSunila Sahu 			rte_crypto_asym_xform_strings[xform->xform_type]);
8173e9d6bd4SSunila Sahu 		return -1;
8183e9d6bd4SSunila Sahu 	}
8193e9d6bd4SSunila Sahu 
8203e9d6bd4SSunila Sahu 	switch (xform->xform_type) {
8213e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_RSA:
8223e9d6bd4SSunila Sahu 	{
8233e9d6bd4SSunila Sahu 		BIGNUM *n = NULL;
8243e9d6bd4SSunila Sahu 		BIGNUM *e = NULL;
8253e9d6bd4SSunila Sahu 		BIGNUM *d = NULL;
8263e9d6bd4SSunila Sahu 		BIGNUM *p = NULL, *q = NULL, *dmp1 = NULL;
8273e9d6bd4SSunila Sahu 		BIGNUM *iqmp = NULL, *dmq1 = NULL;
8283e9d6bd4SSunila Sahu 
8293e9d6bd4SSunila Sahu 		/* copy xfrm data into rsa struct */
8303e9d6bd4SSunila Sahu 		n = BN_bin2bn((const unsigned char *)xform->rsa.n.data,
8313e9d6bd4SSunila Sahu 				xform->rsa.n.length, n);
8323e9d6bd4SSunila Sahu 		e = BN_bin2bn((const unsigned char *)xform->rsa.e.data,
8333e9d6bd4SSunila Sahu 				xform->rsa.e.length, e);
8343e9d6bd4SSunila Sahu 
8353e9d6bd4SSunila Sahu 		if (!n || !e)
8363e9d6bd4SSunila Sahu 			goto err_rsa;
8373e9d6bd4SSunila Sahu 
8383e9d6bd4SSunila Sahu 		RSA *rsa = RSA_new();
8393e9d6bd4SSunila Sahu 		if (rsa == NULL)
8403e9d6bd4SSunila Sahu 			goto err_rsa;
8413e9d6bd4SSunila Sahu 
8423e9d6bd4SSunila Sahu 		if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) {
8433e9d6bd4SSunila Sahu 			d = BN_bin2bn(
8443e9d6bd4SSunila Sahu 			(const unsigned char *)xform->rsa.d.data,
8453e9d6bd4SSunila Sahu 			xform->rsa.d.length,
8463e9d6bd4SSunila Sahu 			d);
8473e9d6bd4SSunila Sahu 			if (!d) {
8483e9d6bd4SSunila Sahu 				RSA_free(rsa);
8493e9d6bd4SSunila Sahu 				goto err_rsa;
8503e9d6bd4SSunila Sahu 			}
8513e9d6bd4SSunila Sahu 		} else {
8523e9d6bd4SSunila Sahu 			p = BN_bin2bn((const unsigned char *)
8533e9d6bd4SSunila Sahu 					xform->rsa.qt.p.data,
8543e9d6bd4SSunila Sahu 					xform->rsa.qt.p.length,
8553e9d6bd4SSunila Sahu 					p);
8563e9d6bd4SSunila Sahu 			q = BN_bin2bn((const unsigned char *)
8573e9d6bd4SSunila Sahu 					xform->rsa.qt.q.data,
8583e9d6bd4SSunila Sahu 					xform->rsa.qt.q.length,
8593e9d6bd4SSunila Sahu 					q);
8603e9d6bd4SSunila Sahu 			dmp1 = BN_bin2bn((const unsigned char *)
8613e9d6bd4SSunila Sahu 					xform->rsa.qt.dP.data,
8623e9d6bd4SSunila Sahu 					xform->rsa.qt.dP.length,
8633e9d6bd4SSunila Sahu 					dmp1);
8643e9d6bd4SSunila Sahu 			dmq1 = BN_bin2bn((const unsigned char *)
8653e9d6bd4SSunila Sahu 					xform->rsa.qt.dQ.data,
8663e9d6bd4SSunila Sahu 					xform->rsa.qt.dQ.length,
8673e9d6bd4SSunila Sahu 					dmq1);
8683e9d6bd4SSunila Sahu 			iqmp = BN_bin2bn((const unsigned char *)
8693e9d6bd4SSunila Sahu 					xform->rsa.qt.qInv.data,
8703e9d6bd4SSunila Sahu 					xform->rsa.qt.qInv.length,
8713e9d6bd4SSunila Sahu 					iqmp);
8723e9d6bd4SSunila Sahu 
8733e9d6bd4SSunila Sahu 			if (!p || !q || !dmp1 || !dmq1 || !iqmp) {
8743e9d6bd4SSunila Sahu 				RSA_free(rsa);
8753e9d6bd4SSunila Sahu 				goto err_rsa;
8763e9d6bd4SSunila Sahu 			}
8770b5284adSAshish Gupta 			ret = set_rsa_params(rsa, p, q);
8783e9d6bd4SSunila Sahu 			if (ret) {
8793e9d6bd4SSunila Sahu 				OPENSSL_LOG(ERR,
8803e9d6bd4SSunila Sahu 					"failed to set rsa params\n");
8813e9d6bd4SSunila Sahu 				RSA_free(rsa);
8823e9d6bd4SSunila Sahu 				goto err_rsa;
8833e9d6bd4SSunila Sahu 			}
8840b5284adSAshish Gupta 			ret = set_rsa_crt_params(rsa, dmp1, dmq1, iqmp);
8853e9d6bd4SSunila Sahu 			if (ret) {
8863e9d6bd4SSunila Sahu 				OPENSSL_LOG(ERR,
8873e9d6bd4SSunila Sahu 					"failed to set crt params\n");
8883e9d6bd4SSunila Sahu 				RSA_free(rsa);
8893e9d6bd4SSunila Sahu 				/*
8903e9d6bd4SSunila Sahu 				 * set already populated params to NULL
8913e9d6bd4SSunila Sahu 				 * as its freed by call to RSA_free
8923e9d6bd4SSunila Sahu 				 */
8933e9d6bd4SSunila Sahu 				p = q = NULL;
8943e9d6bd4SSunila Sahu 				goto err_rsa;
8953e9d6bd4SSunila Sahu 			}
8963e9d6bd4SSunila Sahu 		}
8973e9d6bd4SSunila Sahu 
8980b5284adSAshish Gupta 		ret = set_rsa_keys(rsa, n, e, d);
8993e9d6bd4SSunila Sahu 		if (ret) {
9003e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR, "Failed to load rsa keys\n");
9013e9d6bd4SSunila Sahu 			RSA_free(rsa);
9023e9d6bd4SSunila Sahu 			return -1;
9033e9d6bd4SSunila Sahu 		}
9043e9d6bd4SSunila Sahu 		asym_session->u.r.rsa = rsa;
9053e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA;
9063e9d6bd4SSunila Sahu 		break;
9073e9d6bd4SSunila Sahu err_rsa:
90877411bd6SArek Kusztal 		BN_clear_free(n);
90977411bd6SArek Kusztal 		BN_clear_free(e);
91077411bd6SArek Kusztal 		BN_clear_free(d);
91177411bd6SArek Kusztal 		BN_clear_free(p);
91277411bd6SArek Kusztal 		BN_clear_free(q);
91377411bd6SArek Kusztal 		BN_clear_free(dmp1);
91477411bd6SArek Kusztal 		BN_clear_free(dmq1);
91577411bd6SArek Kusztal 		BN_clear_free(iqmp);
9163e9d6bd4SSunila Sahu 
9173e9d6bd4SSunila Sahu 		return -1;
9183e9d6bd4SSunila Sahu 	}
9193e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
9203e9d6bd4SSunila Sahu 	{
9213e9d6bd4SSunila Sahu 		struct rte_crypto_modex_xform *xfrm = &(xform->modex);
9223e9d6bd4SSunila Sahu 
9233e9d6bd4SSunila Sahu 		BN_CTX *ctx = BN_CTX_new();
9243e9d6bd4SSunila Sahu 		if (ctx == NULL) {
9253e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR,
9263e9d6bd4SSunila Sahu 				" failed to allocate resources\n");
9273e9d6bd4SSunila Sahu 			return -1;
9283e9d6bd4SSunila Sahu 		}
9293e9d6bd4SSunila Sahu 		BN_CTX_start(ctx);
9303e9d6bd4SSunila Sahu 		BIGNUM *mod = BN_CTX_get(ctx);
9313e9d6bd4SSunila Sahu 		BIGNUM *exp = BN_CTX_get(ctx);
9323e9d6bd4SSunila Sahu 		if (mod == NULL || exp == NULL) {
9333e9d6bd4SSunila Sahu 			BN_CTX_end(ctx);
9343e9d6bd4SSunila Sahu 			BN_CTX_free(ctx);
9353e9d6bd4SSunila Sahu 			return -1;
9363e9d6bd4SSunila Sahu 		}
9373e9d6bd4SSunila Sahu 
9383e9d6bd4SSunila Sahu 		mod = BN_bin2bn((const unsigned char *)
9393e9d6bd4SSunila Sahu 				xfrm->modulus.data,
9403e9d6bd4SSunila Sahu 				xfrm->modulus.length, mod);
9413e9d6bd4SSunila Sahu 		exp = BN_bin2bn((const unsigned char *)
9423e9d6bd4SSunila Sahu 				xfrm->exponent.data,
9433e9d6bd4SSunila Sahu 				xfrm->exponent.length, exp);
9443e9d6bd4SSunila Sahu 		asym_session->u.e.ctx = ctx;
9453e9d6bd4SSunila Sahu 		asym_session->u.e.mod = mod;
9463e9d6bd4SSunila Sahu 		asym_session->u.e.exp = exp;
9473e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
9483e9d6bd4SSunila Sahu 		break;
9493e9d6bd4SSunila Sahu 	}
9503e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
9513e9d6bd4SSunila Sahu 	{
9523e9d6bd4SSunila Sahu 		struct rte_crypto_modinv_xform *xfrm = &(xform->modinv);
9533e9d6bd4SSunila Sahu 
9543e9d6bd4SSunila Sahu 		BN_CTX *ctx = BN_CTX_new();
9553e9d6bd4SSunila Sahu 		if (ctx == NULL) {
9563e9d6bd4SSunila Sahu 			OPENSSL_LOG(ERR,
9573e9d6bd4SSunila Sahu 				" failed to allocate resources\n");
9583e9d6bd4SSunila Sahu 			return -1;
9593e9d6bd4SSunila Sahu 		}
9603e9d6bd4SSunila Sahu 		BN_CTX_start(ctx);
9613e9d6bd4SSunila Sahu 		BIGNUM *mod = BN_CTX_get(ctx);
9623e9d6bd4SSunila Sahu 		if (mod == NULL) {
9633e9d6bd4SSunila Sahu 			BN_CTX_end(ctx);
9643e9d6bd4SSunila Sahu 			BN_CTX_free(ctx);
9653e9d6bd4SSunila Sahu 			return -1;
9663e9d6bd4SSunila Sahu 		}
9673e9d6bd4SSunila Sahu 
9683e9d6bd4SSunila Sahu 		mod = BN_bin2bn((const unsigned char *)
9693e9d6bd4SSunila Sahu 				xfrm->modulus.data,
9703e9d6bd4SSunila Sahu 				xfrm->modulus.length,
9713e9d6bd4SSunila Sahu 				mod);
9723e9d6bd4SSunila Sahu 		asym_session->u.m.ctx = ctx;
9733e9d6bd4SSunila Sahu 		asym_session->u.m.modulus = mod;
9743e9d6bd4SSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODINV;
9753e9d6bd4SSunila Sahu 		break;
9763e9d6bd4SSunila Sahu 	}
977ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DH:
978ac42813aSSunila Sahu 	{
979ac42813aSSunila Sahu 		BIGNUM *p = NULL;
980ac42813aSSunila Sahu 		BIGNUM *g = NULL;
981ac42813aSSunila Sahu 
982ac42813aSSunila Sahu 		p = BN_bin2bn((const unsigned char *)
983ac42813aSSunila Sahu 				xform->dh.p.data,
984ac42813aSSunila Sahu 				xform->dh.p.length,
985ac42813aSSunila Sahu 				p);
986ac42813aSSunila Sahu 		g = BN_bin2bn((const unsigned char *)
987ac42813aSSunila Sahu 				xform->dh.g.data,
988ac42813aSSunila Sahu 				xform->dh.g.length,
989ac42813aSSunila Sahu 				g);
990ac42813aSSunila Sahu 		if (!p || !g)
991ac42813aSSunila Sahu 			goto err_dh;
992ac42813aSSunila Sahu 
993ac42813aSSunila Sahu 		DH *dh = DH_new();
994ac42813aSSunila Sahu 		if (dh == NULL) {
995ac42813aSSunila Sahu 			OPENSSL_LOG(ERR,
996ac42813aSSunila Sahu 				"failed to allocate resources\n");
997ac42813aSSunila Sahu 			goto err_dh;
998ac42813aSSunila Sahu 		}
9990b5284adSAshish Gupta 		ret = set_dh_params(dh, p, g);
1000ac42813aSSunila Sahu 		if (ret) {
1001ac42813aSSunila Sahu 			DH_free(dh);
1002ac42813aSSunila Sahu 			goto err_dh;
1003ac42813aSSunila Sahu 		}
1004ac42813aSSunila Sahu 
1005ac42813aSSunila Sahu 		/*
1006ac42813aSSunila Sahu 		 * setup xfrom for
1007ac42813aSSunila Sahu 		 * public key generate, or
1008ac42813aSSunila Sahu 		 * DH Priv key generate, or both
1009ac42813aSSunila Sahu 		 * public and private key generate
1010ac42813aSSunila Sahu 		 */
1011*5fa1fb29SArek Kusztal 		asym_session->u.dh.key_op = (1 << xform->dh.ke_type);
1012ac42813aSSunila Sahu 
1013*5fa1fb29SArek Kusztal 		if (xform->dh.ke_type ==
1014*5fa1fb29SArek Kusztal 			RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE) {
1015ac42813aSSunila Sahu 			/* check if next is pubkey */
1016ac42813aSSunila Sahu 			if ((xform->next != NULL) &&
1017ac42813aSSunila Sahu 				(xform->next->xform_type ==
1018ac42813aSSunila Sahu 				RTE_CRYPTO_ASYM_XFORM_DH) &&
1019*5fa1fb29SArek Kusztal 				(xform->next->dh.ke_type ==
1020*5fa1fb29SArek Kusztal 				RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE)
1021ac42813aSSunila Sahu 				) {
1022ac42813aSSunila Sahu 				/*
1023ac42813aSSunila Sahu 				 * setup op as pub/priv key
1024ac42813aSSunila Sahu 				 * pair generationi
1025ac42813aSSunila Sahu 				 */
1026ac42813aSSunila Sahu 				asym_session->u.dh.key_op |=
1027ac42813aSSunila Sahu 				(1 <<
1028*5fa1fb29SArek Kusztal 				RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE);
1029ac42813aSSunila Sahu 			}
1030ac42813aSSunila Sahu 		}
1031ac42813aSSunila Sahu 		asym_session->u.dh.dh_key = dh;
1032ac42813aSSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DH;
1033ac42813aSSunila Sahu 		break;
1034ac42813aSSunila Sahu 
1035ac42813aSSunila Sahu err_dh:
1036ac42813aSSunila Sahu 		OPENSSL_LOG(ERR, " failed to set dh params\n");
1037ac42813aSSunila Sahu 		BN_free(p);
1038ac42813aSSunila Sahu 		BN_free(g);
1039ac42813aSSunila Sahu 		return -1;
1040ac42813aSSunila Sahu 	}
1041ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DSA:
1042ac42813aSSunila Sahu 	{
1043ac42813aSSunila Sahu 		BIGNUM *p = NULL, *g = NULL;
1044ac42813aSSunila Sahu 		BIGNUM *q = NULL, *priv_key = NULL;
1045ac42813aSSunila Sahu 		BIGNUM *pub_key = BN_new();
1046ac42813aSSunila Sahu 		BN_zero(pub_key);
1047ac42813aSSunila Sahu 
1048ac42813aSSunila Sahu 		p = BN_bin2bn((const unsigned char *)
1049ac42813aSSunila Sahu 				xform->dsa.p.data,
1050ac42813aSSunila Sahu 				xform->dsa.p.length,
1051ac42813aSSunila Sahu 				p);
1052ac42813aSSunila Sahu 
1053ac42813aSSunila Sahu 		g = BN_bin2bn((const unsigned char *)
1054ac42813aSSunila Sahu 				xform->dsa.g.data,
1055ac42813aSSunila Sahu 				xform->dsa.g.length,
1056ac42813aSSunila Sahu 				g);
1057ac42813aSSunila Sahu 
1058ac42813aSSunila Sahu 		q = BN_bin2bn((const unsigned char *)
1059ac42813aSSunila Sahu 				xform->dsa.q.data,
1060ac42813aSSunila Sahu 				xform->dsa.q.length,
1061ac42813aSSunila Sahu 				q);
1062ac42813aSSunila Sahu 		if (!p || !q || !g)
1063ac42813aSSunila Sahu 			goto err_dsa;
1064ac42813aSSunila Sahu 
1065ac42813aSSunila Sahu 		priv_key = BN_bin2bn((const unsigned char *)
1066ac42813aSSunila Sahu 				xform->dsa.x.data,
1067ac42813aSSunila Sahu 				xform->dsa.x.length,
1068ac42813aSSunila Sahu 				priv_key);
1069ac42813aSSunila Sahu 		if (priv_key == NULL)
1070ac42813aSSunila Sahu 			goto err_dsa;
1071ac42813aSSunila Sahu 
1072ac42813aSSunila Sahu 		DSA *dsa = DSA_new();
1073ac42813aSSunila Sahu 		if (dsa == NULL) {
1074ac42813aSSunila Sahu 			OPENSSL_LOG(ERR,
1075ac42813aSSunila Sahu 				" failed to allocate resources\n");
1076ac42813aSSunila Sahu 			goto err_dsa;
1077ac42813aSSunila Sahu 		}
1078ac42813aSSunila Sahu 
10790b5284adSAshish Gupta 		ret = set_dsa_params(dsa, p, q, g);
1080ac42813aSSunila Sahu 		if (ret) {
1081ac42813aSSunila Sahu 			DSA_free(dsa);
1082ac42813aSSunila Sahu 			OPENSSL_LOG(ERR, "Failed to dsa params\n");
1083ac42813aSSunila Sahu 			goto err_dsa;
1084ac42813aSSunila Sahu 		}
1085ac42813aSSunila Sahu 
1086ac42813aSSunila Sahu 		/*
1087ac42813aSSunila Sahu 		 * openssl 1.1.0 mandate that public key can't be
1088ac42813aSSunila Sahu 		 * NULL in very first call. so set a dummy pub key.
1089ac42813aSSunila Sahu 		 * to keep consistency, lets follow same approach for
1090ac42813aSSunila Sahu 		 * both versions
1091ac42813aSSunila Sahu 		 */
1092ac42813aSSunila Sahu 		/* just set dummy public for very 1st call */
10930b5284adSAshish Gupta 		ret = set_dsa_keys(dsa, pub_key, priv_key);
1094ac42813aSSunila Sahu 		if (ret) {
1095ac42813aSSunila Sahu 			DSA_free(dsa);
1096ac42813aSSunila Sahu 			OPENSSL_LOG(ERR, "Failed to set keys\n");
1097ac42813aSSunila Sahu 			return -1;
1098ac42813aSSunila Sahu 		}
1099ac42813aSSunila Sahu 		asym_session->u.s.dsa = dsa;
1100ac42813aSSunila Sahu 		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DSA;
1101ac42813aSSunila Sahu 		break;
1102ac42813aSSunila Sahu 
1103ac42813aSSunila Sahu err_dsa:
1104ac42813aSSunila Sahu 		BN_free(p);
1105ac42813aSSunila Sahu 		BN_free(q);
1106ac42813aSSunila Sahu 		BN_free(g);
1107ac42813aSSunila Sahu 		BN_free(priv_key);
1108ac42813aSSunila Sahu 		BN_free(pub_key);
1109ac42813aSSunila Sahu 		return -1;
1110ac42813aSSunila Sahu 	}
11113e9d6bd4SSunila Sahu 	default:
11123e9d6bd4SSunila Sahu 		return -1;
11133e9d6bd4SSunila Sahu 	}
11143e9d6bd4SSunila Sahu 
11153e9d6bd4SSunila Sahu 	return 0;
11163e9d6bd4SSunila Sahu }
11173e9d6bd4SSunila Sahu 
11183e9d6bd4SSunila Sahu /** Configure the session from a crypto xform chain */
11193e9d6bd4SSunila Sahu static int
11203e9d6bd4SSunila Sahu openssl_pmd_asym_session_configure(struct rte_cryptodev *dev __rte_unused,
11213e9d6bd4SSunila Sahu 		struct rte_crypto_asym_xform *xform,
11221f1e4b7cSCiara Power 		struct rte_cryptodev_asym_session *sess)
11233e9d6bd4SSunila Sahu {
11243e9d6bd4SSunila Sahu 	void *asym_sess_private_data;
11253e9d6bd4SSunila Sahu 	int ret;
11263e9d6bd4SSunila Sahu 
11273e9d6bd4SSunila Sahu 	if (unlikely(sess == NULL)) {
11283e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "invalid asymmetric session struct");
11293e9d6bd4SSunila Sahu 		return -EINVAL;
11303e9d6bd4SSunila Sahu 	}
11313e9d6bd4SSunila Sahu 
11321f1e4b7cSCiara Power 	asym_sess_private_data = sess->sess_private_data;
11333e9d6bd4SSunila Sahu 	ret = openssl_set_asym_session_parameters(asym_sess_private_data,
11343e9d6bd4SSunila Sahu 			xform);
11353e9d6bd4SSunila Sahu 	if (ret != 0) {
11363e9d6bd4SSunila Sahu 		OPENSSL_LOG(ERR, "failed configure session parameters");
11373e9d6bd4SSunila Sahu 		return ret;
11383e9d6bd4SSunila Sahu 	}
11393e9d6bd4SSunila Sahu 
11403e9d6bd4SSunila Sahu 	return 0;
11413e9d6bd4SSunila Sahu }
11428a9867a6SSlawomir Mrozowicz 
11438a9867a6SSlawomir Mrozowicz /** Clear the memory of session so it doesn't leave key material behind */
11448a9867a6SSlawomir Mrozowicz static void
1145012c5076SPablo de Lara openssl_pmd_sym_session_clear(struct rte_cryptodev *dev,
1146b3bbd9e5SSlawomir Mrozowicz 		struct rte_cryptodev_sym_session *sess)
11478a9867a6SSlawomir Mrozowicz {
1148b3bbd9e5SSlawomir Mrozowicz 	uint8_t index = dev->driver_id;
1149012c5076SPablo de Lara 	void *sess_priv = get_sym_session_private_data(sess, index);
1150b3bbd9e5SSlawomir Mrozowicz 
1151b3bbd9e5SSlawomir Mrozowicz 	/* Zero out the whole structure */
1152b3bbd9e5SSlawomir Mrozowicz 	if (sess_priv) {
1153b3bbd9e5SSlawomir Mrozowicz 		openssl_reset_session(sess_priv);
1154b3bbd9e5SSlawomir Mrozowicz 		memset(sess_priv, 0, sizeof(struct openssl_session));
1155b3bbd9e5SSlawomir Mrozowicz 		struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
1156012c5076SPablo de Lara 		set_sym_session_private_data(sess, index, NULL);
1157b3bbd9e5SSlawomir Mrozowicz 		rte_mempool_put(sess_mp, sess_priv);
11588a9867a6SSlawomir Mrozowicz 	}
11598a9867a6SSlawomir Mrozowicz }
11608a9867a6SSlawomir Mrozowicz 
11613e9d6bd4SSunila Sahu static void openssl_reset_asym_session(struct openssl_asym_session *sess)
11623e9d6bd4SSunila Sahu {
11633e9d6bd4SSunila Sahu 	switch (sess->xfrm_type) {
11643e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_RSA:
11653e9d6bd4SSunila Sahu 		if (sess->u.r.rsa)
11663e9d6bd4SSunila Sahu 			RSA_free(sess->u.r.rsa);
11673e9d6bd4SSunila Sahu 		break;
11683e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODEX:
11693e9d6bd4SSunila Sahu 		if (sess->u.e.ctx) {
11703e9d6bd4SSunila Sahu 			BN_CTX_end(sess->u.e.ctx);
11713e9d6bd4SSunila Sahu 			BN_CTX_free(sess->u.e.ctx);
11723e9d6bd4SSunila Sahu 		}
11733e9d6bd4SSunila Sahu 		break;
11743e9d6bd4SSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_MODINV:
11753e9d6bd4SSunila Sahu 		if (sess->u.m.ctx) {
11763e9d6bd4SSunila Sahu 			BN_CTX_end(sess->u.m.ctx);
11773e9d6bd4SSunila Sahu 			BN_CTX_free(sess->u.m.ctx);
11783e9d6bd4SSunila Sahu 		}
11793e9d6bd4SSunila Sahu 		break;
1180ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DH:
1181ac42813aSSunila Sahu 		if (sess->u.dh.dh_key)
1182ac42813aSSunila Sahu 			DH_free(sess->u.dh.dh_key);
1183ac42813aSSunila Sahu 		break;
1184ac42813aSSunila Sahu 	case RTE_CRYPTO_ASYM_XFORM_DSA:
1185ac42813aSSunila Sahu 		if (sess->u.s.dsa)
1186ac42813aSSunila Sahu 			DSA_free(sess->u.s.dsa);
1187ac42813aSSunila Sahu 		break;
11883e9d6bd4SSunila Sahu 	default:
11893e9d6bd4SSunila Sahu 		break;
11903e9d6bd4SSunila Sahu 	}
11913e9d6bd4SSunila Sahu }
11923e9d6bd4SSunila Sahu 
11933e9d6bd4SSunila Sahu /** Clear the memory of asymmetric session
11943e9d6bd4SSunila Sahu  * so it doesn't leave key material behind
11953e9d6bd4SSunila Sahu  */
11963e9d6bd4SSunila Sahu static void
11971f1e4b7cSCiara Power openssl_pmd_asym_session_clear(struct rte_cryptodev *dev __rte_unused,
11983e9d6bd4SSunila Sahu 		struct rte_cryptodev_asym_session *sess)
11993e9d6bd4SSunila Sahu {
12001f1e4b7cSCiara Power 	void *sess_priv = sess->sess_private_data;
12013e9d6bd4SSunila Sahu 
12023e9d6bd4SSunila Sahu 	/* Zero out the whole structure */
12033e9d6bd4SSunila Sahu 	if (sess_priv) {
12043e9d6bd4SSunila Sahu 		openssl_reset_asym_session(sess_priv);
12053e9d6bd4SSunila Sahu 		memset(sess_priv, 0, sizeof(struct openssl_asym_session));
12063e9d6bd4SSunila Sahu 	}
12073e9d6bd4SSunila Sahu }
12083e9d6bd4SSunila Sahu 
12098a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops openssl_pmd_ops = {
12108a9867a6SSlawomir Mrozowicz 		.dev_configure		= openssl_pmd_config,
12118a9867a6SSlawomir Mrozowicz 		.dev_start		= openssl_pmd_start,
12128a9867a6SSlawomir Mrozowicz 		.dev_stop		= openssl_pmd_stop,
12138a9867a6SSlawomir Mrozowicz 		.dev_close		= openssl_pmd_close,
12148a9867a6SSlawomir Mrozowicz 
12158a9867a6SSlawomir Mrozowicz 		.stats_get		= openssl_pmd_stats_get,
12168a9867a6SSlawomir Mrozowicz 		.stats_reset		= openssl_pmd_stats_reset,
12178a9867a6SSlawomir Mrozowicz 
12188a9867a6SSlawomir Mrozowicz 		.dev_infos_get		= openssl_pmd_info_get,
12198a9867a6SSlawomir Mrozowicz 
12208a9867a6SSlawomir Mrozowicz 		.queue_pair_setup	= openssl_pmd_qp_setup,
12218a9867a6SSlawomir Mrozowicz 		.queue_pair_release	= openssl_pmd_qp_release,
12228a9867a6SSlawomir Mrozowicz 
1223012c5076SPablo de Lara 		.sym_session_get_size	= openssl_pmd_sym_session_get_size,
12243e9d6bd4SSunila Sahu 		.asym_session_get_size	= openssl_pmd_asym_session_get_size,
1225012c5076SPablo de Lara 		.sym_session_configure	= openssl_pmd_sym_session_configure,
12263e9d6bd4SSunila Sahu 		.asym_session_configure	= openssl_pmd_asym_session_configure,
12273e9d6bd4SSunila Sahu 		.sym_session_clear	= openssl_pmd_sym_session_clear,
12283e9d6bd4SSunila Sahu 		.asym_session_clear	= openssl_pmd_asym_session_clear
12298a9867a6SSlawomir Mrozowicz };
12308a9867a6SSlawomir Mrozowicz 
12318a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops *rte_openssl_pmd_ops = &openssl_pmd_ops;
1232