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