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