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