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" 123e9d6bd4SSunila 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 = { 29*c3d22a65SDmitry Eremin-Solenikov .min = 1, 308a9867a6SSlawomir Mrozowicz .max = 16, 31*c3d22a65SDmitry Eremin-Solenikov .increment = 1 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 = { 71*c3d22a65SDmitry Eremin-Solenikov .min = 1, 728a9867a6SSlawomir Mrozowicz .max = 20, 73*c3d22a65SDmitry Eremin-Solenikov .increment = 1 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 = { 113*c3d22a65SDmitry Eremin-Solenikov .min = 1, 1148a9867a6SSlawomir Mrozowicz .max = 28, 115*c3d22a65SDmitry Eremin-Solenikov .increment = 1 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 = { 134*c3d22a65SDmitry Eremin-Solenikov .min = 1, 1358a9867a6SSlawomir Mrozowicz .max = 28, 136*c3d22a65SDmitry Eremin-Solenikov .increment = 1 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 = { 155*c3d22a65SDmitry Eremin-Solenikov .min = 1, 1568a9867a6SSlawomir Mrozowicz .max = 32, 157*c3d22a65SDmitry Eremin-Solenikov .increment = 1 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 = { 197*c3d22a65SDmitry Eremin-Solenikov .min = 1, 1988a9867a6SSlawomir Mrozowicz .max = 48, 199*c3d22a65SDmitry Eremin-Solenikov .increment = 1 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 = { 239*c3d22a65SDmitry Eremin-Solenikov .min = 1, 2408a9867a6SSlawomir Mrozowicz .max = 64, 241*c3d22a65SDmitry Eremin-Solenikov .increment = 1 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 }, 4733e9d6bd4SSunila Sahu { /* RSA */ 4743e9d6bd4SSunila Sahu .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC, 4753e9d6bd4SSunila Sahu {.asym = { 4763e9d6bd4SSunila Sahu .xform_capa = { 4773e9d6bd4SSunila Sahu .xform_type = RTE_CRYPTO_ASYM_XFORM_RSA, 4783e9d6bd4SSunila Sahu .op_types = ((1 << RTE_CRYPTO_ASYM_OP_SIGN) | 4793e9d6bd4SSunila Sahu (1 << RTE_CRYPTO_ASYM_OP_VERIFY) | 4803e9d6bd4SSunila Sahu (1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) | 4813e9d6bd4SSunila Sahu (1 << RTE_CRYPTO_ASYM_OP_DECRYPT)), 4823e9d6bd4SSunila Sahu { 4833e9d6bd4SSunila Sahu .modlen = { 4843e9d6bd4SSunila Sahu /* min length is based on openssl rsa keygen */ 4853e9d6bd4SSunila Sahu .min = 30, 4863e9d6bd4SSunila Sahu /* value 0 symbolizes no limit on max length */ 4873e9d6bd4SSunila Sahu .max = 0, 4883e9d6bd4SSunila Sahu .increment = 1 4893e9d6bd4SSunila Sahu }, } 4903e9d6bd4SSunila Sahu } 4913e9d6bd4SSunila Sahu }, 4923e9d6bd4SSunila Sahu } 4933e9d6bd4SSunila Sahu }, 4943e9d6bd4SSunila Sahu { /* modexp */ 4953e9d6bd4SSunila Sahu .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC, 4963e9d6bd4SSunila Sahu {.asym = { 4973e9d6bd4SSunila Sahu .xform_capa = { 4983e9d6bd4SSunila Sahu .xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX, 4993e9d6bd4SSunila Sahu .op_types = 0, 5003e9d6bd4SSunila Sahu { 5013e9d6bd4SSunila Sahu .modlen = { 5023e9d6bd4SSunila Sahu /* value 0 symbolizes no limit on min length */ 5033e9d6bd4SSunila Sahu .min = 0, 5043e9d6bd4SSunila Sahu /* value 0 symbolizes no limit on max length */ 5053e9d6bd4SSunila Sahu .max = 0, 5063e9d6bd4SSunila Sahu .increment = 1 5073e9d6bd4SSunila Sahu }, } 5083e9d6bd4SSunila Sahu } 5093e9d6bd4SSunila Sahu }, 5103e9d6bd4SSunila Sahu } 5113e9d6bd4SSunila Sahu }, 5123e9d6bd4SSunila Sahu { /* modinv */ 5133e9d6bd4SSunila Sahu .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC, 5143e9d6bd4SSunila Sahu {.asym = { 5153e9d6bd4SSunila Sahu .xform_capa = { 5163e9d6bd4SSunila Sahu .xform_type = RTE_CRYPTO_ASYM_XFORM_MODINV, 5173e9d6bd4SSunila Sahu .op_types = 0, 5183e9d6bd4SSunila Sahu { 5193e9d6bd4SSunila Sahu .modlen = { 5203e9d6bd4SSunila Sahu /* value 0 symbolizes no limit on min length */ 5213e9d6bd4SSunila Sahu .min = 0, 5223e9d6bd4SSunila Sahu /* value 0 symbolizes no limit on max length */ 5233e9d6bd4SSunila Sahu .max = 0, 5243e9d6bd4SSunila Sahu .increment = 1 5253e9d6bd4SSunila Sahu }, } 5263e9d6bd4SSunila Sahu } 5273e9d6bd4SSunila Sahu }, 5283e9d6bd4SSunila Sahu } 5293e9d6bd4SSunila Sahu }, 530ac42813aSSunila Sahu { /* dh */ 531ac42813aSSunila Sahu .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC, 532ac42813aSSunila Sahu {.asym = { 533ac42813aSSunila Sahu .xform_capa = { 534ac42813aSSunila Sahu .xform_type = RTE_CRYPTO_ASYM_XFORM_DH, 535ac42813aSSunila Sahu .op_types = 536ac42813aSSunila Sahu ((1<<RTE_CRYPTO_ASYM_OP_PRIVATE_KEY_GENERATE) | 537ac42813aSSunila Sahu (1 << RTE_CRYPTO_ASYM_OP_PUBLIC_KEY_GENERATE | 538ac42813aSSunila Sahu (1 << 539ac42813aSSunila Sahu RTE_CRYPTO_ASYM_OP_SHARED_SECRET_COMPUTE))), 540ac42813aSSunila Sahu { 541ac42813aSSunila Sahu .modlen = { 542ac42813aSSunila Sahu /* value 0 symbolizes no limit on min length */ 543ac42813aSSunila Sahu .min = 0, 544ac42813aSSunila Sahu /* value 0 symbolizes no limit on max length */ 545ac42813aSSunila Sahu .max = 0, 546ac42813aSSunila Sahu .increment = 1 547ac42813aSSunila Sahu }, } 548ac42813aSSunila Sahu } 549ac42813aSSunila Sahu }, 550ac42813aSSunila Sahu } 551ac42813aSSunila Sahu }, 552ac42813aSSunila Sahu { /* dsa */ 553ac42813aSSunila Sahu .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC, 554ac42813aSSunila Sahu {.asym = { 555ac42813aSSunila Sahu .xform_capa = { 556ac42813aSSunila Sahu .xform_type = RTE_CRYPTO_ASYM_XFORM_DSA, 557ac42813aSSunila Sahu .op_types = 558ac42813aSSunila Sahu ((1<<RTE_CRYPTO_ASYM_OP_SIGN) | 559ac42813aSSunila Sahu (1 << RTE_CRYPTO_ASYM_OP_VERIFY)), 560ac42813aSSunila Sahu { 561ac42813aSSunila Sahu .modlen = { 562ac42813aSSunila Sahu /* value 0 symbolizes no limit on min length */ 563ac42813aSSunila Sahu .min = 0, 564ac42813aSSunila Sahu /* value 0 symbolizes no limit on max length */ 565ac42813aSSunila Sahu .max = 0, 566ac42813aSSunila Sahu .increment = 1 567ac42813aSSunila Sahu }, } 568ac42813aSSunila Sahu } 569ac42813aSSunila Sahu }, 570ac42813aSSunila Sahu } 571ac42813aSSunila Sahu }, 5728a9867a6SSlawomir Mrozowicz 5738a9867a6SSlawomir Mrozowicz RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() 5748a9867a6SSlawomir Mrozowicz }; 5758a9867a6SSlawomir Mrozowicz 5768a9867a6SSlawomir Mrozowicz 5778a9867a6SSlawomir Mrozowicz /** Configure device */ 5788a9867a6SSlawomir Mrozowicz static int 57960e686c2SFan Zhang openssl_pmd_config(__rte_unused struct rte_cryptodev *dev, 58060e686c2SFan Zhang __rte_unused struct rte_cryptodev_config *config) 5818a9867a6SSlawomir Mrozowicz { 5828a9867a6SSlawomir Mrozowicz return 0; 5838a9867a6SSlawomir Mrozowicz } 5848a9867a6SSlawomir Mrozowicz 5858a9867a6SSlawomir Mrozowicz /** Start device */ 5868a9867a6SSlawomir Mrozowicz static int 5878a9867a6SSlawomir Mrozowicz openssl_pmd_start(__rte_unused struct rte_cryptodev *dev) 5888a9867a6SSlawomir Mrozowicz { 5898a9867a6SSlawomir Mrozowicz return 0; 5908a9867a6SSlawomir Mrozowicz } 5918a9867a6SSlawomir Mrozowicz 5928a9867a6SSlawomir Mrozowicz /** Stop device */ 5938a9867a6SSlawomir Mrozowicz static void 5948a9867a6SSlawomir Mrozowicz openssl_pmd_stop(__rte_unused struct rte_cryptodev *dev) 5958a9867a6SSlawomir Mrozowicz { 5968a9867a6SSlawomir Mrozowicz } 5978a9867a6SSlawomir Mrozowicz 5988a9867a6SSlawomir Mrozowicz /** Close device */ 5998a9867a6SSlawomir Mrozowicz static int 6008a9867a6SSlawomir Mrozowicz openssl_pmd_close(__rte_unused struct rte_cryptodev *dev) 6018a9867a6SSlawomir Mrozowicz { 6028a9867a6SSlawomir Mrozowicz return 0; 6038a9867a6SSlawomir Mrozowicz } 6048a9867a6SSlawomir Mrozowicz 6058a9867a6SSlawomir Mrozowicz 6068a9867a6SSlawomir Mrozowicz /** Get device statistics */ 6078a9867a6SSlawomir Mrozowicz static void 6088a9867a6SSlawomir Mrozowicz openssl_pmd_stats_get(struct rte_cryptodev *dev, 6098a9867a6SSlawomir Mrozowicz struct rte_cryptodev_stats *stats) 6108a9867a6SSlawomir Mrozowicz { 6118a9867a6SSlawomir Mrozowicz int qp_id; 6128a9867a6SSlawomir Mrozowicz 6138a9867a6SSlawomir Mrozowicz for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) { 6148a9867a6SSlawomir Mrozowicz struct openssl_qp *qp = dev->data->queue_pairs[qp_id]; 6158a9867a6SSlawomir Mrozowicz 6168a9867a6SSlawomir Mrozowicz stats->enqueued_count += qp->stats.enqueued_count; 6178a9867a6SSlawomir Mrozowicz stats->dequeued_count += qp->stats.dequeued_count; 6188a9867a6SSlawomir Mrozowicz 6198a9867a6SSlawomir Mrozowicz stats->enqueue_err_count += qp->stats.enqueue_err_count; 6208a9867a6SSlawomir Mrozowicz stats->dequeue_err_count += qp->stats.dequeue_err_count; 6218a9867a6SSlawomir Mrozowicz } 6228a9867a6SSlawomir Mrozowicz } 6238a9867a6SSlawomir Mrozowicz 6248a9867a6SSlawomir Mrozowicz /** Reset device statistics */ 6258a9867a6SSlawomir Mrozowicz static void 6268a9867a6SSlawomir Mrozowicz openssl_pmd_stats_reset(struct rte_cryptodev *dev) 6278a9867a6SSlawomir Mrozowicz { 6288a9867a6SSlawomir Mrozowicz int qp_id; 6298a9867a6SSlawomir Mrozowicz 6308a9867a6SSlawomir Mrozowicz for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) { 6318a9867a6SSlawomir Mrozowicz struct openssl_qp *qp = dev->data->queue_pairs[qp_id]; 6328a9867a6SSlawomir Mrozowicz 6338a9867a6SSlawomir Mrozowicz memset(&qp->stats, 0, sizeof(qp->stats)); 6348a9867a6SSlawomir Mrozowicz } 6358a9867a6SSlawomir Mrozowicz } 6368a9867a6SSlawomir Mrozowicz 6378a9867a6SSlawomir Mrozowicz 6388a9867a6SSlawomir Mrozowicz /** Get device info */ 6398a9867a6SSlawomir Mrozowicz static void 6408a9867a6SSlawomir Mrozowicz openssl_pmd_info_get(struct rte_cryptodev *dev, 6418a9867a6SSlawomir Mrozowicz struct rte_cryptodev_info *dev_info) 6428a9867a6SSlawomir Mrozowicz { 6438a9867a6SSlawomir Mrozowicz struct openssl_private *internals = dev->data->dev_private; 6448a9867a6SSlawomir Mrozowicz 6458a9867a6SSlawomir Mrozowicz if (dev_info != NULL) { 6467a364faeSSlawomir Mrozowicz dev_info->driver_id = dev->driver_id; 6478a9867a6SSlawomir Mrozowicz dev_info->feature_flags = dev->feature_flags; 6488a9867a6SSlawomir Mrozowicz dev_info->capabilities = openssl_pmd_capabilities; 6498a9867a6SSlawomir Mrozowicz dev_info->max_nb_queue_pairs = internals->max_nb_qpairs; 650e1fc5b76SPablo de Lara /* No limit of number of sessions */ 651e1fc5b76SPablo de Lara dev_info->sym.max_nb_sessions = 0; 6528a9867a6SSlawomir Mrozowicz } 6538a9867a6SSlawomir Mrozowicz } 6548a9867a6SSlawomir Mrozowicz 6558a9867a6SSlawomir Mrozowicz /** Release queue pair */ 6568a9867a6SSlawomir Mrozowicz static int 6578a9867a6SSlawomir Mrozowicz openssl_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id) 6588a9867a6SSlawomir Mrozowicz { 6598a9867a6SSlawomir Mrozowicz if (dev->data->queue_pairs[qp_id] != NULL) { 6608a9867a6SSlawomir Mrozowicz rte_free(dev->data->queue_pairs[qp_id]); 6618a9867a6SSlawomir Mrozowicz dev->data->queue_pairs[qp_id] = NULL; 6628a9867a6SSlawomir Mrozowicz } 6638a9867a6SSlawomir Mrozowicz return 0; 6648a9867a6SSlawomir Mrozowicz } 6658a9867a6SSlawomir Mrozowicz 6668a9867a6SSlawomir Mrozowicz /** set a unique name for the queue pair based on it's name, dev_id and qp_id */ 6678a9867a6SSlawomir Mrozowicz static int 6688a9867a6SSlawomir Mrozowicz openssl_pmd_qp_set_unique_name(struct rte_cryptodev *dev, 6698a9867a6SSlawomir Mrozowicz struct openssl_qp *qp) 6708a9867a6SSlawomir Mrozowicz { 6718a9867a6SSlawomir Mrozowicz unsigned int n = snprintf(qp->name, sizeof(qp->name), 6728a9867a6SSlawomir Mrozowicz "openssl_pmd_%u_qp_%u", 6738a9867a6SSlawomir Mrozowicz dev->data->dev_id, qp->id); 6748a9867a6SSlawomir Mrozowicz 6756ab25e63STomasz Duszynski if (n >= sizeof(qp->name)) 6768a9867a6SSlawomir Mrozowicz return -1; 6778a9867a6SSlawomir Mrozowicz 6788a9867a6SSlawomir Mrozowicz return 0; 6798a9867a6SSlawomir Mrozowicz } 6808a9867a6SSlawomir Mrozowicz 6818a9867a6SSlawomir Mrozowicz 6828a9867a6SSlawomir Mrozowicz /** Create a ring to place processed operations on */ 6838a9867a6SSlawomir Mrozowicz static struct rte_ring * 6848a9867a6SSlawomir Mrozowicz openssl_pmd_qp_create_processed_ops_ring(struct openssl_qp *qp, 6858a9867a6SSlawomir Mrozowicz unsigned int ring_size, int socket_id) 6868a9867a6SSlawomir Mrozowicz { 6878a9867a6SSlawomir Mrozowicz struct rte_ring *r; 6888a9867a6SSlawomir Mrozowicz 6898a9867a6SSlawomir Mrozowicz r = rte_ring_lookup(qp->name); 6908a9867a6SSlawomir Mrozowicz if (r) { 691636e7392SBruce Richardson if (rte_ring_get_size(r) >= ring_size) { 692094b2386SNaga Suresh Somarowthu OPENSSL_LOG(INFO, 6938a9867a6SSlawomir Mrozowicz "Reusing existing ring %s for processed ops", 6948a9867a6SSlawomir Mrozowicz qp->name); 6958a9867a6SSlawomir Mrozowicz return r; 6968a9867a6SSlawomir Mrozowicz } 6978a9867a6SSlawomir Mrozowicz 698094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, 6998a9867a6SSlawomir Mrozowicz "Unable to reuse existing ring %s for processed ops", 7008a9867a6SSlawomir Mrozowicz qp->name); 7018a9867a6SSlawomir Mrozowicz return NULL; 7028a9867a6SSlawomir Mrozowicz } 7038a9867a6SSlawomir Mrozowicz 7048a9867a6SSlawomir Mrozowicz return rte_ring_create(qp->name, ring_size, socket_id, 7058a9867a6SSlawomir Mrozowicz RING_F_SP_ENQ | RING_F_SC_DEQ); 7068a9867a6SSlawomir Mrozowicz } 7078a9867a6SSlawomir Mrozowicz 7088a9867a6SSlawomir Mrozowicz 7098a9867a6SSlawomir Mrozowicz /** Setup a queue pair */ 7108a9867a6SSlawomir Mrozowicz static int 7118a9867a6SSlawomir Mrozowicz openssl_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id, 7128a9867a6SSlawomir Mrozowicz const struct rte_cryptodev_qp_conf *qp_conf, 713f7db6f82SPablo de Lara int socket_id, struct rte_mempool *session_pool) 7148a9867a6SSlawomir Mrozowicz { 7158a9867a6SSlawomir Mrozowicz struct openssl_qp *qp = NULL; 7168a9867a6SSlawomir Mrozowicz 7178a9867a6SSlawomir Mrozowicz /* Free memory prior to re-allocation if needed. */ 7188a9867a6SSlawomir Mrozowicz if (dev->data->queue_pairs[qp_id] != NULL) 7198a9867a6SSlawomir Mrozowicz openssl_pmd_qp_release(dev, qp_id); 7208a9867a6SSlawomir Mrozowicz 7218a9867a6SSlawomir Mrozowicz /* Allocate the queue pair data structure. */ 7228a9867a6SSlawomir Mrozowicz qp = rte_zmalloc_socket("OPENSSL PMD Queue Pair", sizeof(*qp), 7238a9867a6SSlawomir Mrozowicz RTE_CACHE_LINE_SIZE, socket_id); 7248a9867a6SSlawomir Mrozowicz if (qp == NULL) 7258a9867a6SSlawomir Mrozowicz return -ENOMEM; 7268a9867a6SSlawomir Mrozowicz 7278a9867a6SSlawomir Mrozowicz qp->id = qp_id; 7288a9867a6SSlawomir Mrozowicz dev->data->queue_pairs[qp_id] = qp; 7298a9867a6SSlawomir Mrozowicz 7308a9867a6SSlawomir Mrozowicz if (openssl_pmd_qp_set_unique_name(dev, qp)) 7318a9867a6SSlawomir Mrozowicz goto qp_setup_cleanup; 7328a9867a6SSlawomir Mrozowicz 7338a9867a6SSlawomir Mrozowicz qp->processed_ops = openssl_pmd_qp_create_processed_ops_ring(qp, 7348a9867a6SSlawomir Mrozowicz qp_conf->nb_descriptors, socket_id); 7358a9867a6SSlawomir Mrozowicz if (qp->processed_ops == NULL) 7368a9867a6SSlawomir Mrozowicz goto qp_setup_cleanup; 7378a9867a6SSlawomir Mrozowicz 738f7db6f82SPablo de Lara qp->sess_mp = session_pool; 7398a9867a6SSlawomir Mrozowicz 7408a9867a6SSlawomir Mrozowicz memset(&qp->stats, 0, sizeof(qp->stats)); 7418a9867a6SSlawomir Mrozowicz 7428a9867a6SSlawomir Mrozowicz return 0; 7438a9867a6SSlawomir Mrozowicz 7448a9867a6SSlawomir Mrozowicz qp_setup_cleanup: 7458a9867a6SSlawomir Mrozowicz if (qp) 7468a9867a6SSlawomir Mrozowicz rte_free(qp); 7478a9867a6SSlawomir Mrozowicz 7488a9867a6SSlawomir Mrozowicz return -1; 7498a9867a6SSlawomir Mrozowicz } 7508a9867a6SSlawomir Mrozowicz 7518a9867a6SSlawomir Mrozowicz /** Return the number of allocated queue pairs */ 7528a9867a6SSlawomir Mrozowicz static uint32_t 7538a9867a6SSlawomir Mrozowicz openssl_pmd_qp_count(struct rte_cryptodev *dev) 7548a9867a6SSlawomir Mrozowicz { 7558a9867a6SSlawomir Mrozowicz return dev->data->nb_queue_pairs; 7568a9867a6SSlawomir Mrozowicz } 7578a9867a6SSlawomir Mrozowicz 7583e9d6bd4SSunila Sahu /** Returns the size of the symmetric session structure */ 7598a9867a6SSlawomir Mrozowicz static unsigned 760012c5076SPablo de Lara openssl_pmd_sym_session_get_size(struct rte_cryptodev *dev __rte_unused) 7618a9867a6SSlawomir Mrozowicz { 7628a9867a6SSlawomir Mrozowicz return sizeof(struct openssl_session); 7638a9867a6SSlawomir Mrozowicz } 7648a9867a6SSlawomir Mrozowicz 7653e9d6bd4SSunila Sahu /** Returns the size of the asymmetric session structure */ 7663e9d6bd4SSunila Sahu static unsigned 7673e9d6bd4SSunila Sahu openssl_pmd_asym_session_get_size(struct rte_cryptodev *dev __rte_unused) 7683e9d6bd4SSunila Sahu { 7693e9d6bd4SSunila Sahu return sizeof(struct openssl_asym_session); 7703e9d6bd4SSunila Sahu } 7713e9d6bd4SSunila Sahu 7728a9867a6SSlawomir Mrozowicz /** Configure the session from a crypto xform chain */ 773b3bbd9e5SSlawomir Mrozowicz static int 774012c5076SPablo de Lara openssl_pmd_sym_session_configure(struct rte_cryptodev *dev __rte_unused, 775b3bbd9e5SSlawomir Mrozowicz struct rte_crypto_sym_xform *xform, 776b3bbd9e5SSlawomir Mrozowicz struct rte_cryptodev_sym_session *sess, 777b3bbd9e5SSlawomir Mrozowicz struct rte_mempool *mempool) 7788a9867a6SSlawomir Mrozowicz { 779b3bbd9e5SSlawomir Mrozowicz void *sess_private_data; 78027391b53SPablo de Lara int ret; 781b3bbd9e5SSlawomir Mrozowicz 7828a9867a6SSlawomir Mrozowicz if (unlikely(sess == NULL)) { 783094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "invalid session struct"); 78427391b53SPablo de Lara return -EINVAL; 785b3bbd9e5SSlawomir Mrozowicz } 786b3bbd9e5SSlawomir Mrozowicz 787b3bbd9e5SSlawomir Mrozowicz if (rte_mempool_get(mempool, &sess_private_data)) { 788094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, 789b3bbd9e5SSlawomir Mrozowicz "Couldn't get object from session mempool"); 79027391b53SPablo de Lara return -ENOMEM; 7918a9867a6SSlawomir Mrozowicz } 7928a9867a6SSlawomir Mrozowicz 79327391b53SPablo de Lara ret = openssl_set_session_parameters(sess_private_data, xform); 79427391b53SPablo de Lara if (ret != 0) { 795094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "failed configure session parameters"); 796b3bbd9e5SSlawomir Mrozowicz 797b3bbd9e5SSlawomir Mrozowicz /* Return session to mempool */ 798b3bbd9e5SSlawomir Mrozowicz rte_mempool_put(mempool, sess_private_data); 79927391b53SPablo de Lara return ret; 8008a9867a6SSlawomir Mrozowicz } 8018a9867a6SSlawomir Mrozowicz 802012c5076SPablo de Lara set_sym_session_private_data(sess, dev->driver_id, 803b3bbd9e5SSlawomir Mrozowicz sess_private_data); 804b3bbd9e5SSlawomir Mrozowicz 805b3bbd9e5SSlawomir Mrozowicz return 0; 8068a9867a6SSlawomir Mrozowicz } 8078a9867a6SSlawomir Mrozowicz 8083e9d6bd4SSunila Sahu static int openssl_set_asym_session_parameters( 8093e9d6bd4SSunila Sahu struct openssl_asym_session *asym_session, 8103e9d6bd4SSunila Sahu struct rte_crypto_asym_xform *xform) 8113e9d6bd4SSunila Sahu { 8123e9d6bd4SSunila Sahu int ret = 0; 8133e9d6bd4SSunila Sahu 814ac42813aSSunila Sahu if ((xform->xform_type != RTE_CRYPTO_ASYM_XFORM_DH) && 815ac42813aSSunila Sahu (xform->next != NULL)) { 8163e9d6bd4SSunila Sahu OPENSSL_LOG(ERR, "chained xfrms are not supported on %s", 8173e9d6bd4SSunila Sahu rte_crypto_asym_xform_strings[xform->xform_type]); 8183e9d6bd4SSunila Sahu return -1; 8193e9d6bd4SSunila Sahu } 8203e9d6bd4SSunila Sahu 8213e9d6bd4SSunila Sahu switch (xform->xform_type) { 8223e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_XFORM_RSA: 8233e9d6bd4SSunila Sahu { 8243e9d6bd4SSunila Sahu BIGNUM *n = NULL; 8253e9d6bd4SSunila Sahu BIGNUM *e = NULL; 8263e9d6bd4SSunila Sahu BIGNUM *d = NULL; 8273e9d6bd4SSunila Sahu BIGNUM *p = NULL, *q = NULL, *dmp1 = NULL; 8283e9d6bd4SSunila Sahu BIGNUM *iqmp = NULL, *dmq1 = NULL; 8293e9d6bd4SSunila Sahu 8303e9d6bd4SSunila Sahu /* copy xfrm data into rsa struct */ 8313e9d6bd4SSunila Sahu n = BN_bin2bn((const unsigned char *)xform->rsa.n.data, 8323e9d6bd4SSunila Sahu xform->rsa.n.length, n); 8333e9d6bd4SSunila Sahu e = BN_bin2bn((const unsigned char *)xform->rsa.e.data, 8343e9d6bd4SSunila Sahu xform->rsa.e.length, e); 8353e9d6bd4SSunila Sahu 8363e9d6bd4SSunila Sahu if (!n || !e) 8373e9d6bd4SSunila Sahu goto err_rsa; 8383e9d6bd4SSunila Sahu 8393e9d6bd4SSunila Sahu RSA *rsa = RSA_new(); 8403e9d6bd4SSunila Sahu if (rsa == NULL) 8413e9d6bd4SSunila Sahu goto err_rsa; 8423e9d6bd4SSunila Sahu 8433e9d6bd4SSunila Sahu if (xform->rsa.key_type == RTE_RSA_KEY_TYPE_EXP) { 8443e9d6bd4SSunila Sahu d = BN_bin2bn( 8453e9d6bd4SSunila Sahu (const unsigned char *)xform->rsa.d.data, 8463e9d6bd4SSunila Sahu xform->rsa.d.length, 8473e9d6bd4SSunila Sahu d); 8483e9d6bd4SSunila Sahu if (!d) { 8493e9d6bd4SSunila Sahu RSA_free(rsa); 8503e9d6bd4SSunila Sahu goto err_rsa; 8513e9d6bd4SSunila Sahu } 8523e9d6bd4SSunila Sahu } else { 8533e9d6bd4SSunila Sahu p = BN_bin2bn((const unsigned char *) 8543e9d6bd4SSunila Sahu xform->rsa.qt.p.data, 8553e9d6bd4SSunila Sahu xform->rsa.qt.p.length, 8563e9d6bd4SSunila Sahu p); 8573e9d6bd4SSunila Sahu q = BN_bin2bn((const unsigned char *) 8583e9d6bd4SSunila Sahu xform->rsa.qt.q.data, 8593e9d6bd4SSunila Sahu xform->rsa.qt.q.length, 8603e9d6bd4SSunila Sahu q); 8613e9d6bd4SSunila Sahu dmp1 = BN_bin2bn((const unsigned char *) 8623e9d6bd4SSunila Sahu xform->rsa.qt.dP.data, 8633e9d6bd4SSunila Sahu xform->rsa.qt.dP.length, 8643e9d6bd4SSunila Sahu dmp1); 8653e9d6bd4SSunila Sahu dmq1 = BN_bin2bn((const unsigned char *) 8663e9d6bd4SSunila Sahu xform->rsa.qt.dQ.data, 8673e9d6bd4SSunila Sahu xform->rsa.qt.dQ.length, 8683e9d6bd4SSunila Sahu dmq1); 8693e9d6bd4SSunila Sahu iqmp = BN_bin2bn((const unsigned char *) 8703e9d6bd4SSunila Sahu xform->rsa.qt.qInv.data, 8713e9d6bd4SSunila Sahu xform->rsa.qt.qInv.length, 8723e9d6bd4SSunila Sahu iqmp); 8733e9d6bd4SSunila Sahu 8743e9d6bd4SSunila Sahu if (!p || !q || !dmp1 || !dmq1 || !iqmp) { 8753e9d6bd4SSunila Sahu RSA_free(rsa); 8763e9d6bd4SSunila Sahu goto err_rsa; 8773e9d6bd4SSunila Sahu } 8780b5284adSAshish Gupta ret = set_rsa_params(rsa, p, q); 8793e9d6bd4SSunila Sahu if (ret) { 8803e9d6bd4SSunila Sahu OPENSSL_LOG(ERR, 8813e9d6bd4SSunila Sahu "failed to set rsa params\n"); 8823e9d6bd4SSunila Sahu RSA_free(rsa); 8833e9d6bd4SSunila Sahu goto err_rsa; 8843e9d6bd4SSunila Sahu } 8850b5284adSAshish Gupta ret = set_rsa_crt_params(rsa, dmp1, dmq1, iqmp); 8863e9d6bd4SSunila Sahu if (ret) { 8873e9d6bd4SSunila Sahu OPENSSL_LOG(ERR, 8883e9d6bd4SSunila Sahu "failed to set crt params\n"); 8893e9d6bd4SSunila Sahu RSA_free(rsa); 8903e9d6bd4SSunila Sahu /* 8913e9d6bd4SSunila Sahu * set already populated params to NULL 8923e9d6bd4SSunila Sahu * as its freed by call to RSA_free 8933e9d6bd4SSunila Sahu */ 8943e9d6bd4SSunila Sahu p = q = NULL; 8953e9d6bd4SSunila Sahu goto err_rsa; 8963e9d6bd4SSunila Sahu } 8973e9d6bd4SSunila Sahu } 8983e9d6bd4SSunila Sahu 8990b5284adSAshish Gupta ret = set_rsa_keys(rsa, n, e, d); 9003e9d6bd4SSunila Sahu if (ret) { 9013e9d6bd4SSunila Sahu OPENSSL_LOG(ERR, "Failed to load rsa keys\n"); 9023e9d6bd4SSunila Sahu RSA_free(rsa); 9033e9d6bd4SSunila Sahu return -1; 9043e9d6bd4SSunila Sahu } 9053e9d6bd4SSunila Sahu asym_session->u.r.rsa = rsa; 9063e9d6bd4SSunila Sahu asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_RSA; 9073e9d6bd4SSunila Sahu break; 9083e9d6bd4SSunila Sahu err_rsa: 9093e9d6bd4SSunila Sahu if (n) 9103e9d6bd4SSunila Sahu BN_free(n); 9113e9d6bd4SSunila Sahu if (e) 9123e9d6bd4SSunila Sahu BN_free(e); 9133e9d6bd4SSunila Sahu if (d) 9143e9d6bd4SSunila Sahu BN_free(d); 9153e9d6bd4SSunila Sahu if (p) 9163e9d6bd4SSunila Sahu BN_free(p); 9173e9d6bd4SSunila Sahu if (q) 9183e9d6bd4SSunila Sahu BN_free(q); 9193e9d6bd4SSunila Sahu if (dmp1) 9203e9d6bd4SSunila Sahu BN_free(dmp1); 9213e9d6bd4SSunila Sahu if (dmq1) 9223e9d6bd4SSunila Sahu BN_free(dmq1); 9233e9d6bd4SSunila Sahu if (iqmp) 9243e9d6bd4SSunila Sahu BN_free(iqmp); 9253e9d6bd4SSunila Sahu 9263e9d6bd4SSunila Sahu return -1; 9273e9d6bd4SSunila Sahu } 9283e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_XFORM_MODEX: 9293e9d6bd4SSunila Sahu { 9303e9d6bd4SSunila Sahu struct rte_crypto_modex_xform *xfrm = &(xform->modex); 9313e9d6bd4SSunila Sahu 9323e9d6bd4SSunila Sahu BN_CTX *ctx = BN_CTX_new(); 9333e9d6bd4SSunila Sahu if (ctx == NULL) { 9343e9d6bd4SSunila Sahu OPENSSL_LOG(ERR, 9353e9d6bd4SSunila Sahu " failed to allocate resources\n"); 9363e9d6bd4SSunila Sahu return -1; 9373e9d6bd4SSunila Sahu } 9383e9d6bd4SSunila Sahu BN_CTX_start(ctx); 9393e9d6bd4SSunila Sahu BIGNUM *mod = BN_CTX_get(ctx); 9403e9d6bd4SSunila Sahu BIGNUM *exp = BN_CTX_get(ctx); 9413e9d6bd4SSunila Sahu if (mod == NULL || exp == NULL) { 9423e9d6bd4SSunila Sahu BN_CTX_end(ctx); 9433e9d6bd4SSunila Sahu BN_CTX_free(ctx); 9443e9d6bd4SSunila Sahu return -1; 9453e9d6bd4SSunila Sahu } 9463e9d6bd4SSunila Sahu 9473e9d6bd4SSunila Sahu mod = BN_bin2bn((const unsigned char *) 9483e9d6bd4SSunila Sahu xfrm->modulus.data, 9493e9d6bd4SSunila Sahu xfrm->modulus.length, mod); 9503e9d6bd4SSunila Sahu exp = BN_bin2bn((const unsigned char *) 9513e9d6bd4SSunila Sahu xfrm->exponent.data, 9523e9d6bd4SSunila Sahu xfrm->exponent.length, exp); 9533e9d6bd4SSunila Sahu asym_session->u.e.ctx = ctx; 9543e9d6bd4SSunila Sahu asym_session->u.e.mod = mod; 9553e9d6bd4SSunila Sahu asym_session->u.e.exp = exp; 9563e9d6bd4SSunila Sahu asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODEX; 9573e9d6bd4SSunila Sahu break; 9583e9d6bd4SSunila Sahu } 9593e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_XFORM_MODINV: 9603e9d6bd4SSunila Sahu { 9613e9d6bd4SSunila Sahu struct rte_crypto_modinv_xform *xfrm = &(xform->modinv); 9623e9d6bd4SSunila Sahu 9633e9d6bd4SSunila Sahu BN_CTX *ctx = BN_CTX_new(); 9643e9d6bd4SSunila Sahu if (ctx == NULL) { 9653e9d6bd4SSunila Sahu OPENSSL_LOG(ERR, 9663e9d6bd4SSunila Sahu " failed to allocate resources\n"); 9673e9d6bd4SSunila Sahu return -1; 9683e9d6bd4SSunila Sahu } 9693e9d6bd4SSunila Sahu BN_CTX_start(ctx); 9703e9d6bd4SSunila Sahu BIGNUM *mod = BN_CTX_get(ctx); 9713e9d6bd4SSunila Sahu if (mod == NULL) { 9723e9d6bd4SSunila Sahu BN_CTX_end(ctx); 9733e9d6bd4SSunila Sahu BN_CTX_free(ctx); 9743e9d6bd4SSunila Sahu return -1; 9753e9d6bd4SSunila Sahu } 9763e9d6bd4SSunila Sahu 9773e9d6bd4SSunila Sahu mod = BN_bin2bn((const unsigned char *) 9783e9d6bd4SSunila Sahu xfrm->modulus.data, 9793e9d6bd4SSunila Sahu xfrm->modulus.length, 9803e9d6bd4SSunila Sahu mod); 9813e9d6bd4SSunila Sahu asym_session->u.m.ctx = ctx; 9823e9d6bd4SSunila Sahu asym_session->u.m.modulus = mod; 9833e9d6bd4SSunila Sahu asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_MODINV; 9843e9d6bd4SSunila Sahu break; 9853e9d6bd4SSunila Sahu } 986ac42813aSSunila Sahu case RTE_CRYPTO_ASYM_XFORM_DH: 987ac42813aSSunila Sahu { 988ac42813aSSunila Sahu BIGNUM *p = NULL; 989ac42813aSSunila Sahu BIGNUM *g = NULL; 990ac42813aSSunila Sahu 991ac42813aSSunila Sahu p = BN_bin2bn((const unsigned char *) 992ac42813aSSunila Sahu xform->dh.p.data, 993ac42813aSSunila Sahu xform->dh.p.length, 994ac42813aSSunila Sahu p); 995ac42813aSSunila Sahu g = BN_bin2bn((const unsigned char *) 996ac42813aSSunila Sahu xform->dh.g.data, 997ac42813aSSunila Sahu xform->dh.g.length, 998ac42813aSSunila Sahu g); 999ac42813aSSunila Sahu if (!p || !g) 1000ac42813aSSunila Sahu goto err_dh; 1001ac42813aSSunila Sahu 1002ac42813aSSunila Sahu DH *dh = DH_new(); 1003ac42813aSSunila Sahu if (dh == NULL) { 1004ac42813aSSunila Sahu OPENSSL_LOG(ERR, 1005ac42813aSSunila Sahu "failed to allocate resources\n"); 1006ac42813aSSunila Sahu goto err_dh; 1007ac42813aSSunila Sahu } 10080b5284adSAshish Gupta ret = set_dh_params(dh, p, g); 1009ac42813aSSunila Sahu if (ret) { 1010ac42813aSSunila Sahu DH_free(dh); 1011ac42813aSSunila Sahu goto err_dh; 1012ac42813aSSunila Sahu } 1013ac42813aSSunila Sahu 1014ac42813aSSunila Sahu /* 1015ac42813aSSunila Sahu * setup xfrom for 1016ac42813aSSunila Sahu * public key generate, or 1017ac42813aSSunila Sahu * DH Priv key generate, or both 1018ac42813aSSunila Sahu * public and private key generate 1019ac42813aSSunila Sahu */ 1020ac42813aSSunila Sahu asym_session->u.dh.key_op = (1 << xform->dh.type); 1021ac42813aSSunila Sahu 1022ac42813aSSunila Sahu if (xform->dh.type == 1023ac42813aSSunila Sahu RTE_CRYPTO_ASYM_OP_PRIVATE_KEY_GENERATE) { 1024ac42813aSSunila Sahu /* check if next is pubkey */ 1025ac42813aSSunila Sahu if ((xform->next != NULL) && 1026ac42813aSSunila Sahu (xform->next->xform_type == 1027ac42813aSSunila Sahu RTE_CRYPTO_ASYM_XFORM_DH) && 1028ac42813aSSunila Sahu (xform->next->dh.type == 1029ac42813aSSunila Sahu RTE_CRYPTO_ASYM_OP_PUBLIC_KEY_GENERATE) 1030ac42813aSSunila Sahu ) { 1031ac42813aSSunila Sahu /* 1032ac42813aSSunila Sahu * setup op as pub/priv key 1033ac42813aSSunila Sahu * pair generationi 1034ac42813aSSunila Sahu */ 1035ac42813aSSunila Sahu asym_session->u.dh.key_op |= 1036ac42813aSSunila Sahu (1 << 1037ac42813aSSunila Sahu RTE_CRYPTO_ASYM_OP_PUBLIC_KEY_GENERATE); 1038ac42813aSSunila Sahu } 1039ac42813aSSunila Sahu } 1040ac42813aSSunila Sahu asym_session->u.dh.dh_key = dh; 1041ac42813aSSunila Sahu asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DH; 1042ac42813aSSunila Sahu break; 1043ac42813aSSunila Sahu 1044ac42813aSSunila Sahu err_dh: 1045ac42813aSSunila Sahu OPENSSL_LOG(ERR, " failed to set dh params\n"); 1046ac42813aSSunila Sahu if (p) 1047ac42813aSSunila Sahu BN_free(p); 1048ac42813aSSunila Sahu if (g) 1049ac42813aSSunila Sahu BN_free(g); 1050ac42813aSSunila Sahu return -1; 1051ac42813aSSunila Sahu } 1052ac42813aSSunila Sahu case RTE_CRYPTO_ASYM_XFORM_DSA: 1053ac42813aSSunila Sahu { 1054ac42813aSSunila Sahu BIGNUM *p = NULL, *g = NULL; 1055ac42813aSSunila Sahu BIGNUM *q = NULL, *priv_key = NULL; 1056ac42813aSSunila Sahu BIGNUM *pub_key = BN_new(); 1057ac42813aSSunila Sahu BN_zero(pub_key); 1058ac42813aSSunila Sahu 1059ac42813aSSunila Sahu p = BN_bin2bn((const unsigned char *) 1060ac42813aSSunila Sahu xform->dsa.p.data, 1061ac42813aSSunila Sahu xform->dsa.p.length, 1062ac42813aSSunila Sahu p); 1063ac42813aSSunila Sahu 1064ac42813aSSunila Sahu g = BN_bin2bn((const unsigned char *) 1065ac42813aSSunila Sahu xform->dsa.g.data, 1066ac42813aSSunila Sahu xform->dsa.g.length, 1067ac42813aSSunila Sahu g); 1068ac42813aSSunila Sahu 1069ac42813aSSunila Sahu q = BN_bin2bn((const unsigned char *) 1070ac42813aSSunila Sahu xform->dsa.q.data, 1071ac42813aSSunila Sahu xform->dsa.q.length, 1072ac42813aSSunila Sahu q); 1073ac42813aSSunila Sahu if (!p || !q || !g) 1074ac42813aSSunila Sahu goto err_dsa; 1075ac42813aSSunila Sahu 1076ac42813aSSunila Sahu priv_key = BN_bin2bn((const unsigned char *) 1077ac42813aSSunila Sahu xform->dsa.x.data, 1078ac42813aSSunila Sahu xform->dsa.x.length, 1079ac42813aSSunila Sahu priv_key); 1080ac42813aSSunila Sahu if (priv_key == NULL) 1081ac42813aSSunila Sahu goto err_dsa; 1082ac42813aSSunila Sahu 1083ac42813aSSunila Sahu DSA *dsa = DSA_new(); 1084ac42813aSSunila Sahu if (dsa == NULL) { 1085ac42813aSSunila Sahu OPENSSL_LOG(ERR, 1086ac42813aSSunila Sahu " failed to allocate resources\n"); 1087ac42813aSSunila Sahu goto err_dsa; 1088ac42813aSSunila Sahu } 1089ac42813aSSunila Sahu 10900b5284adSAshish Gupta ret = set_dsa_params(dsa, p, q, g); 1091ac42813aSSunila Sahu if (ret) { 1092ac42813aSSunila Sahu DSA_free(dsa); 1093ac42813aSSunila Sahu OPENSSL_LOG(ERR, "Failed to dsa params\n"); 1094ac42813aSSunila Sahu goto err_dsa; 1095ac42813aSSunila Sahu } 1096ac42813aSSunila Sahu 1097ac42813aSSunila Sahu /* 1098ac42813aSSunila Sahu * openssl 1.1.0 mandate that public key can't be 1099ac42813aSSunila Sahu * NULL in very first call. so set a dummy pub key. 1100ac42813aSSunila Sahu * to keep consistency, lets follow same approach for 1101ac42813aSSunila Sahu * both versions 1102ac42813aSSunila Sahu */ 1103ac42813aSSunila Sahu /* just set dummy public for very 1st call */ 11040b5284adSAshish Gupta ret = set_dsa_keys(dsa, pub_key, priv_key); 1105ac42813aSSunila Sahu if (ret) { 1106ac42813aSSunila Sahu DSA_free(dsa); 1107ac42813aSSunila Sahu OPENSSL_LOG(ERR, "Failed to set keys\n"); 1108ac42813aSSunila Sahu return -1; 1109ac42813aSSunila Sahu } 1110ac42813aSSunila Sahu asym_session->u.s.dsa = dsa; 1111ac42813aSSunila Sahu asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_DSA; 1112ac42813aSSunila Sahu break; 1113ac42813aSSunila Sahu 1114ac42813aSSunila Sahu err_dsa: 1115ac42813aSSunila Sahu if (p) 1116ac42813aSSunila Sahu BN_free(p); 1117ac42813aSSunila Sahu if (q) 1118ac42813aSSunila Sahu BN_free(q); 1119ac42813aSSunila Sahu if (g) 1120ac42813aSSunila Sahu BN_free(g); 1121ac42813aSSunila Sahu if (priv_key) 1122ac42813aSSunila Sahu BN_free(priv_key); 1123ac42813aSSunila Sahu if (pub_key) 1124ac42813aSSunila Sahu BN_free(pub_key); 1125ac42813aSSunila Sahu return -1; 1126ac42813aSSunila Sahu } 11273e9d6bd4SSunila Sahu default: 11283e9d6bd4SSunila Sahu return -1; 11293e9d6bd4SSunila Sahu } 11303e9d6bd4SSunila Sahu 11313e9d6bd4SSunila Sahu return 0; 11323e9d6bd4SSunila Sahu } 11333e9d6bd4SSunila Sahu 11343e9d6bd4SSunila Sahu /** Configure the session from a crypto xform chain */ 11353e9d6bd4SSunila Sahu static int 11363e9d6bd4SSunila Sahu openssl_pmd_asym_session_configure(struct rte_cryptodev *dev __rte_unused, 11373e9d6bd4SSunila Sahu struct rte_crypto_asym_xform *xform, 11383e9d6bd4SSunila Sahu struct rte_cryptodev_asym_session *sess, 11393e9d6bd4SSunila Sahu struct rte_mempool *mempool) 11403e9d6bd4SSunila Sahu { 11413e9d6bd4SSunila Sahu void *asym_sess_private_data; 11423e9d6bd4SSunila Sahu int ret; 11433e9d6bd4SSunila Sahu 11443e9d6bd4SSunila Sahu if (unlikely(sess == NULL)) { 11453e9d6bd4SSunila Sahu OPENSSL_LOG(ERR, "invalid asymmetric session struct"); 11463e9d6bd4SSunila Sahu return -EINVAL; 11473e9d6bd4SSunila Sahu } 11483e9d6bd4SSunila Sahu 11493e9d6bd4SSunila Sahu if (rte_mempool_get(mempool, &asym_sess_private_data)) { 11503e9d6bd4SSunila Sahu CDEV_LOG_ERR( 11513e9d6bd4SSunila Sahu "Couldn't get object from session mempool"); 11523e9d6bd4SSunila Sahu return -ENOMEM; 11533e9d6bd4SSunila Sahu } 11543e9d6bd4SSunila Sahu 11553e9d6bd4SSunila Sahu ret = openssl_set_asym_session_parameters(asym_sess_private_data, 11563e9d6bd4SSunila Sahu xform); 11573e9d6bd4SSunila Sahu if (ret != 0) { 11583e9d6bd4SSunila Sahu OPENSSL_LOG(ERR, "failed configure session parameters"); 11593e9d6bd4SSunila Sahu 11603e9d6bd4SSunila Sahu /* Return session to mempool */ 11613e9d6bd4SSunila Sahu rte_mempool_put(mempool, asym_sess_private_data); 11623e9d6bd4SSunila Sahu return ret; 11633e9d6bd4SSunila Sahu } 11643e9d6bd4SSunila Sahu 11653e9d6bd4SSunila Sahu set_asym_session_private_data(sess, dev->driver_id, 11663e9d6bd4SSunila Sahu asym_sess_private_data); 11673e9d6bd4SSunila Sahu 11683e9d6bd4SSunila Sahu return 0; 11693e9d6bd4SSunila Sahu } 11708a9867a6SSlawomir Mrozowicz 11718a9867a6SSlawomir Mrozowicz /** Clear the memory of session so it doesn't leave key material behind */ 11728a9867a6SSlawomir Mrozowicz static void 1173012c5076SPablo de Lara openssl_pmd_sym_session_clear(struct rte_cryptodev *dev, 1174b3bbd9e5SSlawomir Mrozowicz struct rte_cryptodev_sym_session *sess) 11758a9867a6SSlawomir Mrozowicz { 1176b3bbd9e5SSlawomir Mrozowicz uint8_t index = dev->driver_id; 1177012c5076SPablo de Lara void *sess_priv = get_sym_session_private_data(sess, index); 1178b3bbd9e5SSlawomir Mrozowicz 1179b3bbd9e5SSlawomir Mrozowicz /* Zero out the whole structure */ 1180b3bbd9e5SSlawomir Mrozowicz if (sess_priv) { 1181b3bbd9e5SSlawomir Mrozowicz openssl_reset_session(sess_priv); 1182b3bbd9e5SSlawomir Mrozowicz memset(sess_priv, 0, sizeof(struct openssl_session)); 1183b3bbd9e5SSlawomir Mrozowicz struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv); 1184012c5076SPablo de Lara set_sym_session_private_data(sess, index, NULL); 1185b3bbd9e5SSlawomir Mrozowicz rte_mempool_put(sess_mp, sess_priv); 11868a9867a6SSlawomir Mrozowicz } 11878a9867a6SSlawomir Mrozowicz } 11888a9867a6SSlawomir Mrozowicz 11893e9d6bd4SSunila Sahu static void openssl_reset_asym_session(struct openssl_asym_session *sess) 11903e9d6bd4SSunila Sahu { 11913e9d6bd4SSunila Sahu switch (sess->xfrm_type) { 11923e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_XFORM_RSA: 11933e9d6bd4SSunila Sahu if (sess->u.r.rsa) 11943e9d6bd4SSunila Sahu RSA_free(sess->u.r.rsa); 11953e9d6bd4SSunila Sahu break; 11963e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_XFORM_MODEX: 11973e9d6bd4SSunila Sahu if (sess->u.e.ctx) { 11983e9d6bd4SSunila Sahu BN_CTX_end(sess->u.e.ctx); 11993e9d6bd4SSunila Sahu BN_CTX_free(sess->u.e.ctx); 12003e9d6bd4SSunila Sahu } 12013e9d6bd4SSunila Sahu break; 12023e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_XFORM_MODINV: 12033e9d6bd4SSunila Sahu if (sess->u.m.ctx) { 12043e9d6bd4SSunila Sahu BN_CTX_end(sess->u.m.ctx); 12053e9d6bd4SSunila Sahu BN_CTX_free(sess->u.m.ctx); 12063e9d6bd4SSunila Sahu } 12073e9d6bd4SSunila Sahu break; 1208ac42813aSSunila Sahu case RTE_CRYPTO_ASYM_XFORM_DH: 1209ac42813aSSunila Sahu if (sess->u.dh.dh_key) 1210ac42813aSSunila Sahu DH_free(sess->u.dh.dh_key); 1211ac42813aSSunila Sahu break; 1212ac42813aSSunila Sahu case RTE_CRYPTO_ASYM_XFORM_DSA: 1213ac42813aSSunila Sahu if (sess->u.s.dsa) 1214ac42813aSSunila Sahu DSA_free(sess->u.s.dsa); 1215ac42813aSSunila Sahu break; 12163e9d6bd4SSunila Sahu default: 12173e9d6bd4SSunila Sahu break; 12183e9d6bd4SSunila Sahu } 12193e9d6bd4SSunila Sahu } 12203e9d6bd4SSunila Sahu 12213e9d6bd4SSunila Sahu /** Clear the memory of asymmetric session 12223e9d6bd4SSunila Sahu * so it doesn't leave key material behind 12233e9d6bd4SSunila Sahu */ 12243e9d6bd4SSunila Sahu static void 12253e9d6bd4SSunila Sahu openssl_pmd_asym_session_clear(struct rte_cryptodev *dev, 12263e9d6bd4SSunila Sahu struct rte_cryptodev_asym_session *sess) 12273e9d6bd4SSunila Sahu { 12283e9d6bd4SSunila Sahu uint8_t index = dev->driver_id; 12293e9d6bd4SSunila Sahu void *sess_priv = get_asym_session_private_data(sess, index); 12303e9d6bd4SSunila Sahu 12313e9d6bd4SSunila Sahu /* Zero out the whole structure */ 12323e9d6bd4SSunila Sahu if (sess_priv) { 12333e9d6bd4SSunila Sahu openssl_reset_asym_session(sess_priv); 12343e9d6bd4SSunila Sahu memset(sess_priv, 0, sizeof(struct openssl_asym_session)); 12353e9d6bd4SSunila Sahu struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv); 12363e9d6bd4SSunila Sahu set_asym_session_private_data(sess, index, NULL); 12373e9d6bd4SSunila Sahu rte_mempool_put(sess_mp, sess_priv); 12383e9d6bd4SSunila Sahu } 12393e9d6bd4SSunila Sahu } 12403e9d6bd4SSunila Sahu 12418a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops openssl_pmd_ops = { 12428a9867a6SSlawomir Mrozowicz .dev_configure = openssl_pmd_config, 12438a9867a6SSlawomir Mrozowicz .dev_start = openssl_pmd_start, 12448a9867a6SSlawomir Mrozowicz .dev_stop = openssl_pmd_stop, 12458a9867a6SSlawomir Mrozowicz .dev_close = openssl_pmd_close, 12468a9867a6SSlawomir Mrozowicz 12478a9867a6SSlawomir Mrozowicz .stats_get = openssl_pmd_stats_get, 12488a9867a6SSlawomir Mrozowicz .stats_reset = openssl_pmd_stats_reset, 12498a9867a6SSlawomir Mrozowicz 12508a9867a6SSlawomir Mrozowicz .dev_infos_get = openssl_pmd_info_get, 12518a9867a6SSlawomir Mrozowicz 12528a9867a6SSlawomir Mrozowicz .queue_pair_setup = openssl_pmd_qp_setup, 12538a9867a6SSlawomir Mrozowicz .queue_pair_release = openssl_pmd_qp_release, 12548a9867a6SSlawomir Mrozowicz .queue_pair_count = openssl_pmd_qp_count, 12558a9867a6SSlawomir Mrozowicz 1256012c5076SPablo de Lara .sym_session_get_size = openssl_pmd_sym_session_get_size, 12573e9d6bd4SSunila Sahu .asym_session_get_size = openssl_pmd_asym_session_get_size, 1258012c5076SPablo de Lara .sym_session_configure = openssl_pmd_sym_session_configure, 12593e9d6bd4SSunila Sahu .asym_session_configure = openssl_pmd_asym_session_configure, 12603e9d6bd4SSunila Sahu .sym_session_clear = openssl_pmd_sym_session_clear, 12613e9d6bd4SSunila Sahu .asym_session_clear = openssl_pmd_asym_session_clear 12628a9867a6SSlawomir Mrozowicz }; 12638a9867a6SSlawomir Mrozowicz 12648a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops *rte_openssl_pmd_ops = &openssl_pmd_ops; 1265