15566a3e3SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 25566a3e3SBruce Richardson * Copyright(c) 2016-2017 Intel Corporation 38a9867a6SSlawomir Mrozowicz */ 48a9867a6SSlawomir Mrozowicz 58a9867a6SSlawomir Mrozowicz #include <rte_common.h> 68a9867a6SSlawomir Mrozowicz #include <rte_hexdump.h> 78a9867a6SSlawomir Mrozowicz #include <rte_cryptodev.h> 8af668035SAkhil Goyal #include <cryptodev_pmd.h> 9*4851ef2bSDavid Marchand #include <bus_vdev_driver.h> 108a9867a6SSlawomir Mrozowicz #include <rte_malloc.h> 118a9867a6SSlawomir Mrozowicz #include <rte_cpuflags.h> 128a9867a6SSlawomir Mrozowicz 133d0243feSAkhil Goyal #include <openssl/hmac.h> 148a9867a6SSlawomir Mrozowicz #include <openssl/evp.h> 158a9867a6SSlawomir Mrozowicz 16b28f28aeSDharmik Thakkar #include "openssl_pmd_private.h" 173e9d6bd4SSunila Sahu #include "compat.h" 188a9867a6SSlawomir Mrozowicz 191dee7bc7SPablo de Lara #define DES_BLOCK_SIZE 8 201dee7bc7SPablo de Lara 217a364faeSSlawomir Mrozowicz static uint8_t cryptodev_driver_id; 227a364faeSSlawomir Mrozowicz 233d0243feSAkhil Goyal #if (OPENSSL_VERSION_NUMBER < 0x10100000L) 243d0243feSAkhil Goyal static HMAC_CTX *HMAC_CTX_new(void) 253d0243feSAkhil Goyal { 263d0243feSAkhil Goyal HMAC_CTX *ctx = OPENSSL_malloc(sizeof(*ctx)); 273d0243feSAkhil Goyal 283d0243feSAkhil Goyal if (ctx != NULL) 293d0243feSAkhil Goyal HMAC_CTX_init(ctx); 303d0243feSAkhil Goyal return ctx; 313d0243feSAkhil Goyal } 323d0243feSAkhil Goyal 333d0243feSAkhil Goyal static void HMAC_CTX_free(HMAC_CTX *ctx) 343d0243feSAkhil Goyal { 353d0243feSAkhil Goyal if (ctx != NULL) { 363d0243feSAkhil Goyal HMAC_CTX_cleanup(ctx); 373d0243feSAkhil Goyal OPENSSL_free(ctx); 383d0243feSAkhil Goyal } 393d0243feSAkhil Goyal } 403d0243feSAkhil Goyal #endif 413d0243feSAkhil Goyal 4275adf1eaSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 4375adf1eaSKai Ji 4475adf1eaSKai Ji #include <openssl/provider.h> 4575adf1eaSKai Ji #include <openssl/core_names.h> 46c794b40cSKai Ji #include <openssl/param_build.h> 4775adf1eaSKai Ji 4875adf1eaSKai Ji #define MAX_OSSL_ALGO_NAME_SIZE 16 4975adf1eaSKai Ji 5075adf1eaSKai Ji OSSL_PROVIDER *legacy; 5175adf1eaSKai Ji OSSL_PROVIDER *deflt; 5275adf1eaSKai Ji 5375adf1eaSKai Ji static void ossl_legacy_provider_load(void) 5475adf1eaSKai Ji { 5575adf1eaSKai Ji /* Load Multiple providers into the default (NULL) library context */ 5675adf1eaSKai Ji legacy = OSSL_PROVIDER_load(NULL, "legacy"); 5775adf1eaSKai Ji if (legacy == NULL) { 5875adf1eaSKai Ji OPENSSL_LOG(ERR, "Failed to load Legacy provider\n"); 5975adf1eaSKai Ji return; 6075adf1eaSKai Ji } 6175adf1eaSKai Ji 6275adf1eaSKai Ji deflt = OSSL_PROVIDER_load(NULL, "default"); 6375adf1eaSKai Ji if (deflt == NULL) { 6475adf1eaSKai Ji OPENSSL_LOG(ERR, "Failed to load Default provider\n"); 6575adf1eaSKai Ji OSSL_PROVIDER_unload(legacy); 6675adf1eaSKai Ji return; 6775adf1eaSKai Ji } 6875adf1eaSKai Ji } 6975adf1eaSKai Ji 7075adf1eaSKai Ji static void ossl_legacy_provider_unload(void) 7175adf1eaSKai Ji { 7275adf1eaSKai Ji OSSL_PROVIDER_unload(legacy); 7375adf1eaSKai Ji OSSL_PROVIDER_unload(deflt); 7475adf1eaSKai Ji } 7575adf1eaSKai Ji 7675adf1eaSKai Ji static __rte_always_inline const char * 7775adf1eaSKai Ji digest_name_get(enum rte_crypto_auth_algorithm algo) 7875adf1eaSKai Ji { 7975adf1eaSKai Ji switch (algo) { 8075adf1eaSKai Ji case RTE_CRYPTO_AUTH_MD5_HMAC: 8175adf1eaSKai Ji return OSSL_DIGEST_NAME_MD5; 8275adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA1_HMAC: 8375adf1eaSKai Ji return OSSL_DIGEST_NAME_SHA1; 8475adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA224_HMAC: 8575adf1eaSKai Ji return OSSL_DIGEST_NAME_SHA2_224; 8675adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA256_HMAC: 8775adf1eaSKai Ji return OSSL_DIGEST_NAME_SHA2_256; 8875adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA384_HMAC: 8975adf1eaSKai Ji return OSSL_DIGEST_NAME_SHA2_384; 9075adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA512_HMAC: 9175adf1eaSKai Ji return OSSL_DIGEST_NAME_SHA2_512; 9275adf1eaSKai Ji default: 9375adf1eaSKai Ji return NULL; 9475adf1eaSKai Ji } 9575adf1eaSKai Ji } 9675adf1eaSKai Ji #endif 9775adf1eaSKai Ji 985d2aa461SJan Blunck static int cryptodev_openssl_remove(struct rte_vdev_device *vdev); 998a9867a6SSlawomir Mrozowicz 1008a9867a6SSlawomir Mrozowicz /*----------------------------------------------------------------------------*/ 1018a9867a6SSlawomir Mrozowicz 1028a9867a6SSlawomir Mrozowicz /** 1038a9867a6SSlawomir Mrozowicz * Increment counter by 1 1048a9867a6SSlawomir Mrozowicz * Counter is 64 bit array, big-endian 1058a9867a6SSlawomir Mrozowicz */ 1068a9867a6SSlawomir Mrozowicz static void 1078a9867a6SSlawomir Mrozowicz ctr_inc(uint8_t *ctr) 1088a9867a6SSlawomir Mrozowicz { 1098a9867a6SSlawomir Mrozowicz uint64_t *ctr64 = (uint64_t *)ctr; 1108a9867a6SSlawomir Mrozowicz 1118a9867a6SSlawomir Mrozowicz *ctr64 = __builtin_bswap64(*ctr64); 1128a9867a6SSlawomir Mrozowicz (*ctr64)++; 1138a9867a6SSlawomir Mrozowicz *ctr64 = __builtin_bswap64(*ctr64); 1148a9867a6SSlawomir Mrozowicz } 1158a9867a6SSlawomir Mrozowicz 1168a9867a6SSlawomir Mrozowicz /* 1178a9867a6SSlawomir Mrozowicz *------------------------------------------------------------------------------ 1188a9867a6SSlawomir Mrozowicz * Session Prepare 1198a9867a6SSlawomir Mrozowicz *------------------------------------------------------------------------------ 1208a9867a6SSlawomir Mrozowicz */ 1218a9867a6SSlawomir Mrozowicz 1228a9867a6SSlawomir Mrozowicz /** Get xform chain order */ 1238a9867a6SSlawomir Mrozowicz static enum openssl_chain_order 1248a9867a6SSlawomir Mrozowicz openssl_get_chain_order(const struct rte_crypto_sym_xform *xform) 1258a9867a6SSlawomir Mrozowicz { 1268a9867a6SSlawomir Mrozowicz enum openssl_chain_order res = OPENSSL_CHAIN_NOT_SUPPORTED; 1278a9867a6SSlawomir Mrozowicz 1288a9867a6SSlawomir Mrozowicz if (xform != NULL) { 1298a9867a6SSlawomir Mrozowicz if (xform->type == RTE_CRYPTO_SYM_XFORM_AUTH) { 1308a9867a6SSlawomir Mrozowicz if (xform->next == NULL) 1318a9867a6SSlawomir Mrozowicz res = OPENSSL_CHAIN_ONLY_AUTH; 1328a9867a6SSlawomir Mrozowicz else if (xform->next->type == 1338a9867a6SSlawomir Mrozowicz RTE_CRYPTO_SYM_XFORM_CIPHER) 1348a9867a6SSlawomir Mrozowicz res = OPENSSL_CHAIN_AUTH_CIPHER; 1358a9867a6SSlawomir Mrozowicz } 1368a9867a6SSlawomir Mrozowicz if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER) { 1378a9867a6SSlawomir Mrozowicz if (xform->next == NULL) 1388a9867a6SSlawomir Mrozowicz res = OPENSSL_CHAIN_ONLY_CIPHER; 1398a9867a6SSlawomir Mrozowicz else if (xform->next->type == RTE_CRYPTO_SYM_XFORM_AUTH) 1408a9867a6SSlawomir Mrozowicz res = OPENSSL_CHAIN_CIPHER_AUTH; 1418a9867a6SSlawomir Mrozowicz } 142b79e4c00SPablo de Lara if (xform->type == RTE_CRYPTO_SYM_XFORM_AEAD) 143b79e4c00SPablo de Lara res = OPENSSL_CHAIN_COMBINED; 1448a9867a6SSlawomir Mrozowicz } 1458a9867a6SSlawomir Mrozowicz 1468a9867a6SSlawomir Mrozowicz return res; 1478a9867a6SSlawomir Mrozowicz } 1488a9867a6SSlawomir Mrozowicz 1498a9867a6SSlawomir Mrozowicz /** Get session cipher key from input cipher key */ 1508a9867a6SSlawomir Mrozowicz static void 151186b14d6SFan Zhang get_cipher_key(const uint8_t *input_key, int keylen, uint8_t *session_key) 1528a9867a6SSlawomir Mrozowicz { 1538a9867a6SSlawomir Mrozowicz memcpy(session_key, input_key, keylen); 1548a9867a6SSlawomir Mrozowicz } 1558a9867a6SSlawomir Mrozowicz 1568a9867a6SSlawomir Mrozowicz /** Get key ede 24 bytes standard from input key */ 1578a9867a6SSlawomir Mrozowicz static int 158186b14d6SFan Zhang get_cipher_key_ede(const uint8_t *key, int keylen, uint8_t *key_ede) 1598a9867a6SSlawomir Mrozowicz { 1608a9867a6SSlawomir Mrozowicz int res = 0; 1618a9867a6SSlawomir Mrozowicz 1628a9867a6SSlawomir Mrozowicz /* Initialize keys - 24 bytes: [key1-key2-key3] */ 1638a9867a6SSlawomir Mrozowicz switch (keylen) { 1648a9867a6SSlawomir Mrozowicz case 24: 1658a9867a6SSlawomir Mrozowicz memcpy(key_ede, key, 24); 1668a9867a6SSlawomir Mrozowicz break; 1678a9867a6SSlawomir Mrozowicz case 16: 1688a9867a6SSlawomir Mrozowicz /* K3 = K1 */ 1698a9867a6SSlawomir Mrozowicz memcpy(key_ede, key, 16); 1708a9867a6SSlawomir Mrozowicz memcpy(key_ede + 16, key, 8); 1718a9867a6SSlawomir Mrozowicz break; 1728a9867a6SSlawomir Mrozowicz case 8: 1738a9867a6SSlawomir Mrozowicz /* K1 = K2 = K3 (DES compatibility) */ 1748a9867a6SSlawomir Mrozowicz memcpy(key_ede, key, 8); 1758a9867a6SSlawomir Mrozowicz memcpy(key_ede + 8, key, 8); 1768a9867a6SSlawomir Mrozowicz memcpy(key_ede + 16, key, 8); 1778a9867a6SSlawomir Mrozowicz break; 1788a9867a6SSlawomir Mrozowicz default: 179094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Unsupported key size"); 1808a9867a6SSlawomir Mrozowicz res = -EINVAL; 1818a9867a6SSlawomir Mrozowicz } 1828a9867a6SSlawomir Mrozowicz 1838a9867a6SSlawomir Mrozowicz return res; 1848a9867a6SSlawomir Mrozowicz } 1858a9867a6SSlawomir Mrozowicz 1868a9867a6SSlawomir Mrozowicz /** Get adequate openssl function for input cipher algorithm */ 1878a9867a6SSlawomir Mrozowicz static uint8_t 1888a9867a6SSlawomir Mrozowicz get_cipher_algo(enum rte_crypto_cipher_algorithm sess_algo, size_t keylen, 1898a9867a6SSlawomir Mrozowicz const EVP_CIPHER **algo) 1908a9867a6SSlawomir Mrozowicz { 1918a9867a6SSlawomir Mrozowicz int res = 0; 1928a9867a6SSlawomir Mrozowicz 1938a9867a6SSlawomir Mrozowicz if (algo != NULL) { 1948a9867a6SSlawomir Mrozowicz switch (sess_algo) { 1958a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_CIPHER_3DES_CBC: 1968a9867a6SSlawomir Mrozowicz switch (keylen) { 1979607e37eSMarko Kovacevic case 8: 1989607e37eSMarko Kovacevic *algo = EVP_des_cbc(); 1999607e37eSMarko Kovacevic break; 2008a9867a6SSlawomir Mrozowicz case 16: 2018a9867a6SSlawomir Mrozowicz *algo = EVP_des_ede_cbc(); 2028a9867a6SSlawomir Mrozowicz break; 2038a9867a6SSlawomir Mrozowicz case 24: 2048a9867a6SSlawomir Mrozowicz *algo = EVP_des_ede3_cbc(); 2058a9867a6SSlawomir Mrozowicz break; 2068a9867a6SSlawomir Mrozowicz default: 2078a9867a6SSlawomir Mrozowicz res = -EINVAL; 2088a9867a6SSlawomir Mrozowicz } 2098a9867a6SSlawomir Mrozowicz break; 2108a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_CIPHER_3DES_CTR: 2118a9867a6SSlawomir Mrozowicz break; 2128a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_CIPHER_AES_CBC: 2138a9867a6SSlawomir Mrozowicz switch (keylen) { 2148a9867a6SSlawomir Mrozowicz case 16: 2158a9867a6SSlawomir Mrozowicz *algo = EVP_aes_128_cbc(); 2168a9867a6SSlawomir Mrozowicz break; 2178a9867a6SSlawomir Mrozowicz case 24: 2188a9867a6SSlawomir Mrozowicz *algo = EVP_aes_192_cbc(); 2198a9867a6SSlawomir Mrozowicz break; 2208a9867a6SSlawomir Mrozowicz case 32: 2218a9867a6SSlawomir Mrozowicz *algo = EVP_aes_256_cbc(); 2228a9867a6SSlawomir Mrozowicz break; 2238a9867a6SSlawomir Mrozowicz default: 2248a9867a6SSlawomir Mrozowicz res = -EINVAL; 2258a9867a6SSlawomir Mrozowicz } 2268a9867a6SSlawomir Mrozowicz break; 2278a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_CIPHER_AES_CTR: 2288a9867a6SSlawomir Mrozowicz switch (keylen) { 2298a9867a6SSlawomir Mrozowicz case 16: 2308a9867a6SSlawomir Mrozowicz *algo = EVP_aes_128_ctr(); 2318a9867a6SSlawomir Mrozowicz break; 2328a9867a6SSlawomir Mrozowicz case 24: 2338a9867a6SSlawomir Mrozowicz *algo = EVP_aes_192_ctr(); 2348a9867a6SSlawomir Mrozowicz break; 2358a9867a6SSlawomir Mrozowicz case 32: 2368a9867a6SSlawomir Mrozowicz *algo = EVP_aes_256_ctr(); 2378a9867a6SSlawomir Mrozowicz break; 2388a9867a6SSlawomir Mrozowicz default: 2398a9867a6SSlawomir Mrozowicz res = -EINVAL; 2408a9867a6SSlawomir Mrozowicz } 2418a9867a6SSlawomir Mrozowicz break; 2428a9867a6SSlawomir Mrozowicz default: 2438a9867a6SSlawomir Mrozowicz res = -EINVAL; 2448a9867a6SSlawomir Mrozowicz break; 2458a9867a6SSlawomir Mrozowicz } 2468a9867a6SSlawomir Mrozowicz } else { 2478a9867a6SSlawomir Mrozowicz res = -EINVAL; 2488a9867a6SSlawomir Mrozowicz } 2498a9867a6SSlawomir Mrozowicz 2508a9867a6SSlawomir Mrozowicz return res; 2518a9867a6SSlawomir Mrozowicz } 2528a9867a6SSlawomir Mrozowicz 2538a9867a6SSlawomir Mrozowicz /** Get adequate openssl function for input auth algorithm */ 2548a9867a6SSlawomir Mrozowicz static uint8_t 2558a9867a6SSlawomir Mrozowicz get_auth_algo(enum rte_crypto_auth_algorithm sessalgo, 2568a9867a6SSlawomir Mrozowicz const EVP_MD **algo) 2578a9867a6SSlawomir Mrozowicz { 2588a9867a6SSlawomir Mrozowicz int res = 0; 2598a9867a6SSlawomir Mrozowicz 2608a9867a6SSlawomir Mrozowicz if (algo != NULL) { 2618a9867a6SSlawomir Mrozowicz switch (sessalgo) { 2628a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_MD5: 2638a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_MD5_HMAC: 2648a9867a6SSlawomir Mrozowicz *algo = EVP_md5(); 2658a9867a6SSlawomir Mrozowicz break; 2668a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA1: 2678a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA1_HMAC: 2688a9867a6SSlawomir Mrozowicz *algo = EVP_sha1(); 2698a9867a6SSlawomir Mrozowicz break; 2708a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA224: 2718a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA224_HMAC: 2728a9867a6SSlawomir Mrozowicz *algo = EVP_sha224(); 2738a9867a6SSlawomir Mrozowicz break; 2748a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA256: 2758a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA256_HMAC: 2768a9867a6SSlawomir Mrozowicz *algo = EVP_sha256(); 2778a9867a6SSlawomir Mrozowicz break; 2788a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA384: 2798a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA384_HMAC: 2808a9867a6SSlawomir Mrozowicz *algo = EVP_sha384(); 2818a9867a6SSlawomir Mrozowicz break; 2828a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA512: 2838a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA512_HMAC: 2848a9867a6SSlawomir Mrozowicz *algo = EVP_sha512(); 2858a9867a6SSlawomir Mrozowicz break; 2868a9867a6SSlawomir Mrozowicz default: 2878a9867a6SSlawomir Mrozowicz res = -EINVAL; 2888a9867a6SSlawomir Mrozowicz break; 2898a9867a6SSlawomir Mrozowicz } 2908a9867a6SSlawomir Mrozowicz } else { 2918a9867a6SSlawomir Mrozowicz res = -EINVAL; 2928a9867a6SSlawomir Mrozowicz } 2938a9867a6SSlawomir Mrozowicz 2948a9867a6SSlawomir Mrozowicz return res; 2958a9867a6SSlawomir Mrozowicz } 2968a9867a6SSlawomir Mrozowicz 297b79e4c00SPablo de Lara /** Get adequate openssl function for input cipher algorithm */ 298b79e4c00SPablo de Lara static uint8_t 299b79e4c00SPablo de Lara get_aead_algo(enum rte_crypto_aead_algorithm sess_algo, size_t keylen, 300b79e4c00SPablo de Lara const EVP_CIPHER **algo) 301b79e4c00SPablo de Lara { 302b79e4c00SPablo de Lara int res = 0; 303b79e4c00SPablo de Lara 304b79e4c00SPablo de Lara if (algo != NULL) { 305b79e4c00SPablo de Lara switch (sess_algo) { 306b79e4c00SPablo de Lara case RTE_CRYPTO_AEAD_AES_GCM: 307b79e4c00SPablo de Lara switch (keylen) { 308b79e4c00SPablo de Lara case 16: 309b79e4c00SPablo de Lara *algo = EVP_aes_128_gcm(); 310b79e4c00SPablo de Lara break; 311b79e4c00SPablo de Lara case 24: 312b79e4c00SPablo de Lara *algo = EVP_aes_192_gcm(); 313b79e4c00SPablo de Lara break; 314b79e4c00SPablo de Lara case 32: 315b79e4c00SPablo de Lara *algo = EVP_aes_256_gcm(); 316b79e4c00SPablo de Lara break; 317b79e4c00SPablo de Lara default: 318b79e4c00SPablo de Lara res = -EINVAL; 319b79e4c00SPablo de Lara } 320b79e4c00SPablo de Lara break; 3211a4998dcSPablo de Lara case RTE_CRYPTO_AEAD_AES_CCM: 3221a4998dcSPablo de Lara switch (keylen) { 3231a4998dcSPablo de Lara case 16: 3241a4998dcSPablo de Lara *algo = EVP_aes_128_ccm(); 3251a4998dcSPablo de Lara break; 3261a4998dcSPablo de Lara case 24: 3271a4998dcSPablo de Lara *algo = EVP_aes_192_ccm(); 3281a4998dcSPablo de Lara break; 3291a4998dcSPablo de Lara case 32: 3301a4998dcSPablo de Lara *algo = EVP_aes_256_ccm(); 3311a4998dcSPablo de Lara break; 3321a4998dcSPablo de Lara default: 3331a4998dcSPablo de Lara res = -EINVAL; 3341a4998dcSPablo de Lara } 3351a4998dcSPablo de Lara break; 336b79e4c00SPablo de Lara default: 337b79e4c00SPablo de Lara res = -EINVAL; 338b79e4c00SPablo de Lara break; 339b79e4c00SPablo de Lara } 340b79e4c00SPablo de Lara } else { 341b79e4c00SPablo de Lara res = -EINVAL; 342b79e4c00SPablo de Lara } 343b79e4c00SPablo de Lara 344b79e4c00SPablo de Lara return res; 345b79e4c00SPablo de Lara } 346b79e4c00SPablo de Lara 347b4b86b09SPablo de Lara /* Set session AEAD encryption parameters */ 348b4b86b09SPablo de Lara static int 349b4b86b09SPablo de Lara openssl_set_sess_aead_enc_param(struct openssl_session *sess, 350b4b86b09SPablo de Lara enum rte_crypto_aead_algorithm algo, 351186b14d6SFan Zhang uint8_t tag_len, const uint8_t *key) 352b4b86b09SPablo de Lara { 353b4b86b09SPablo de Lara int iv_type = 0; 3541a4998dcSPablo de Lara unsigned int do_ccm; 355b4b86b09SPablo de Lara 356b4b86b09SPablo de Lara sess->cipher.direction = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 357b4b86b09SPablo de Lara sess->auth.operation = RTE_CRYPTO_AUTH_OP_GENERATE; 358b4b86b09SPablo de Lara 359b4b86b09SPablo de Lara /* Select AEAD algo */ 360b4b86b09SPablo de Lara switch (algo) { 361b4b86b09SPablo de Lara case RTE_CRYPTO_AEAD_AES_GCM: 362b4b86b09SPablo de Lara iv_type = EVP_CTRL_GCM_SET_IVLEN; 363b4b86b09SPablo de Lara if (tag_len != 16) 364b4b86b09SPablo de Lara return -EINVAL; 3651a4998dcSPablo de Lara do_ccm = 0; 3661a4998dcSPablo de Lara break; 3671a4998dcSPablo de Lara case RTE_CRYPTO_AEAD_AES_CCM: 3681a4998dcSPablo de Lara iv_type = EVP_CTRL_CCM_SET_IVLEN; 3691a4998dcSPablo de Lara /* Digest size can be 4, 6, 8, 10, 12, 14 or 16 bytes */ 3701a4998dcSPablo de Lara if (tag_len < 4 || tag_len > 16 || (tag_len & 1) == 1) 3711a4998dcSPablo de Lara return -EINVAL; 3721a4998dcSPablo de Lara do_ccm = 1; 373b4b86b09SPablo de Lara break; 374b4b86b09SPablo de Lara default: 375b4b86b09SPablo de Lara return -ENOTSUP; 376b4b86b09SPablo de Lara } 377b4b86b09SPablo de Lara 378b4b86b09SPablo de Lara sess->cipher.mode = OPENSSL_CIPHER_LIB; 379b4b86b09SPablo de Lara sess->cipher.ctx = EVP_CIPHER_CTX_new(); 380b4b86b09SPablo de Lara 381b4b86b09SPablo de Lara if (get_aead_algo(algo, sess->cipher.key.length, 382b4b86b09SPablo de Lara &sess->cipher.evp_algo) != 0) 383b4b86b09SPablo de Lara return -EINVAL; 384b4b86b09SPablo de Lara 385b4b86b09SPablo de Lara get_cipher_key(key, sess->cipher.key.length, sess->cipher.key.data); 386b4b86b09SPablo de Lara 387b4b86b09SPablo de Lara sess->chain_order = OPENSSL_CHAIN_COMBINED; 388b4b86b09SPablo de Lara 389b4b86b09SPablo de Lara if (EVP_EncryptInit_ex(sess->cipher.ctx, sess->cipher.evp_algo, 390b4b86b09SPablo de Lara NULL, NULL, NULL) <= 0) 391b4b86b09SPablo de Lara return -EINVAL; 392b4b86b09SPablo de Lara 393b4b86b09SPablo de Lara if (EVP_CIPHER_CTX_ctrl(sess->cipher.ctx, iv_type, sess->iv.length, 394b4b86b09SPablo de Lara NULL) <= 0) 395b4b86b09SPablo de Lara return -EINVAL; 396b4b86b09SPablo de Lara 3971a4998dcSPablo de Lara if (do_ccm) 3981a4998dcSPablo de Lara EVP_CIPHER_CTX_ctrl(sess->cipher.ctx, EVP_CTRL_CCM_SET_TAG, 3991a4998dcSPablo de Lara tag_len, NULL); 4001a4998dcSPablo de Lara 401b4b86b09SPablo de Lara if (EVP_EncryptInit_ex(sess->cipher.ctx, NULL, NULL, key, NULL) <= 0) 402b4b86b09SPablo de Lara return -EINVAL; 403b4b86b09SPablo de Lara 404b4b86b09SPablo de Lara return 0; 405b4b86b09SPablo de Lara } 406b4b86b09SPablo de Lara 407b4b86b09SPablo de Lara /* Set session AEAD decryption parameters */ 408b4b86b09SPablo de Lara static int 409b4b86b09SPablo de Lara openssl_set_sess_aead_dec_param(struct openssl_session *sess, 410b4b86b09SPablo de Lara enum rte_crypto_aead_algorithm algo, 411186b14d6SFan Zhang uint8_t tag_len, const uint8_t *key) 412b4b86b09SPablo de Lara { 413b4b86b09SPablo de Lara int iv_type = 0; 4141a4998dcSPablo de Lara unsigned int do_ccm = 0; 415b4b86b09SPablo de Lara 416b4b86b09SPablo de Lara sess->cipher.direction = RTE_CRYPTO_CIPHER_OP_DECRYPT; 417b4b86b09SPablo de Lara sess->auth.operation = RTE_CRYPTO_AUTH_OP_VERIFY; 418b4b86b09SPablo de Lara 419b4b86b09SPablo de Lara /* Select AEAD algo */ 420b4b86b09SPablo de Lara switch (algo) { 421b4b86b09SPablo de Lara case RTE_CRYPTO_AEAD_AES_GCM: 422b4b86b09SPablo de Lara iv_type = EVP_CTRL_GCM_SET_IVLEN; 423b4b86b09SPablo de Lara if (tag_len != 16) 424b4b86b09SPablo de Lara return -EINVAL; 425b4b86b09SPablo de Lara break; 4261a4998dcSPablo de Lara case RTE_CRYPTO_AEAD_AES_CCM: 4271a4998dcSPablo de Lara iv_type = EVP_CTRL_CCM_SET_IVLEN; 4281a4998dcSPablo de Lara /* Digest size can be 4, 6, 8, 10, 12, 14 or 16 bytes */ 4291a4998dcSPablo de Lara if (tag_len < 4 || tag_len > 16 || (tag_len & 1) == 1) 4301a4998dcSPablo de Lara return -EINVAL; 4311a4998dcSPablo de Lara do_ccm = 1; 4321a4998dcSPablo de Lara break; 433b4b86b09SPablo de Lara default: 434b4b86b09SPablo de Lara return -ENOTSUP; 435b4b86b09SPablo de Lara } 436b4b86b09SPablo de Lara 437b4b86b09SPablo de Lara sess->cipher.mode = OPENSSL_CIPHER_LIB; 438b4b86b09SPablo de Lara sess->cipher.ctx = EVP_CIPHER_CTX_new(); 439b4b86b09SPablo de Lara 440b4b86b09SPablo de Lara if (get_aead_algo(algo, sess->cipher.key.length, 441b4b86b09SPablo de Lara &sess->cipher.evp_algo) != 0) 442b4b86b09SPablo de Lara return -EINVAL; 443b4b86b09SPablo de Lara 444b4b86b09SPablo de Lara get_cipher_key(key, sess->cipher.key.length, sess->cipher.key.data); 445b4b86b09SPablo de Lara 446b4b86b09SPablo de Lara sess->chain_order = OPENSSL_CHAIN_COMBINED; 447b4b86b09SPablo de Lara 448b4b86b09SPablo de Lara if (EVP_DecryptInit_ex(sess->cipher.ctx, sess->cipher.evp_algo, 449b4b86b09SPablo de Lara NULL, NULL, NULL) <= 0) 450b4b86b09SPablo de Lara return -EINVAL; 451b4b86b09SPablo de Lara 452b4b86b09SPablo de Lara if (EVP_CIPHER_CTX_ctrl(sess->cipher.ctx, iv_type, 453b4b86b09SPablo de Lara sess->iv.length, NULL) <= 0) 454b4b86b09SPablo de Lara return -EINVAL; 455b4b86b09SPablo de Lara 4561a4998dcSPablo de Lara if (do_ccm) 4571a4998dcSPablo de Lara EVP_CIPHER_CTX_ctrl(sess->cipher.ctx, EVP_CTRL_CCM_SET_TAG, 4581a4998dcSPablo de Lara tag_len, NULL); 4591a4998dcSPablo de Lara 460b4b86b09SPablo de Lara if (EVP_DecryptInit_ex(sess->cipher.ctx, NULL, NULL, key, NULL) <= 0) 461b4b86b09SPablo de Lara return -EINVAL; 462b4b86b09SPablo de Lara 463b4b86b09SPablo de Lara return 0; 464b4b86b09SPablo de Lara } 465b4b86b09SPablo de Lara 4668a9867a6SSlawomir Mrozowicz /** Set session cipher parameters */ 4678a9867a6SSlawomir Mrozowicz static int 4688a9867a6SSlawomir Mrozowicz openssl_set_session_cipher_parameters(struct openssl_session *sess, 4698a9867a6SSlawomir Mrozowicz const struct rte_crypto_sym_xform *xform) 4708a9867a6SSlawomir Mrozowicz { 4718a9867a6SSlawomir Mrozowicz /* Select cipher direction */ 4728a9867a6SSlawomir Mrozowicz sess->cipher.direction = xform->cipher.op; 4738a9867a6SSlawomir Mrozowicz /* Select cipher key */ 4748a9867a6SSlawomir Mrozowicz sess->cipher.key.length = xform->cipher.key.length; 4758a9867a6SSlawomir Mrozowicz 4760fbd75a9SPablo de Lara /* Set IV parameters */ 4770fbd75a9SPablo de Lara sess->iv.offset = xform->cipher.iv.offset; 4780fbd75a9SPablo de Lara sess->iv.length = xform->cipher.iv.length; 4790fbd75a9SPablo de Lara 4808a9867a6SSlawomir Mrozowicz /* Select cipher algo */ 4818a9867a6SSlawomir Mrozowicz switch (xform->cipher.algo) { 4828a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_CIPHER_3DES_CBC: 4838a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_CIPHER_AES_CBC: 4848a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_CIPHER_AES_CTR: 4858a9867a6SSlawomir Mrozowicz sess->cipher.mode = OPENSSL_CIPHER_LIB; 4868a9867a6SSlawomir Mrozowicz sess->cipher.algo = xform->cipher.algo; 4878a9867a6SSlawomir Mrozowicz sess->cipher.ctx = EVP_CIPHER_CTX_new(); 4888a9867a6SSlawomir Mrozowicz 4898a9867a6SSlawomir Mrozowicz if (get_cipher_algo(sess->cipher.algo, sess->cipher.key.length, 4908a9867a6SSlawomir Mrozowicz &sess->cipher.evp_algo) != 0) 4918a9867a6SSlawomir Mrozowicz return -EINVAL; 4928a9867a6SSlawomir Mrozowicz 4938a9867a6SSlawomir Mrozowicz get_cipher_key(xform->cipher.key.data, sess->cipher.key.length, 4948a9867a6SSlawomir Mrozowicz sess->cipher.key.data); 495efd42d2eSAkhil Goyal if (sess->cipher.direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 496efd42d2eSAkhil Goyal if (EVP_EncryptInit_ex(sess->cipher.ctx, 497efd42d2eSAkhil Goyal sess->cipher.evp_algo, 498efd42d2eSAkhil Goyal NULL, xform->cipher.key.data, 499efd42d2eSAkhil Goyal NULL) != 1) { 500efd42d2eSAkhil Goyal return -EINVAL; 501efd42d2eSAkhil Goyal } 502efd42d2eSAkhil Goyal } else if (sess->cipher.direction == 503efd42d2eSAkhil Goyal RTE_CRYPTO_CIPHER_OP_DECRYPT) { 504efd42d2eSAkhil Goyal if (EVP_DecryptInit_ex(sess->cipher.ctx, 505efd42d2eSAkhil Goyal sess->cipher.evp_algo, 506efd42d2eSAkhil Goyal NULL, xform->cipher.key.data, 507efd42d2eSAkhil Goyal NULL) != 1) { 508efd42d2eSAkhil Goyal return -EINVAL; 509efd42d2eSAkhil Goyal } 510efd42d2eSAkhil Goyal } 5118a9867a6SSlawomir Mrozowicz 5128a9867a6SSlawomir Mrozowicz break; 5138a9867a6SSlawomir Mrozowicz 5148a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_CIPHER_3DES_CTR: 5158a9867a6SSlawomir Mrozowicz sess->cipher.mode = OPENSSL_CIPHER_DES3CTR; 5168a9867a6SSlawomir Mrozowicz sess->cipher.ctx = EVP_CIPHER_CTX_new(); 5178a9867a6SSlawomir Mrozowicz 5188a9867a6SSlawomir Mrozowicz if (get_cipher_key_ede(xform->cipher.key.data, 5198a9867a6SSlawomir Mrozowicz sess->cipher.key.length, 5208a9867a6SSlawomir Mrozowicz sess->cipher.key.data) != 0) 5218a9867a6SSlawomir Mrozowicz return -EINVAL; 5228a9867a6SSlawomir Mrozowicz break; 523c1734807SPablo de Lara 524c1734807SPablo de Lara case RTE_CRYPTO_CIPHER_DES_CBC: 525c1734807SPablo de Lara sess->cipher.algo = xform->cipher.algo; 526c1734807SPablo de Lara sess->cipher.ctx = EVP_CIPHER_CTX_new(); 527c1734807SPablo de Lara sess->cipher.evp_algo = EVP_des_cbc(); 528c1734807SPablo de Lara 529c1734807SPablo de Lara get_cipher_key(xform->cipher.key.data, sess->cipher.key.length, 530c1734807SPablo de Lara sess->cipher.key.data); 531c1734807SPablo de Lara if (sess->cipher.direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 532c1734807SPablo de Lara if (EVP_EncryptInit_ex(sess->cipher.ctx, 533c1734807SPablo de Lara sess->cipher.evp_algo, 534c1734807SPablo de Lara NULL, xform->cipher.key.data, 535c1734807SPablo de Lara NULL) != 1) { 536c1734807SPablo de Lara return -EINVAL; 537c1734807SPablo de Lara } 538c1734807SPablo de Lara } else if (sess->cipher.direction == 539c1734807SPablo de Lara RTE_CRYPTO_CIPHER_OP_DECRYPT) { 540c1734807SPablo de Lara if (EVP_DecryptInit_ex(sess->cipher.ctx, 541c1734807SPablo de Lara sess->cipher.evp_algo, 542c1734807SPablo de Lara NULL, xform->cipher.key.data, 543c1734807SPablo de Lara NULL) != 1) { 544c1734807SPablo de Lara return -EINVAL; 545c1734807SPablo de Lara } 546c1734807SPablo de Lara } 547c1734807SPablo de Lara 548c1734807SPablo de Lara break; 549c1734807SPablo de Lara 5501dee7bc7SPablo de Lara case RTE_CRYPTO_CIPHER_DES_DOCSISBPI: 5511dee7bc7SPablo de Lara sess->cipher.algo = xform->cipher.algo; 5521dee7bc7SPablo de Lara sess->chain_order = OPENSSL_CHAIN_CIPHER_BPI; 5531dee7bc7SPablo de Lara sess->cipher.ctx = EVP_CIPHER_CTX_new(); 5541dee7bc7SPablo de Lara sess->cipher.evp_algo = EVP_des_cbc(); 5558a9867a6SSlawomir Mrozowicz 5561dee7bc7SPablo de Lara sess->cipher.bpi_ctx = EVP_CIPHER_CTX_new(); 5571dee7bc7SPablo de Lara /* IV will be ECB encrypted whether direction is encrypt or decrypt */ 5581dee7bc7SPablo de Lara if (EVP_EncryptInit_ex(sess->cipher.bpi_ctx, EVP_des_ecb(), 5591dee7bc7SPablo de Lara NULL, xform->cipher.key.data, 0) != 1) 5601dee7bc7SPablo de Lara return -EINVAL; 5611dee7bc7SPablo de Lara 5621dee7bc7SPablo de Lara get_cipher_key(xform->cipher.key.data, sess->cipher.key.length, 5631dee7bc7SPablo de Lara sess->cipher.key.data); 564efd42d2eSAkhil Goyal if (sess->cipher.direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 565efd42d2eSAkhil Goyal if (EVP_EncryptInit_ex(sess->cipher.ctx, 566efd42d2eSAkhil Goyal sess->cipher.evp_algo, 567efd42d2eSAkhil Goyal NULL, xform->cipher.key.data, 568efd42d2eSAkhil Goyal NULL) != 1) { 569efd42d2eSAkhil Goyal return -EINVAL; 570efd42d2eSAkhil Goyal } 571efd42d2eSAkhil Goyal } else if (sess->cipher.direction == 572efd42d2eSAkhil Goyal RTE_CRYPTO_CIPHER_OP_DECRYPT) { 573efd42d2eSAkhil Goyal if (EVP_DecryptInit_ex(sess->cipher.ctx, 574efd42d2eSAkhil Goyal sess->cipher.evp_algo, 575efd42d2eSAkhil Goyal NULL, xform->cipher.key.data, 576efd42d2eSAkhil Goyal NULL) != 1) { 577efd42d2eSAkhil Goyal return -EINVAL; 578efd42d2eSAkhil Goyal } 579efd42d2eSAkhil Goyal } 580efd42d2eSAkhil Goyal 5811dee7bc7SPablo de Lara break; 5828a9867a6SSlawomir Mrozowicz default: 5838a9867a6SSlawomir Mrozowicz sess->cipher.algo = RTE_CRYPTO_CIPHER_NULL; 58427391b53SPablo de Lara return -ENOTSUP; 5858a9867a6SSlawomir Mrozowicz } 5868a9867a6SSlawomir Mrozowicz 5878a9867a6SSlawomir Mrozowicz return 0; 5888a9867a6SSlawomir Mrozowicz } 5898a9867a6SSlawomir Mrozowicz 5908a9867a6SSlawomir Mrozowicz /* Set session auth parameters */ 5918a9867a6SSlawomir Mrozowicz static int 5928a9867a6SSlawomir Mrozowicz openssl_set_session_auth_parameters(struct openssl_session *sess, 5938a9867a6SSlawomir Mrozowicz const struct rte_crypto_sym_xform *xform) 5948a9867a6SSlawomir Mrozowicz { 5958a9867a6SSlawomir Mrozowicz /* Select auth generate/verify */ 5968a9867a6SSlawomir Mrozowicz sess->auth.operation = xform->auth.op; 5978a9867a6SSlawomir Mrozowicz sess->auth.algo = xform->auth.algo; 5988a9867a6SSlawomir Mrozowicz 599b4b86b09SPablo de Lara sess->auth.digest_length = xform->auth.digest_length; 600b4b86b09SPablo de Lara 6018a9867a6SSlawomir Mrozowicz /* Select auth algo */ 6028a9867a6SSlawomir Mrozowicz switch (xform->auth.algo) { 603e32e4fa8SPablo de Lara case RTE_CRYPTO_AUTH_AES_GMAC: 604b4b86b09SPablo de Lara /* 605b4b86b09SPablo de Lara * OpenSSL requires GMAC to be a GCM operation 606b4b86b09SPablo de Lara * with no cipher data length 607b4b86b09SPablo de Lara */ 608b4b86b09SPablo de Lara sess->cipher.key.length = xform->auth.key.length; 609e32e4fa8SPablo de Lara 610e32e4fa8SPablo de Lara /* Set IV parameters */ 611e32e4fa8SPablo de Lara sess->iv.offset = xform->auth.iv.offset; 612e32e4fa8SPablo de Lara sess->iv.length = xform->auth.iv.length; 613e32e4fa8SPablo de Lara 614e32e4fa8SPablo de Lara if (sess->auth.operation == RTE_CRYPTO_AUTH_OP_GENERATE) 615b4b86b09SPablo de Lara return openssl_set_sess_aead_enc_param(sess, 616b4b86b09SPablo de Lara RTE_CRYPTO_AEAD_AES_GCM, 617b4b86b09SPablo de Lara xform->auth.digest_length, 618b4b86b09SPablo de Lara xform->auth.key.data); 619e32e4fa8SPablo de Lara else 620b4b86b09SPablo de Lara return openssl_set_sess_aead_dec_param(sess, 621b4b86b09SPablo de Lara RTE_CRYPTO_AEAD_AES_GCM, 622b4b86b09SPablo de Lara xform->auth.digest_length, 623b4b86b09SPablo de Lara xform->auth.key.data); 624e32e4fa8SPablo de Lara break; 6258a9867a6SSlawomir Mrozowicz 6268a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_MD5: 6278a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA1: 6288a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA224: 6298a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA256: 6308a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA384: 6318a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA512: 6328a9867a6SSlawomir Mrozowicz sess->auth.mode = OPENSSL_AUTH_AS_AUTH; 6338a9867a6SSlawomir Mrozowicz if (get_auth_algo(xform->auth.algo, 6348a9867a6SSlawomir Mrozowicz &sess->auth.auth.evp_algo) != 0) 6358a9867a6SSlawomir Mrozowicz return -EINVAL; 6368a9867a6SSlawomir Mrozowicz sess->auth.auth.ctx = EVP_MD_CTX_create(); 6378a9867a6SSlawomir Mrozowicz break; 6388a9867a6SSlawomir Mrozowicz 63975adf1eaSKai Ji # if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 64075adf1eaSKai Ji case RTE_CRYPTO_AUTH_MD5_HMAC: 64175adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA1_HMAC: 64275adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA224_HMAC: 64375adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA256_HMAC: 64475adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA384_HMAC: 64575adf1eaSKai Ji case RTE_CRYPTO_AUTH_SHA512_HMAC: 64675adf1eaSKai Ji sess->auth.mode = OPENSSL_AUTH_AS_HMAC; 64775adf1eaSKai Ji 64875adf1eaSKai Ji OSSL_PARAM params[2]; 64975adf1eaSKai Ji const char *algo; 65075adf1eaSKai Ji algo = digest_name_get(xform->auth.algo); 65175adf1eaSKai Ji if (!algo) 65275adf1eaSKai Ji return -EINVAL; 65375adf1eaSKai Ji char algo_name[MAX_OSSL_ALGO_NAME_SIZE]; 65475adf1eaSKai Ji rte_memcpy(algo_name, algo, (sizeof(algo)+1)); 65575adf1eaSKai Ji 65675adf1eaSKai Ji EVP_MAC *mac = EVP_MAC_fetch(NULL, "HMAC", NULL); 65775adf1eaSKai Ji sess->auth.hmac.ctx = EVP_MAC_CTX_new(mac); 65875adf1eaSKai Ji EVP_MAC_free(mac); 65975adf1eaSKai Ji if (get_auth_algo(xform->auth.algo, 66075adf1eaSKai Ji &sess->auth.hmac.evp_algo) != 0) 66175adf1eaSKai Ji return -EINVAL; 66275adf1eaSKai Ji 66375adf1eaSKai Ji params[0] = OSSL_PARAM_construct_utf8_string("digest", 66475adf1eaSKai Ji algo_name, 0); 66575adf1eaSKai Ji params[1] = OSSL_PARAM_construct_end(); 66675adf1eaSKai Ji if (EVP_MAC_init(sess->auth.hmac.ctx, 66775adf1eaSKai Ji xform->auth.key.data, 66875adf1eaSKai Ji xform->auth.key.length, 66975adf1eaSKai Ji params) != 1) 67075adf1eaSKai Ji return -EINVAL; 67175adf1eaSKai Ji break; 67275adf1eaSKai Ji # else 6738a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_MD5_HMAC: 6748a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA1_HMAC: 6758a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA224_HMAC: 6768a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA256_HMAC: 6778a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA384_HMAC: 6788a9867a6SSlawomir Mrozowicz case RTE_CRYPTO_AUTH_SHA512_HMAC: 6798a9867a6SSlawomir Mrozowicz sess->auth.mode = OPENSSL_AUTH_AS_HMAC; 6803d0243feSAkhil Goyal sess->auth.hmac.ctx = HMAC_CTX_new(); 6818a9867a6SSlawomir Mrozowicz if (get_auth_algo(xform->auth.algo, 6828a9867a6SSlawomir Mrozowicz &sess->auth.hmac.evp_algo) != 0) 6838a9867a6SSlawomir Mrozowicz return -EINVAL; 6843d0243feSAkhil Goyal 6853d0243feSAkhil Goyal if (HMAC_Init_ex(sess->auth.hmac.ctx, 6863d0243feSAkhil Goyal xform->auth.key.data, 6873d0243feSAkhil Goyal xform->auth.key.length, 6883d0243feSAkhil Goyal sess->auth.hmac.evp_algo, NULL) != 1) 6893d0243feSAkhil Goyal return -EINVAL; 6908a9867a6SSlawomir Mrozowicz break; 69175adf1eaSKai Ji # endif 6928a9867a6SSlawomir Mrozowicz default: 69327391b53SPablo de Lara return -ENOTSUP; 6948a9867a6SSlawomir Mrozowicz } 6958a9867a6SSlawomir Mrozowicz 6968a9867a6SSlawomir Mrozowicz return 0; 6978a9867a6SSlawomir Mrozowicz } 6988a9867a6SSlawomir Mrozowicz 699b79e4c00SPablo de Lara /* Set session AEAD parameters */ 700b79e4c00SPablo de Lara static int 701b79e4c00SPablo de Lara openssl_set_session_aead_parameters(struct openssl_session *sess, 702b79e4c00SPablo de Lara const struct rte_crypto_sym_xform *xform) 703b79e4c00SPablo de Lara { 704b79e4c00SPablo de Lara /* Select cipher key */ 705b79e4c00SPablo de Lara sess->cipher.key.length = xform->aead.key.length; 706b79e4c00SPablo de Lara 707b79e4c00SPablo de Lara /* Set IV parameters */ 7081a4998dcSPablo de Lara if (xform->aead.algo == RTE_CRYPTO_AEAD_AES_CCM) 7091a4998dcSPablo de Lara /* 7101a4998dcSPablo de Lara * For AES-CCM, the actual IV is placed 7111a4998dcSPablo de Lara * one byte after the start of the IV field, 7121a4998dcSPablo de Lara * according to the API. 7131a4998dcSPablo de Lara */ 7141a4998dcSPablo de Lara sess->iv.offset = xform->aead.iv.offset + 1; 7151a4998dcSPablo de Lara else 716b79e4c00SPablo de Lara sess->iv.offset = xform->aead.iv.offset; 7171a4998dcSPablo de Lara 718b79e4c00SPablo de Lara sess->iv.length = xform->aead.iv.length; 719b79e4c00SPablo de Lara 72046a0547fSPablo de Lara sess->auth.aad_length = xform->aead.aad_length; 721b79e4c00SPablo de Lara sess->auth.digest_length = xform->aead.digest_length; 722b79e4c00SPablo de Lara 723b4b86b09SPablo de Lara sess->aead_algo = xform->aead.algo; 724b4b86b09SPablo de Lara /* Select cipher direction */ 725b4b86b09SPablo de Lara if (xform->aead.op == RTE_CRYPTO_AEAD_OP_ENCRYPT) 726b4b86b09SPablo de Lara return openssl_set_sess_aead_enc_param(sess, xform->aead.algo, 727b4b86b09SPablo de Lara xform->aead.digest_length, xform->aead.key.data); 728b4b86b09SPablo de Lara else 729b4b86b09SPablo de Lara return openssl_set_sess_aead_dec_param(sess, xform->aead.algo, 730b4b86b09SPablo de Lara xform->aead.digest_length, xform->aead.key.data); 731b79e4c00SPablo de Lara } 732b79e4c00SPablo de Lara 7338a9867a6SSlawomir Mrozowicz /** Parse crypto xform chain and set private session parameters */ 7348a9867a6SSlawomir Mrozowicz int 7358a9867a6SSlawomir Mrozowicz openssl_set_session_parameters(struct openssl_session *sess, 7368a9867a6SSlawomir Mrozowicz const struct rte_crypto_sym_xform *xform) 7378a9867a6SSlawomir Mrozowicz { 7388a9867a6SSlawomir Mrozowicz const struct rte_crypto_sym_xform *cipher_xform = NULL; 7398a9867a6SSlawomir Mrozowicz const struct rte_crypto_sym_xform *auth_xform = NULL; 740b79e4c00SPablo de Lara const struct rte_crypto_sym_xform *aead_xform = NULL; 74127391b53SPablo de Lara int ret; 7428a9867a6SSlawomir Mrozowicz 7438a9867a6SSlawomir Mrozowicz sess->chain_order = openssl_get_chain_order(xform); 7448a9867a6SSlawomir Mrozowicz switch (sess->chain_order) { 7458a9867a6SSlawomir Mrozowicz case OPENSSL_CHAIN_ONLY_CIPHER: 7468a9867a6SSlawomir Mrozowicz cipher_xform = xform; 7478a9867a6SSlawomir Mrozowicz break; 7488a9867a6SSlawomir Mrozowicz case OPENSSL_CHAIN_ONLY_AUTH: 7498a9867a6SSlawomir Mrozowicz auth_xform = xform; 7508a9867a6SSlawomir Mrozowicz break; 7518a9867a6SSlawomir Mrozowicz case OPENSSL_CHAIN_CIPHER_AUTH: 7528a9867a6SSlawomir Mrozowicz cipher_xform = xform; 7538a9867a6SSlawomir Mrozowicz auth_xform = xform->next; 7548a9867a6SSlawomir Mrozowicz break; 7558a9867a6SSlawomir Mrozowicz case OPENSSL_CHAIN_AUTH_CIPHER: 7568a9867a6SSlawomir Mrozowicz auth_xform = xform; 7578a9867a6SSlawomir Mrozowicz cipher_xform = xform->next; 7588a9867a6SSlawomir Mrozowicz break; 759b79e4c00SPablo de Lara case OPENSSL_CHAIN_COMBINED: 760b79e4c00SPablo de Lara aead_xform = xform; 761b79e4c00SPablo de Lara break; 7628a9867a6SSlawomir Mrozowicz default: 7638a9867a6SSlawomir Mrozowicz return -EINVAL; 7648a9867a6SSlawomir Mrozowicz } 7658a9867a6SSlawomir Mrozowicz 7660fbd75a9SPablo de Lara /* Default IV length = 0 */ 7670fbd75a9SPablo de Lara sess->iv.length = 0; 7680fbd75a9SPablo de Lara 7698a9867a6SSlawomir Mrozowicz /* cipher_xform must be check before auth_xform */ 7708a9867a6SSlawomir Mrozowicz if (cipher_xform) { 77127391b53SPablo de Lara ret = openssl_set_session_cipher_parameters( 77227391b53SPablo de Lara sess, cipher_xform); 77327391b53SPablo de Lara if (ret != 0) { 774094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, 7758a9867a6SSlawomir Mrozowicz "Invalid/unsupported cipher parameters"); 77627391b53SPablo de Lara return ret; 7778a9867a6SSlawomir Mrozowicz } 7788a9867a6SSlawomir Mrozowicz } 7798a9867a6SSlawomir Mrozowicz 7808a9867a6SSlawomir Mrozowicz if (auth_xform) { 78127391b53SPablo de Lara ret = openssl_set_session_auth_parameters(sess, auth_xform); 78227391b53SPablo de Lara if (ret != 0) { 783094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, 7848a9867a6SSlawomir Mrozowicz "Invalid/unsupported auth parameters"); 78527391b53SPablo de Lara return ret; 7868a9867a6SSlawomir Mrozowicz } 7878a9867a6SSlawomir Mrozowicz } 7888a9867a6SSlawomir Mrozowicz 789b79e4c00SPablo de Lara if (aead_xform) { 79027391b53SPablo de Lara ret = openssl_set_session_aead_parameters(sess, aead_xform); 79127391b53SPablo de Lara if (ret != 0) { 792094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, 7930b0a6e5aSPablo de Lara "Invalid/unsupported AEAD parameters"); 79427391b53SPablo de Lara return ret; 795b79e4c00SPablo de Lara } 796b79e4c00SPablo de Lara } 797b79e4c00SPablo de Lara 7988a9867a6SSlawomir Mrozowicz return 0; 7998a9867a6SSlawomir Mrozowicz } 8008a9867a6SSlawomir Mrozowicz 8018a9867a6SSlawomir Mrozowicz /** Reset private session parameters */ 8028a9867a6SSlawomir Mrozowicz void 8038a9867a6SSlawomir Mrozowicz openssl_reset_session(struct openssl_session *sess) 8048a9867a6SSlawomir Mrozowicz { 8058a9867a6SSlawomir Mrozowicz EVP_CIPHER_CTX_free(sess->cipher.ctx); 8068a9867a6SSlawomir Mrozowicz 8071dee7bc7SPablo de Lara if (sess->chain_order == OPENSSL_CHAIN_CIPHER_BPI) 8081dee7bc7SPablo de Lara EVP_CIPHER_CTX_free(sess->cipher.bpi_ctx); 8091dee7bc7SPablo de Lara 8108a9867a6SSlawomir Mrozowicz switch (sess->auth.mode) { 8118a9867a6SSlawomir Mrozowicz case OPENSSL_AUTH_AS_AUTH: 8128a9867a6SSlawomir Mrozowicz EVP_MD_CTX_destroy(sess->auth.auth.ctx); 8138a9867a6SSlawomir Mrozowicz break; 8148a9867a6SSlawomir Mrozowicz case OPENSSL_AUTH_AS_HMAC: 8158a9867a6SSlawomir Mrozowicz EVP_PKEY_free(sess->auth.hmac.pkey); 81675adf1eaSKai Ji # if OPENSSL_VERSION_NUMBER >= 0x30000000L 81775adf1eaSKai Ji EVP_MAC_CTX_free(sess->auth.hmac.ctx); 81875adf1eaSKai Ji # else 8193d0243feSAkhil Goyal HMAC_CTX_free(sess->auth.hmac.ctx); 82075adf1eaSKai Ji # endif 8218a9867a6SSlawomir Mrozowicz break; 8228a9867a6SSlawomir Mrozowicz default: 8238a9867a6SSlawomir Mrozowicz break; 8248a9867a6SSlawomir Mrozowicz } 8258a9867a6SSlawomir Mrozowicz } 8268a9867a6SSlawomir Mrozowicz 8278a9867a6SSlawomir Mrozowicz /** Provide session for operation */ 8283e9d6bd4SSunila Sahu static void * 8298a9867a6SSlawomir Mrozowicz get_session(struct openssl_qp *qp, struct rte_crypto_op *op) 8308a9867a6SSlawomir Mrozowicz { 8318a9867a6SSlawomir Mrozowicz struct openssl_session *sess = NULL; 8323e9d6bd4SSunila Sahu struct openssl_asym_session *asym_sess = NULL; 8338a9867a6SSlawomir Mrozowicz 8345209df0dSPablo de Lara if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) { 8353e9d6bd4SSunila Sahu if (op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) { 8368a9867a6SSlawomir Mrozowicz /* get existing session */ 83770c5c3d1SSlawomir Mrozowicz if (likely(op->sym->session != NULL)) 8388a9867a6SSlawomir Mrozowicz sess = (struct openssl_session *) 839012c5076SPablo de Lara get_sym_session_private_data( 840b3bbd9e5SSlawomir Mrozowicz op->sym->session, 841b3bbd9e5SSlawomir Mrozowicz cryptodev_driver_id); 8428a9867a6SSlawomir Mrozowicz } else { 8433e9d6bd4SSunila Sahu if (likely(op->asym->session != NULL)) 8443e9d6bd4SSunila Sahu asym_sess = (struct openssl_asym_session *) 8451f1e4b7cSCiara Power op->asym->session->sess_private_data; 8463e9d6bd4SSunila Sahu if (asym_sess == NULL) 8473e9d6bd4SSunila Sahu op->status = 8483e9d6bd4SSunila Sahu RTE_CRYPTO_OP_STATUS_INVALID_SESSION; 8493e9d6bd4SSunila Sahu return asym_sess; 8503e9d6bd4SSunila Sahu } 8513e9d6bd4SSunila Sahu } else { 8523e9d6bd4SSunila Sahu /* sessionless asymmetric not supported */ 8533e9d6bd4SSunila Sahu if (op->type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) 8543e9d6bd4SSunila Sahu return NULL; 8553e9d6bd4SSunila Sahu 8568a9867a6SSlawomir Mrozowicz /* provide internal session */ 857a0c2b3d8SJunxiao Shi void *_sess = rte_cryptodev_sym_session_create(qp->sess_mp); 858b3bbd9e5SSlawomir Mrozowicz void *_sess_private_data = NULL; 8598a9867a6SSlawomir Mrozowicz 860a0c2b3d8SJunxiao Shi if (_sess == NULL) 861b3bbd9e5SSlawomir Mrozowicz return NULL; 8628a9867a6SSlawomir Mrozowicz 863725d2a7fSFan Zhang if (rte_mempool_get(qp->sess_mp_priv, 864725d2a7fSFan Zhang (void **)&_sess_private_data)) 865b3bbd9e5SSlawomir Mrozowicz return NULL; 866b3bbd9e5SSlawomir Mrozowicz 867b3bbd9e5SSlawomir Mrozowicz sess = (struct openssl_session *)_sess_private_data; 868b3bbd9e5SSlawomir Mrozowicz 869b3bbd9e5SSlawomir Mrozowicz if (unlikely(openssl_set_session_parameters(sess, 870b3bbd9e5SSlawomir Mrozowicz op->sym->xform) != 0)) { 8718a9867a6SSlawomir Mrozowicz rte_mempool_put(qp->sess_mp, _sess); 872725d2a7fSFan Zhang rte_mempool_put(qp->sess_mp_priv, _sess_private_data); 8738a9867a6SSlawomir Mrozowicz sess = NULL; 8748a9867a6SSlawomir Mrozowicz } 875b3bbd9e5SSlawomir Mrozowicz op->sym->session = (struct rte_cryptodev_sym_session *)_sess; 876012c5076SPablo de Lara set_sym_session_private_data(op->sym->session, 877012c5076SPablo de Lara cryptodev_driver_id, _sess_private_data); 8788a9867a6SSlawomir Mrozowicz } 8798a9867a6SSlawomir Mrozowicz 8808a9867a6SSlawomir Mrozowicz if (sess == NULL) 8818a9867a6SSlawomir Mrozowicz op->status = RTE_CRYPTO_OP_STATUS_INVALID_SESSION; 8828a9867a6SSlawomir Mrozowicz 8838a9867a6SSlawomir Mrozowicz return sess; 8848a9867a6SSlawomir Mrozowicz } 8858a9867a6SSlawomir Mrozowicz 8868a9867a6SSlawomir Mrozowicz /* 8878a9867a6SSlawomir Mrozowicz *------------------------------------------------------------------------------ 8888a9867a6SSlawomir Mrozowicz * Process Operations 8898a9867a6SSlawomir Mrozowicz *------------------------------------------------------------------------------ 8908a9867a6SSlawomir Mrozowicz */ 8918f675fc7STomasz Kulasek static inline int 8928f675fc7STomasz Kulasek process_openssl_encryption_update(struct rte_mbuf *mbuf_src, int offset, 893b795e127SAkhil Goyal uint8_t **dst, int srclen, EVP_CIPHER_CTX *ctx, uint8_t inplace) 8948f675fc7STomasz Kulasek { 8958f675fc7STomasz Kulasek struct rte_mbuf *m; 8968f675fc7STomasz Kulasek int dstlen; 8978f675fc7STomasz Kulasek int l, n = srclen; 898b795e127SAkhil Goyal uint8_t *src, temp[EVP_CIPHER_CTX_block_size(ctx)]; 8998f675fc7STomasz Kulasek 9008f675fc7STomasz Kulasek for (m = mbuf_src; m != NULL && offset > rte_pktmbuf_data_len(m); 9018f675fc7STomasz Kulasek m = m->next) 9028f675fc7STomasz Kulasek offset -= rte_pktmbuf_data_len(m); 9038f675fc7STomasz Kulasek 9048f675fc7STomasz Kulasek if (m == 0) 9058f675fc7STomasz Kulasek return -1; 9068f675fc7STomasz Kulasek 9078f675fc7STomasz Kulasek src = rte_pktmbuf_mtod_offset(m, uint8_t *, offset); 908b795e127SAkhil Goyal if (inplace) 909b795e127SAkhil Goyal *dst = src; 9108f675fc7STomasz Kulasek 9118f675fc7STomasz Kulasek l = rte_pktmbuf_data_len(m) - offset; 9128f675fc7STomasz Kulasek if (srclen <= l) { 9138f675fc7STomasz Kulasek if (EVP_EncryptUpdate(ctx, *dst, &dstlen, src, srclen) <= 0) 9148f675fc7STomasz Kulasek return -1; 9158f675fc7STomasz Kulasek *dst += l; 9168f675fc7STomasz Kulasek return 0; 9178f675fc7STomasz Kulasek } 9188f675fc7STomasz Kulasek 9198f675fc7STomasz Kulasek if (EVP_EncryptUpdate(ctx, *dst, &dstlen, src, l) <= 0) 9208f675fc7STomasz Kulasek return -1; 9218f675fc7STomasz Kulasek 9228f675fc7STomasz Kulasek *dst += dstlen; 9238f675fc7STomasz Kulasek n -= l; 9248f675fc7STomasz Kulasek 9258f675fc7STomasz Kulasek for (m = m->next; (m != NULL) && (n > 0); m = m->next) { 926b795e127SAkhil Goyal uint8_t diff = l - dstlen, rem; 927b795e127SAkhil Goyal 9288f675fc7STomasz Kulasek src = rte_pktmbuf_mtod(m, uint8_t *); 929b795e127SAkhil Goyal l = RTE_MIN(rte_pktmbuf_data_len(m), n); 930b795e127SAkhil Goyal if (diff && inplace) { 931b795e127SAkhil Goyal rem = RTE_MIN(l, 932b795e127SAkhil Goyal (EVP_CIPHER_CTX_block_size(ctx) - diff)); 933b795e127SAkhil Goyal if (EVP_EncryptUpdate(ctx, temp, 934b795e127SAkhil Goyal &dstlen, src, rem) <= 0) 935b795e127SAkhil Goyal return -1; 936b795e127SAkhil Goyal n -= rem; 937b795e127SAkhil Goyal rte_memcpy(*dst, temp, diff); 938b795e127SAkhil Goyal rte_memcpy(src, temp + diff, rem); 939b795e127SAkhil Goyal src += rem; 940b795e127SAkhil Goyal l -= rem; 941b795e127SAkhil Goyal } 942b795e127SAkhil Goyal if (inplace) 943b795e127SAkhil Goyal *dst = src; 9448f675fc7STomasz Kulasek if (EVP_EncryptUpdate(ctx, *dst, &dstlen, src, l) <= 0) 9458f675fc7STomasz Kulasek return -1; 9468f675fc7STomasz Kulasek *dst += dstlen; 9478f675fc7STomasz Kulasek n -= l; 9488f675fc7STomasz Kulasek } 9498f675fc7STomasz Kulasek 9508f675fc7STomasz Kulasek return 0; 9518f675fc7STomasz Kulasek } 9528f675fc7STomasz Kulasek 9538f675fc7STomasz Kulasek static inline int 9548f675fc7STomasz Kulasek process_openssl_decryption_update(struct rte_mbuf *mbuf_src, int offset, 955b795e127SAkhil Goyal uint8_t **dst, int srclen, EVP_CIPHER_CTX *ctx, uint8_t inplace) 9568f675fc7STomasz Kulasek { 9578f675fc7STomasz Kulasek struct rte_mbuf *m; 9588f675fc7STomasz Kulasek int dstlen; 9598f675fc7STomasz Kulasek int l, n = srclen; 960b795e127SAkhil Goyal uint8_t *src, temp[EVP_CIPHER_CTX_block_size(ctx)]; 9618f675fc7STomasz Kulasek 9628f675fc7STomasz Kulasek for (m = mbuf_src; m != NULL && offset > rte_pktmbuf_data_len(m); 9638f675fc7STomasz Kulasek m = m->next) 9648f675fc7STomasz Kulasek offset -= rte_pktmbuf_data_len(m); 9658f675fc7STomasz Kulasek 9668f675fc7STomasz Kulasek if (m == 0) 9678f675fc7STomasz Kulasek return -1; 9688f675fc7STomasz Kulasek 9698f675fc7STomasz Kulasek src = rte_pktmbuf_mtod_offset(m, uint8_t *, offset); 970b795e127SAkhil Goyal if (inplace) 971b795e127SAkhil Goyal *dst = src; 9728f675fc7STomasz Kulasek 9738f675fc7STomasz Kulasek l = rte_pktmbuf_data_len(m) - offset; 9748f675fc7STomasz Kulasek if (srclen <= l) { 9758f675fc7STomasz Kulasek if (EVP_DecryptUpdate(ctx, *dst, &dstlen, src, srclen) <= 0) 9768f675fc7STomasz Kulasek return -1; 9778f675fc7STomasz Kulasek *dst += l; 9788f675fc7STomasz Kulasek return 0; 9798f675fc7STomasz Kulasek } 9808f675fc7STomasz Kulasek 9818f675fc7STomasz Kulasek if (EVP_DecryptUpdate(ctx, *dst, &dstlen, src, l) <= 0) 9828f675fc7STomasz Kulasek return -1; 9838f675fc7STomasz Kulasek 9848f675fc7STomasz Kulasek *dst += dstlen; 9858f675fc7STomasz Kulasek n -= l; 9868f675fc7STomasz Kulasek 9878f675fc7STomasz Kulasek for (m = m->next; (m != NULL) && (n > 0); m = m->next) { 988b795e127SAkhil Goyal uint8_t diff = l - dstlen, rem; 989b795e127SAkhil Goyal 9908f675fc7STomasz Kulasek src = rte_pktmbuf_mtod(m, uint8_t *); 991b795e127SAkhil Goyal l = RTE_MIN(rte_pktmbuf_data_len(m), n); 992b795e127SAkhil Goyal if (diff && inplace) { 993b795e127SAkhil Goyal rem = RTE_MIN(l, 994b795e127SAkhil Goyal (EVP_CIPHER_CTX_block_size(ctx) - diff)); 995b795e127SAkhil Goyal if (EVP_DecryptUpdate(ctx, temp, 996b795e127SAkhil Goyal &dstlen, src, rem) <= 0) 997b795e127SAkhil Goyal return -1; 998b795e127SAkhil Goyal n -= rem; 999b795e127SAkhil Goyal rte_memcpy(*dst, temp, diff); 1000b795e127SAkhil Goyal rte_memcpy(src, temp + diff, rem); 1001b795e127SAkhil Goyal src += rem; 1002b795e127SAkhil Goyal l -= rem; 1003b795e127SAkhil Goyal } 1004b795e127SAkhil Goyal if (inplace) 1005b795e127SAkhil Goyal *dst = src; 10068f675fc7STomasz Kulasek if (EVP_DecryptUpdate(ctx, *dst, &dstlen, src, l) <= 0) 10078f675fc7STomasz Kulasek return -1; 10088f675fc7STomasz Kulasek *dst += dstlen; 10098f675fc7STomasz Kulasek n -= l; 10108f675fc7STomasz Kulasek } 10118f675fc7STomasz Kulasek 10128f675fc7STomasz Kulasek return 0; 10138f675fc7STomasz Kulasek } 10148a9867a6SSlawomir Mrozowicz 10158a9867a6SSlawomir Mrozowicz /** Process standard openssl cipher encryption */ 10168a9867a6SSlawomir Mrozowicz static int 10178f675fc7STomasz Kulasek process_openssl_cipher_encrypt(struct rte_mbuf *mbuf_src, uint8_t *dst, 1018b795e127SAkhil Goyal int offset, uint8_t *iv, int srclen, EVP_CIPHER_CTX *ctx, 1019b795e127SAkhil Goyal uint8_t inplace) 10208a9867a6SSlawomir Mrozowicz { 10218f675fc7STomasz Kulasek int totlen; 10228a9867a6SSlawomir Mrozowicz 1023efd42d2eSAkhil Goyal if (EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv) <= 0) 10248a9867a6SSlawomir Mrozowicz goto process_cipher_encrypt_err; 10258a9867a6SSlawomir Mrozowicz 10266b283a03SPiotr Azarewicz EVP_CIPHER_CTX_set_padding(ctx, 0); 10276b283a03SPiotr Azarewicz 10288f675fc7STomasz Kulasek if (process_openssl_encryption_update(mbuf_src, offset, &dst, 1029b795e127SAkhil Goyal srclen, ctx, inplace)) 10308a9867a6SSlawomir Mrozowicz goto process_cipher_encrypt_err; 10318a9867a6SSlawomir Mrozowicz 10328f675fc7STomasz Kulasek if (EVP_EncryptFinal_ex(ctx, dst, &totlen) <= 0) 10338a9867a6SSlawomir Mrozowicz goto process_cipher_encrypt_err; 10348a9867a6SSlawomir Mrozowicz 10358a9867a6SSlawomir Mrozowicz return 0; 10368a9867a6SSlawomir Mrozowicz 10378a9867a6SSlawomir Mrozowicz process_cipher_encrypt_err: 1038094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl cipher encrypt failed"); 10398a9867a6SSlawomir Mrozowicz return -EINVAL; 10408a9867a6SSlawomir Mrozowicz } 10418a9867a6SSlawomir Mrozowicz 10421dee7bc7SPablo de Lara /** Process standard openssl cipher encryption */ 10431dee7bc7SPablo de Lara static int 10441dee7bc7SPablo de Lara process_openssl_cipher_bpi_encrypt(uint8_t *src, uint8_t *dst, 10451dee7bc7SPablo de Lara uint8_t *iv, int srclen, 10461dee7bc7SPablo de Lara EVP_CIPHER_CTX *ctx) 10471dee7bc7SPablo de Lara { 10481dee7bc7SPablo de Lara uint8_t i; 10491dee7bc7SPablo de Lara uint8_t encrypted_iv[DES_BLOCK_SIZE]; 10501dee7bc7SPablo de Lara int encrypted_ivlen; 10511dee7bc7SPablo de Lara 10521dee7bc7SPablo de Lara if (EVP_EncryptUpdate(ctx, encrypted_iv, &encrypted_ivlen, 10531dee7bc7SPablo de Lara iv, DES_BLOCK_SIZE) <= 0) 10541dee7bc7SPablo de Lara goto process_cipher_encrypt_err; 10551dee7bc7SPablo de Lara 10561dee7bc7SPablo de Lara for (i = 0; i < srclen; i++) 10571dee7bc7SPablo de Lara *(dst + i) = *(src + i) ^ (encrypted_iv[i]); 10581dee7bc7SPablo de Lara 10591dee7bc7SPablo de Lara return 0; 10601dee7bc7SPablo de Lara 10611dee7bc7SPablo de Lara process_cipher_encrypt_err: 1062094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl cipher bpi encrypt failed"); 10631dee7bc7SPablo de Lara return -EINVAL; 10641dee7bc7SPablo de Lara } 10658a9867a6SSlawomir Mrozowicz /** Process standard openssl cipher decryption */ 10668a9867a6SSlawomir Mrozowicz static int 10678f675fc7STomasz Kulasek process_openssl_cipher_decrypt(struct rte_mbuf *mbuf_src, uint8_t *dst, 1068b795e127SAkhil Goyal int offset, uint8_t *iv, int srclen, EVP_CIPHER_CTX *ctx, 1069b795e127SAkhil Goyal uint8_t inplace) 10708a9867a6SSlawomir Mrozowicz { 10718f675fc7STomasz Kulasek int totlen; 10728a9867a6SSlawomir Mrozowicz 1073efd42d2eSAkhil Goyal if (EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv) <= 0) 10748a9867a6SSlawomir Mrozowicz goto process_cipher_decrypt_err; 10758a9867a6SSlawomir Mrozowicz 10765d63ef31SPiotr Azarewicz EVP_CIPHER_CTX_set_padding(ctx, 0); 10778a9867a6SSlawomir Mrozowicz 10788f675fc7STomasz Kulasek if (process_openssl_decryption_update(mbuf_src, offset, &dst, 1079b795e127SAkhil Goyal srclen, ctx, inplace)) 10808a9867a6SSlawomir Mrozowicz goto process_cipher_decrypt_err; 10818a9867a6SSlawomir Mrozowicz 10828f675fc7STomasz Kulasek if (EVP_DecryptFinal_ex(ctx, dst, &totlen) <= 0) 10838a9867a6SSlawomir Mrozowicz goto process_cipher_decrypt_err; 10848a9867a6SSlawomir Mrozowicz return 0; 10858a9867a6SSlawomir Mrozowicz 10868a9867a6SSlawomir Mrozowicz process_cipher_decrypt_err: 1087094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl cipher decrypt failed"); 10888a9867a6SSlawomir Mrozowicz return -EINVAL; 10898a9867a6SSlawomir Mrozowicz } 10908a9867a6SSlawomir Mrozowicz 10918a9867a6SSlawomir Mrozowicz /** Process cipher des 3 ctr encryption, decryption algorithm */ 10928a9867a6SSlawomir Mrozowicz static int 10938f675fc7STomasz Kulasek process_openssl_cipher_des3ctr(struct rte_mbuf *mbuf_src, uint8_t *dst, 10948f675fc7STomasz Kulasek int offset, uint8_t *iv, uint8_t *key, int srclen, 10958f675fc7STomasz Kulasek EVP_CIPHER_CTX *ctx) 10968a9867a6SSlawomir Mrozowicz { 10978a9867a6SSlawomir Mrozowicz uint8_t ebuf[8], ctr[8]; 10988a9867a6SSlawomir Mrozowicz int unused, n; 10998f675fc7STomasz Kulasek struct rte_mbuf *m; 11008f675fc7STomasz Kulasek uint8_t *src; 11018f675fc7STomasz Kulasek int l; 11028f675fc7STomasz Kulasek 11038f675fc7STomasz Kulasek for (m = mbuf_src; m != NULL && offset > rte_pktmbuf_data_len(m); 11048f675fc7STomasz Kulasek m = m->next) 11058f675fc7STomasz Kulasek offset -= rte_pktmbuf_data_len(m); 11068f675fc7STomasz Kulasek 11078f675fc7STomasz Kulasek if (m == 0) 11088f675fc7STomasz Kulasek goto process_cipher_des3ctr_err; 11098f675fc7STomasz Kulasek 11108f675fc7STomasz Kulasek src = rte_pktmbuf_mtod_offset(m, uint8_t *, offset); 11118f675fc7STomasz Kulasek l = rte_pktmbuf_data_len(m) - offset; 11128a9867a6SSlawomir Mrozowicz 11138a9867a6SSlawomir Mrozowicz /* We use 3DES encryption also for decryption. 11148a9867a6SSlawomir Mrozowicz * IV is not important for 3DES ecb 11158a9867a6SSlawomir Mrozowicz */ 11168a9867a6SSlawomir Mrozowicz if (EVP_EncryptInit_ex(ctx, EVP_des_ede3_ecb(), NULL, key, NULL) <= 0) 11178a9867a6SSlawomir Mrozowicz goto process_cipher_des3ctr_err; 11188a9867a6SSlawomir Mrozowicz 11198a9867a6SSlawomir Mrozowicz memcpy(ctr, iv, 8); 11208a9867a6SSlawomir Mrozowicz 11218f675fc7STomasz Kulasek for (n = 0; n < srclen; n++) { 11228a9867a6SSlawomir Mrozowicz if (n % 8 == 0) { 11238a9867a6SSlawomir Mrozowicz if (EVP_EncryptUpdate(ctx, 11248a9867a6SSlawomir Mrozowicz (unsigned char *)&ebuf, &unused, 11258a9867a6SSlawomir Mrozowicz (const unsigned char *)&ctr, 8) <= 0) 11268a9867a6SSlawomir Mrozowicz goto process_cipher_des3ctr_err; 11278a9867a6SSlawomir Mrozowicz ctr_inc(ctr); 11288a9867a6SSlawomir Mrozowicz } 11298f675fc7STomasz Kulasek dst[n] = *(src++) ^ ebuf[n % 8]; 11308f675fc7STomasz Kulasek 11318f675fc7STomasz Kulasek l--; 11328f675fc7STomasz Kulasek if (!l) { 11338f675fc7STomasz Kulasek m = m->next; 11348f675fc7STomasz Kulasek if (m) { 11358f675fc7STomasz Kulasek src = rte_pktmbuf_mtod(m, uint8_t *); 11368f675fc7STomasz Kulasek l = rte_pktmbuf_data_len(m); 11378f675fc7STomasz Kulasek } 11388f675fc7STomasz Kulasek } 11398a9867a6SSlawomir Mrozowicz } 11408a9867a6SSlawomir Mrozowicz 11418a9867a6SSlawomir Mrozowicz return 0; 11428a9867a6SSlawomir Mrozowicz 11438a9867a6SSlawomir Mrozowicz process_cipher_des3ctr_err: 1144094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl cipher des 3 ede ctr failed"); 11458a9867a6SSlawomir Mrozowicz return -EINVAL; 11468a9867a6SSlawomir Mrozowicz } 11478a9867a6SSlawomir Mrozowicz 11481a4998dcSPablo de Lara /** Process AES-GCM encrypt algorithm */ 11498a9867a6SSlawomir Mrozowicz static int 11508f675fc7STomasz Kulasek process_openssl_auth_encryption_gcm(struct rte_mbuf *mbuf_src, int offset, 1151b4b86b09SPablo de Lara int srclen, uint8_t *aad, int aadlen, uint8_t *iv, 1152b4b86b09SPablo de Lara uint8_t *dst, uint8_t *tag, EVP_CIPHER_CTX *ctx) 11538a9867a6SSlawomir Mrozowicz { 11548a9867a6SSlawomir Mrozowicz int len = 0, unused = 0; 11558a9867a6SSlawomir Mrozowicz uint8_t empty[] = {}; 11568a9867a6SSlawomir Mrozowicz 1157b4b86b09SPablo de Lara if (EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv) <= 0) 11588a9867a6SSlawomir Mrozowicz goto process_auth_encryption_gcm_err; 11598a9867a6SSlawomir Mrozowicz 11608f675fc7STomasz Kulasek if (aadlen > 0) 11618a9867a6SSlawomir Mrozowicz if (EVP_EncryptUpdate(ctx, NULL, &len, aad, aadlen) <= 0) 11628a9867a6SSlawomir Mrozowicz goto process_auth_encryption_gcm_err; 11638a9867a6SSlawomir Mrozowicz 11648f675fc7STomasz Kulasek if (srclen > 0) 11658f675fc7STomasz Kulasek if (process_openssl_encryption_update(mbuf_src, offset, &dst, 1166b795e127SAkhil Goyal srclen, ctx, 0)) 11678f675fc7STomasz Kulasek goto process_auth_encryption_gcm_err; 11688f675fc7STomasz Kulasek 11698a9867a6SSlawomir Mrozowicz /* Workaround open ssl bug in version less then 1.0.1f */ 11708a9867a6SSlawomir Mrozowicz if (EVP_EncryptUpdate(ctx, empty, &unused, empty, 0) <= 0) 11718a9867a6SSlawomir Mrozowicz goto process_auth_encryption_gcm_err; 11728a9867a6SSlawomir Mrozowicz 11738f675fc7STomasz Kulasek if (EVP_EncryptFinal_ex(ctx, dst, &len) <= 0) 11748a9867a6SSlawomir Mrozowicz goto process_auth_encryption_gcm_err; 11758a9867a6SSlawomir Mrozowicz 11768a9867a6SSlawomir Mrozowicz if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag) <= 0) 11778a9867a6SSlawomir Mrozowicz goto process_auth_encryption_gcm_err; 11788a9867a6SSlawomir Mrozowicz 11798a9867a6SSlawomir Mrozowicz return 0; 11808a9867a6SSlawomir Mrozowicz 11818a9867a6SSlawomir Mrozowicz process_auth_encryption_gcm_err: 1182094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl auth encryption gcm failed"); 11838a9867a6SSlawomir Mrozowicz return -EINVAL; 11848a9867a6SSlawomir Mrozowicz } 11858a9867a6SSlawomir Mrozowicz 11861a4998dcSPablo de Lara /** Process AES-CCM encrypt algorithm */ 11871a4998dcSPablo de Lara static int 11881a4998dcSPablo de Lara process_openssl_auth_encryption_ccm(struct rte_mbuf *mbuf_src, int offset, 11891a4998dcSPablo de Lara int srclen, uint8_t *aad, int aadlen, uint8_t *iv, 11901a4998dcSPablo de Lara uint8_t *dst, uint8_t *tag, uint8_t taglen, EVP_CIPHER_CTX *ctx) 11911a4998dcSPablo de Lara { 11921a4998dcSPablo de Lara int len = 0; 11931a4998dcSPablo de Lara 11941a4998dcSPablo de Lara if (EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv) <= 0) 11951a4998dcSPablo de Lara goto process_auth_encryption_ccm_err; 11961a4998dcSPablo de Lara 11971a4998dcSPablo de Lara if (EVP_EncryptUpdate(ctx, NULL, &len, NULL, srclen) <= 0) 11981a4998dcSPablo de Lara goto process_auth_encryption_ccm_err; 11991a4998dcSPablo de Lara 12001a4998dcSPablo de Lara if (aadlen > 0) 12011a4998dcSPablo de Lara /* 12021a4998dcSPablo de Lara * For AES-CCM, the actual AAD is placed 12031a4998dcSPablo de Lara * 18 bytes after the start of the AAD field, 12041a4998dcSPablo de Lara * according to the API. 12051a4998dcSPablo de Lara */ 12061a4998dcSPablo de Lara if (EVP_EncryptUpdate(ctx, NULL, &len, aad + 18, aadlen) <= 0) 12071a4998dcSPablo de Lara goto process_auth_encryption_ccm_err; 12081a4998dcSPablo de Lara 1209589f5e03SCiara Power if (srclen >= 0) 12101a4998dcSPablo de Lara if (process_openssl_encryption_update(mbuf_src, offset, &dst, 1211b795e127SAkhil Goyal srclen, ctx, 0)) 12121a4998dcSPablo de Lara goto process_auth_encryption_ccm_err; 12131a4998dcSPablo de Lara 12141a4998dcSPablo de Lara if (EVP_EncryptFinal_ex(ctx, dst, &len) <= 0) 12151a4998dcSPablo de Lara goto process_auth_encryption_ccm_err; 12161a4998dcSPablo de Lara 12171a4998dcSPablo de Lara if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_GET_TAG, taglen, tag) <= 0) 12181a4998dcSPablo de Lara goto process_auth_encryption_ccm_err; 12191a4998dcSPablo de Lara 12201a4998dcSPablo de Lara return 0; 12211a4998dcSPablo de Lara 12221a4998dcSPablo de Lara process_auth_encryption_ccm_err: 1223094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl auth encryption ccm failed"); 12241a4998dcSPablo de Lara return -EINVAL; 12251a4998dcSPablo de Lara } 12261a4998dcSPablo de Lara 12271a4998dcSPablo de Lara /** Process AES-GCM decrypt algorithm */ 12288a9867a6SSlawomir Mrozowicz static int 12298f675fc7STomasz Kulasek process_openssl_auth_decryption_gcm(struct rte_mbuf *mbuf_src, int offset, 1230b4b86b09SPablo de Lara int srclen, uint8_t *aad, int aadlen, uint8_t *iv, 1231b4b86b09SPablo de Lara uint8_t *dst, uint8_t *tag, EVP_CIPHER_CTX *ctx) 12328a9867a6SSlawomir Mrozowicz { 12338a9867a6SSlawomir Mrozowicz int len = 0, unused = 0; 12348a9867a6SSlawomir Mrozowicz uint8_t empty[] = {}; 12358a9867a6SSlawomir Mrozowicz 12368a9867a6SSlawomir Mrozowicz if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, 16, tag) <= 0) 12378a9867a6SSlawomir Mrozowicz goto process_auth_decryption_gcm_err; 12388a9867a6SSlawomir Mrozowicz 1239b4b86b09SPablo de Lara if (EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv) <= 0) 12408a9867a6SSlawomir Mrozowicz goto process_auth_decryption_gcm_err; 12418a9867a6SSlawomir Mrozowicz 12428f675fc7STomasz Kulasek if (aadlen > 0) 12438a9867a6SSlawomir Mrozowicz if (EVP_DecryptUpdate(ctx, NULL, &len, aad, aadlen) <= 0) 12448a9867a6SSlawomir Mrozowicz goto process_auth_decryption_gcm_err; 12458a9867a6SSlawomir Mrozowicz 12468f675fc7STomasz Kulasek if (srclen > 0) 12478f675fc7STomasz Kulasek if (process_openssl_decryption_update(mbuf_src, offset, &dst, 1248b795e127SAkhil Goyal srclen, ctx, 0)) 12498f675fc7STomasz Kulasek goto process_auth_decryption_gcm_err; 12508f675fc7STomasz Kulasek 12518a9867a6SSlawomir Mrozowicz /* Workaround open ssl bug in version less then 1.0.1f */ 12528a9867a6SSlawomir Mrozowicz if (EVP_DecryptUpdate(ctx, empty, &unused, empty, 0) <= 0) 12538a9867a6SSlawomir Mrozowicz goto process_auth_decryption_gcm_err; 12548a9867a6SSlawomir Mrozowicz 12558f675fc7STomasz Kulasek if (EVP_DecryptFinal_ex(ctx, dst, &len) <= 0) 12561a4998dcSPablo de Lara return -EFAULT; 12578a9867a6SSlawomir Mrozowicz 12588a9867a6SSlawomir Mrozowicz return 0; 12598a9867a6SSlawomir Mrozowicz 12608a9867a6SSlawomir Mrozowicz process_auth_decryption_gcm_err: 1261094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl auth decryption gcm failed"); 12628a9867a6SSlawomir Mrozowicz return -EINVAL; 12631a4998dcSPablo de Lara } 12648a9867a6SSlawomir Mrozowicz 12651a4998dcSPablo de Lara /** Process AES-CCM decrypt algorithm */ 12661a4998dcSPablo de Lara static int 12671a4998dcSPablo de Lara process_openssl_auth_decryption_ccm(struct rte_mbuf *mbuf_src, int offset, 12681a4998dcSPablo de Lara int srclen, uint8_t *aad, int aadlen, uint8_t *iv, 12691a4998dcSPablo de Lara uint8_t *dst, uint8_t *tag, uint8_t tag_len, 12701a4998dcSPablo de Lara EVP_CIPHER_CTX *ctx) 12711a4998dcSPablo de Lara { 12721a4998dcSPablo de Lara int len = 0; 12731a4998dcSPablo de Lara 12741a4998dcSPablo de Lara if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, tag_len, tag) <= 0) 12751a4998dcSPablo de Lara goto process_auth_decryption_ccm_err; 12761a4998dcSPablo de Lara 12771a4998dcSPablo de Lara if (EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv) <= 0) 12781a4998dcSPablo de Lara goto process_auth_decryption_ccm_err; 12791a4998dcSPablo de Lara 12801a4998dcSPablo de Lara if (EVP_DecryptUpdate(ctx, NULL, &len, NULL, srclen) <= 0) 12811a4998dcSPablo de Lara goto process_auth_decryption_ccm_err; 12821a4998dcSPablo de Lara 12831a4998dcSPablo de Lara if (aadlen > 0) 12841a4998dcSPablo de Lara /* 12851a4998dcSPablo de Lara * For AES-CCM, the actual AAD is placed 12861a4998dcSPablo de Lara * 18 bytes after the start of the AAD field, 12871a4998dcSPablo de Lara * according to the API. 12881a4998dcSPablo de Lara */ 12891a4998dcSPablo de Lara if (EVP_DecryptUpdate(ctx, NULL, &len, aad + 18, aadlen) <= 0) 12901a4998dcSPablo de Lara goto process_auth_decryption_ccm_err; 12911a4998dcSPablo de Lara 1292589f5e03SCiara Power if (srclen >= 0) 12931a4998dcSPablo de Lara if (process_openssl_decryption_update(mbuf_src, offset, &dst, 1294b795e127SAkhil Goyal srclen, ctx, 0)) 12958a9867a6SSlawomir Mrozowicz return -EFAULT; 12961a4998dcSPablo de Lara 12971a4998dcSPablo de Lara return 0; 12981a4998dcSPablo de Lara 12991a4998dcSPablo de Lara process_auth_decryption_ccm_err: 1300094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl auth decryption ccm failed"); 13011a4998dcSPablo de Lara return -EINVAL; 13028a9867a6SSlawomir Mrozowicz } 13038a9867a6SSlawomir Mrozowicz 13048a9867a6SSlawomir Mrozowicz /** Process standard openssl auth algorithms */ 13058a9867a6SSlawomir Mrozowicz static int 13068f675fc7STomasz Kulasek process_openssl_auth(struct rte_mbuf *mbuf_src, uint8_t *dst, int offset, 13078a9867a6SSlawomir Mrozowicz __rte_unused uint8_t *iv, __rte_unused EVP_PKEY * pkey, 13088a9867a6SSlawomir Mrozowicz int srclen, EVP_MD_CTX *ctx, const EVP_MD *algo) 13098a9867a6SSlawomir Mrozowicz { 13108a9867a6SSlawomir Mrozowicz size_t dstlen; 13118f675fc7STomasz Kulasek struct rte_mbuf *m; 13128f675fc7STomasz Kulasek int l, n = srclen; 13138f675fc7STomasz Kulasek uint8_t *src; 13148f675fc7STomasz Kulasek 13158f675fc7STomasz Kulasek for (m = mbuf_src; m != NULL && offset > rte_pktmbuf_data_len(m); 13168f675fc7STomasz Kulasek m = m->next) 13178f675fc7STomasz Kulasek offset -= rte_pktmbuf_data_len(m); 13188f675fc7STomasz Kulasek 13198f675fc7STomasz Kulasek if (m == 0) 13208f675fc7STomasz Kulasek goto process_auth_err; 13218a9867a6SSlawomir Mrozowicz 13228a9867a6SSlawomir Mrozowicz if (EVP_DigestInit_ex(ctx, algo, NULL) <= 0) 13238a9867a6SSlawomir Mrozowicz goto process_auth_err; 13248a9867a6SSlawomir Mrozowicz 13258f675fc7STomasz Kulasek src = rte_pktmbuf_mtod_offset(m, uint8_t *, offset); 13268f675fc7STomasz Kulasek 13278f675fc7STomasz Kulasek l = rte_pktmbuf_data_len(m) - offset; 13288f675fc7STomasz Kulasek if (srclen <= l) { 13298a9867a6SSlawomir Mrozowicz if (EVP_DigestUpdate(ctx, (char *)src, srclen) <= 0) 13308a9867a6SSlawomir Mrozowicz goto process_auth_err; 13318f675fc7STomasz Kulasek goto process_auth_final; 13328f675fc7STomasz Kulasek } 13338a9867a6SSlawomir Mrozowicz 13348f675fc7STomasz Kulasek if (EVP_DigestUpdate(ctx, (char *)src, l) <= 0) 13358a9867a6SSlawomir Mrozowicz goto process_auth_err; 13368a9867a6SSlawomir Mrozowicz 13378f675fc7STomasz Kulasek n -= l; 13388f675fc7STomasz Kulasek 13398f675fc7STomasz Kulasek for (m = m->next; (m != NULL) && (n > 0); m = m->next) { 13408f675fc7STomasz Kulasek src = rte_pktmbuf_mtod(m, uint8_t *); 13418f675fc7STomasz Kulasek l = rte_pktmbuf_data_len(m) < n ? rte_pktmbuf_data_len(m) : n; 13428f675fc7STomasz Kulasek if (EVP_DigestUpdate(ctx, (char *)src, l) <= 0) 13438f675fc7STomasz Kulasek goto process_auth_err; 13448f675fc7STomasz Kulasek n -= l; 13458f675fc7STomasz Kulasek } 13468f675fc7STomasz Kulasek 13478f675fc7STomasz Kulasek process_auth_final: 13488f675fc7STomasz Kulasek if (EVP_DigestFinal_ex(ctx, dst, (unsigned int *)&dstlen) <= 0) 13498f675fc7STomasz Kulasek goto process_auth_err; 13508a9867a6SSlawomir Mrozowicz return 0; 13518a9867a6SSlawomir Mrozowicz 13528a9867a6SSlawomir Mrozowicz process_auth_err: 1353094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl auth failed"); 13548a9867a6SSlawomir Mrozowicz return -EINVAL; 13558a9867a6SSlawomir Mrozowicz } 13568a9867a6SSlawomir Mrozowicz 135775adf1eaSKai Ji # if OPENSSL_VERSION_NUMBER >= 0x30000000L 135875adf1eaSKai Ji /** Process standard openssl auth algorithms with hmac */ 135975adf1eaSKai Ji static int 136075adf1eaSKai Ji process_openssl_auth_hmac(struct rte_mbuf *mbuf_src, uint8_t *dst, int offset, 136175adf1eaSKai Ji int srclen, EVP_MAC_CTX *ctx) 136275adf1eaSKai Ji { 136375adf1eaSKai Ji size_t dstlen; 136475adf1eaSKai Ji struct rte_mbuf *m; 136575adf1eaSKai Ji int l, n = srclen; 136675adf1eaSKai Ji uint8_t *src; 136775adf1eaSKai Ji 136875adf1eaSKai Ji for (m = mbuf_src; m != NULL && offset > rte_pktmbuf_data_len(m); 136975adf1eaSKai Ji m = m->next) 137075adf1eaSKai Ji offset -= rte_pktmbuf_data_len(m); 137175adf1eaSKai Ji 137275adf1eaSKai Ji if (m == 0) 137375adf1eaSKai Ji goto process_auth_err; 137475adf1eaSKai Ji 137575adf1eaSKai Ji src = rte_pktmbuf_mtod_offset(m, uint8_t *, offset); 137675adf1eaSKai Ji 137775adf1eaSKai Ji l = rte_pktmbuf_data_len(m) - offset; 137875adf1eaSKai Ji if (srclen <= l) { 137975adf1eaSKai Ji if (EVP_MAC_update(ctx, (unsigned char *)src, srclen) != 1) 138075adf1eaSKai Ji goto process_auth_err; 138175adf1eaSKai Ji goto process_auth_final; 138275adf1eaSKai Ji } 138375adf1eaSKai Ji 138475adf1eaSKai Ji if (EVP_MAC_update(ctx, (unsigned char *)src, l) != 1) 138575adf1eaSKai Ji goto process_auth_err; 138675adf1eaSKai Ji 138775adf1eaSKai Ji n -= l; 138875adf1eaSKai Ji 138975adf1eaSKai Ji for (m = m->next; (m != NULL) && (n > 0); m = m->next) { 139075adf1eaSKai Ji src = rte_pktmbuf_mtod(m, uint8_t *); 139175adf1eaSKai Ji l = rte_pktmbuf_data_len(m) < n ? rte_pktmbuf_data_len(m) : n; 139275adf1eaSKai Ji if (EVP_MAC_update(ctx, (unsigned char *)src, l) != 1) 139375adf1eaSKai Ji goto process_auth_err; 139475adf1eaSKai Ji n -= l; 139575adf1eaSKai Ji } 139675adf1eaSKai Ji 139775adf1eaSKai Ji process_auth_final: 139875adf1eaSKai Ji if (EVP_MAC_final(ctx, dst, &dstlen, sizeof(dst)) != 1) 139975adf1eaSKai Ji goto process_auth_err; 140075adf1eaSKai Ji 140175adf1eaSKai Ji EVP_MAC_CTX_free(ctx); 140275adf1eaSKai Ji return 0; 140375adf1eaSKai Ji 140475adf1eaSKai Ji process_auth_err: 140575adf1eaSKai Ji EVP_MAC_CTX_free(ctx); 140675adf1eaSKai Ji OPENSSL_LOG(ERR, "Process openssl auth failed"); 140775adf1eaSKai Ji return -EINVAL; 140875adf1eaSKai Ji } 140975adf1eaSKai Ji # else 14108a9867a6SSlawomir Mrozowicz /** Process standard openssl auth algorithms with hmac */ 14118a9867a6SSlawomir Mrozowicz static int 14128f675fc7STomasz Kulasek process_openssl_auth_hmac(struct rte_mbuf *mbuf_src, uint8_t *dst, int offset, 14133d0243feSAkhil Goyal int srclen, HMAC_CTX *ctx) 14148a9867a6SSlawomir Mrozowicz { 14153d0243feSAkhil Goyal unsigned int dstlen; 14168f675fc7STomasz Kulasek struct rte_mbuf *m; 14178f675fc7STomasz Kulasek int l, n = srclen; 14188f675fc7STomasz Kulasek uint8_t *src; 14198f675fc7STomasz Kulasek 14208f675fc7STomasz Kulasek for (m = mbuf_src; m != NULL && offset > rte_pktmbuf_data_len(m); 14218f675fc7STomasz Kulasek m = m->next) 14228f675fc7STomasz Kulasek offset -= rte_pktmbuf_data_len(m); 14238f675fc7STomasz Kulasek 14248f675fc7STomasz Kulasek if (m == 0) 14258f675fc7STomasz Kulasek goto process_auth_err; 14268a9867a6SSlawomir Mrozowicz 14278f675fc7STomasz Kulasek src = rte_pktmbuf_mtod_offset(m, uint8_t *, offset); 14288f675fc7STomasz Kulasek 14298f675fc7STomasz Kulasek l = rte_pktmbuf_data_len(m) - offset; 14308f675fc7STomasz Kulasek if (srclen <= l) { 14313d0243feSAkhil Goyal if (HMAC_Update(ctx, (unsigned char *)src, srclen) != 1) 14328a9867a6SSlawomir Mrozowicz goto process_auth_err; 14338f675fc7STomasz Kulasek goto process_auth_final; 14348f675fc7STomasz Kulasek } 14358a9867a6SSlawomir Mrozowicz 14363d0243feSAkhil Goyal if (HMAC_Update(ctx, (unsigned char *)src, l) != 1) 14378f675fc7STomasz Kulasek goto process_auth_err; 14388f675fc7STomasz Kulasek 14398f675fc7STomasz Kulasek n -= l; 14408f675fc7STomasz Kulasek 14418f675fc7STomasz Kulasek for (m = m->next; (m != NULL) && (n > 0); m = m->next) { 14428f675fc7STomasz Kulasek src = rte_pktmbuf_mtod(m, uint8_t *); 14438f675fc7STomasz Kulasek l = rte_pktmbuf_data_len(m) < n ? rte_pktmbuf_data_len(m) : n; 14443d0243feSAkhil Goyal if (HMAC_Update(ctx, (unsigned char *)src, l) != 1) 14458f675fc7STomasz Kulasek goto process_auth_err; 14468f675fc7STomasz Kulasek n -= l; 14478f675fc7STomasz Kulasek } 14488f675fc7STomasz Kulasek 14498f675fc7STomasz Kulasek process_auth_final: 14503d0243feSAkhil Goyal if (HMAC_Final(ctx, dst, &dstlen) != 1) 14513d0243feSAkhil Goyal goto process_auth_err; 14523d0243feSAkhil Goyal 14533d0243feSAkhil Goyal if (unlikely(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL) != 1)) 14548a9867a6SSlawomir Mrozowicz goto process_auth_err; 14558a9867a6SSlawomir Mrozowicz 14568a9867a6SSlawomir Mrozowicz return 0; 14578a9867a6SSlawomir Mrozowicz 14588a9867a6SSlawomir Mrozowicz process_auth_err: 1459094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "Process openssl auth failed"); 14608a9867a6SSlawomir Mrozowicz return -EINVAL; 14618a9867a6SSlawomir Mrozowicz } 146275adf1eaSKai Ji # endif 14638a9867a6SSlawomir Mrozowicz /*----------------------------------------------------------------------------*/ 14648a9867a6SSlawomir Mrozowicz 14658a9867a6SSlawomir Mrozowicz /** Process auth/cipher combined operation */ 14668a9867a6SSlawomir Mrozowicz static void 14678a9867a6SSlawomir Mrozowicz process_openssl_combined_op 14688a9867a6SSlawomir Mrozowicz (struct rte_crypto_op *op, struct openssl_session *sess, 14698a9867a6SSlawomir Mrozowicz struct rte_mbuf *mbuf_src, struct rte_mbuf *mbuf_dst) 14708a9867a6SSlawomir Mrozowicz { 14718a9867a6SSlawomir Mrozowicz /* cipher */ 14728f675fc7STomasz Kulasek uint8_t *dst = NULL, *iv, *tag, *aad; 1473b4b86b09SPablo de Lara int srclen, aadlen, status = -1; 1474e32e4fa8SPablo de Lara uint32_t offset; 14751a4998dcSPablo de Lara uint8_t taglen; 14768a9867a6SSlawomir Mrozowicz 14778f675fc7STomasz Kulasek /* 14788f675fc7STomasz Kulasek * Segmented destination buffer is not supported for 14798f675fc7STomasz Kulasek * encryption/decryption 14808f675fc7STomasz Kulasek */ 14818f675fc7STomasz Kulasek if (!rte_pktmbuf_is_contiguous(mbuf_dst)) { 14828f675fc7STomasz Kulasek op->status = RTE_CRYPTO_OP_STATUS_ERROR; 14838f675fc7STomasz Kulasek return; 14848f675fc7STomasz Kulasek } 14858f675fc7STomasz Kulasek 14865082f991SPablo de Lara iv = rte_crypto_op_ctod_offset(op, uint8_t *, 14870fbd75a9SPablo de Lara sess->iv.offset); 1488e32e4fa8SPablo de Lara if (sess->auth.algo == RTE_CRYPTO_AUTH_AES_GMAC) { 14898a9867a6SSlawomir Mrozowicz srclen = 0; 1490e32e4fa8SPablo de Lara offset = op->sym->auth.data.offset; 1491e32e4fa8SPablo de Lara aadlen = op->sym->auth.data.length; 1492e32e4fa8SPablo de Lara aad = rte_pktmbuf_mtod_offset(mbuf_src, uint8_t *, 1493e32e4fa8SPablo de Lara op->sym->auth.data.offset); 1494b79e4c00SPablo de Lara tag = op->sym->auth.digest.data; 1495b79e4c00SPablo de Lara if (tag == NULL) 1496b79e4c00SPablo de Lara tag = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *, 1497b79e4c00SPablo de Lara offset + aadlen); 1498e32e4fa8SPablo de Lara } else { 1499b79e4c00SPablo de Lara srclen = op->sym->aead.data.length; 15008a9867a6SSlawomir Mrozowicz dst = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *, 1501b79e4c00SPablo de Lara op->sym->aead.data.offset); 1502b79e4c00SPablo de Lara offset = op->sym->aead.data.offset; 1503b79e4c00SPablo de Lara aad = op->sym->aead.aad.data; 1504e32e4fa8SPablo de Lara aadlen = sess->auth.aad_length; 1505b79e4c00SPablo de Lara tag = op->sym->aead.digest.data; 1506b79e4c00SPablo de Lara if (tag == NULL) 1507b79e4c00SPablo de Lara tag = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *, 1508b79e4c00SPablo de Lara offset + srclen); 15098a9867a6SSlawomir Mrozowicz } 15108a9867a6SSlawomir Mrozowicz 15111a4998dcSPablo de Lara taglen = sess->auth.digest_length; 15121a4998dcSPablo de Lara 15131a4998dcSPablo de Lara if (sess->cipher.direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 15141a4998dcSPablo de Lara if (sess->auth.algo == RTE_CRYPTO_AUTH_AES_GMAC || 15151a4998dcSPablo de Lara sess->aead_algo == RTE_CRYPTO_AEAD_AES_GCM) 15168a9867a6SSlawomir Mrozowicz status = process_openssl_auth_encryption_gcm( 1517e32e4fa8SPablo de Lara mbuf_src, offset, srclen, 1518b4b86b09SPablo de Lara aad, aadlen, iv, 151975adf1eaSKai Ji dst, tag, sess->cipher.ctx); 15208a9867a6SSlawomir Mrozowicz else 15211a4998dcSPablo de Lara status = process_openssl_auth_encryption_ccm( 15221a4998dcSPablo de Lara mbuf_src, offset, srclen, 15231a4998dcSPablo de Lara aad, aadlen, iv, 152475adf1eaSKai Ji dst, tag, taglen, sess->cipher.ctx); 15251a4998dcSPablo de Lara 15261a4998dcSPablo de Lara } else { 15271a4998dcSPablo de Lara if (sess->auth.algo == RTE_CRYPTO_AUTH_AES_GMAC || 15281a4998dcSPablo de Lara sess->aead_algo == RTE_CRYPTO_AEAD_AES_GCM) 15298a9867a6SSlawomir Mrozowicz status = process_openssl_auth_decryption_gcm( 1530e32e4fa8SPablo de Lara mbuf_src, offset, srclen, 1531b4b86b09SPablo de Lara aad, aadlen, iv, 153275adf1eaSKai Ji dst, tag, sess->cipher.ctx); 15331a4998dcSPablo de Lara else 15341a4998dcSPablo de Lara status = process_openssl_auth_decryption_ccm( 15351a4998dcSPablo de Lara mbuf_src, offset, srclen, 15361a4998dcSPablo de Lara aad, aadlen, iv, 153775adf1eaSKai Ji dst, tag, taglen, sess->cipher.ctx); 15381a4998dcSPablo de Lara } 15398a9867a6SSlawomir Mrozowicz 15408a9867a6SSlawomir Mrozowicz if (status != 0) { 15418a9867a6SSlawomir Mrozowicz if (status == (-EFAULT) && 15428a9867a6SSlawomir Mrozowicz sess->auth.operation == 15438a9867a6SSlawomir Mrozowicz RTE_CRYPTO_AUTH_OP_VERIFY) 15448a9867a6SSlawomir Mrozowicz op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 15458a9867a6SSlawomir Mrozowicz else 15468a9867a6SSlawomir Mrozowicz op->status = RTE_CRYPTO_OP_STATUS_ERROR; 15478a9867a6SSlawomir Mrozowicz } 15488a9867a6SSlawomir Mrozowicz } 15498a9867a6SSlawomir Mrozowicz 15508a9867a6SSlawomir Mrozowicz /** Process cipher operation */ 15518a9867a6SSlawomir Mrozowicz static void 15528a9867a6SSlawomir Mrozowicz process_openssl_cipher_op 15538a9867a6SSlawomir Mrozowicz (struct rte_crypto_op *op, struct openssl_session *sess, 15548a9867a6SSlawomir Mrozowicz struct rte_mbuf *mbuf_src, struct rte_mbuf *mbuf_dst) 15558a9867a6SSlawomir Mrozowicz { 15568f675fc7STomasz Kulasek uint8_t *dst, *iv; 15578a9867a6SSlawomir Mrozowicz int srclen, status; 1558b795e127SAkhil Goyal uint8_t inplace = (mbuf_src == mbuf_dst) ? 1 : 0; 155967ab783bSThierry Herbelot EVP_CIPHER_CTX *ctx_copy; 15608a9867a6SSlawomir Mrozowicz 15618f675fc7STomasz Kulasek /* 1562b795e127SAkhil Goyal * Segmented OOP destination buffer is not supported for encryption/ 1563b795e127SAkhil Goyal * decryption. In case of des3ctr, even inplace segmented buffers are 1564b795e127SAkhil Goyal * not supported. 15658f675fc7STomasz Kulasek */ 1566b795e127SAkhil Goyal if (!rte_pktmbuf_is_contiguous(mbuf_dst) && 1567b795e127SAkhil Goyal (!inplace || sess->cipher.mode != OPENSSL_CIPHER_LIB)) { 15688f675fc7STomasz Kulasek op->status = RTE_CRYPTO_OP_STATUS_ERROR; 15698f675fc7STomasz Kulasek return; 15708f675fc7STomasz Kulasek } 15718f675fc7STomasz Kulasek 15728a9867a6SSlawomir Mrozowicz srclen = op->sym->cipher.data.length; 15738a9867a6SSlawomir Mrozowicz dst = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *, 15748a9867a6SSlawomir Mrozowicz op->sym->cipher.data.offset); 15758a9867a6SSlawomir Mrozowicz 15765082f991SPablo de Lara iv = rte_crypto_op_ctod_offset(op, uint8_t *, 15770fbd75a9SPablo de Lara sess->iv.offset); 157867ab783bSThierry Herbelot ctx_copy = EVP_CIPHER_CTX_new(); 157967ab783bSThierry Herbelot EVP_CIPHER_CTX_copy(ctx_copy, sess->cipher.ctx); 15808a9867a6SSlawomir Mrozowicz 15818a9867a6SSlawomir Mrozowicz if (sess->cipher.mode == OPENSSL_CIPHER_LIB) 15828a9867a6SSlawomir Mrozowicz if (sess->cipher.direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) 15838f675fc7STomasz Kulasek status = process_openssl_cipher_encrypt(mbuf_src, dst, 15848f675fc7STomasz Kulasek op->sym->cipher.data.offset, iv, 1585b795e127SAkhil Goyal srclen, ctx_copy, inplace); 15868a9867a6SSlawomir Mrozowicz else 15878f675fc7STomasz Kulasek status = process_openssl_cipher_decrypt(mbuf_src, dst, 15888f675fc7STomasz Kulasek op->sym->cipher.data.offset, iv, 1589b795e127SAkhil Goyal srclen, ctx_copy, inplace); 15908a9867a6SSlawomir Mrozowicz else 15918f675fc7STomasz Kulasek status = process_openssl_cipher_des3ctr(mbuf_src, dst, 15928f675fc7STomasz Kulasek op->sym->cipher.data.offset, iv, 15938a9867a6SSlawomir Mrozowicz sess->cipher.key.data, srclen, 159467ab783bSThierry Herbelot ctx_copy); 15958a9867a6SSlawomir Mrozowicz 159667ab783bSThierry Herbelot EVP_CIPHER_CTX_free(ctx_copy); 15978a9867a6SSlawomir Mrozowicz if (status != 0) 15988a9867a6SSlawomir Mrozowicz op->status = RTE_CRYPTO_OP_STATUS_ERROR; 15998a9867a6SSlawomir Mrozowicz } 16008a9867a6SSlawomir Mrozowicz 16011dee7bc7SPablo de Lara /** Process cipher operation */ 16021dee7bc7SPablo de Lara static void 16031dee7bc7SPablo de Lara process_openssl_docsis_bpi_op(struct rte_crypto_op *op, 16041dee7bc7SPablo de Lara struct openssl_session *sess, struct rte_mbuf *mbuf_src, 16051dee7bc7SPablo de Lara struct rte_mbuf *mbuf_dst) 16061dee7bc7SPablo de Lara { 16071dee7bc7SPablo de Lara uint8_t *src, *dst, *iv; 16081dee7bc7SPablo de Lara uint8_t block_size, last_block_len; 16091dee7bc7SPablo de Lara int srclen, status = 0; 16101dee7bc7SPablo de Lara 16111dee7bc7SPablo de Lara srclen = op->sym->cipher.data.length; 16121dee7bc7SPablo de Lara src = rte_pktmbuf_mtod_offset(mbuf_src, uint8_t *, 16131dee7bc7SPablo de Lara op->sym->cipher.data.offset); 16141dee7bc7SPablo de Lara dst = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *, 16151dee7bc7SPablo de Lara op->sym->cipher.data.offset); 16161dee7bc7SPablo de Lara 16175082f991SPablo de Lara iv = rte_crypto_op_ctod_offset(op, uint8_t *, 16180fbd75a9SPablo de Lara sess->iv.offset); 16191dee7bc7SPablo de Lara 16201dee7bc7SPablo de Lara block_size = DES_BLOCK_SIZE; 16211dee7bc7SPablo de Lara 16221dee7bc7SPablo de Lara last_block_len = srclen % block_size; 16231dee7bc7SPablo de Lara if (sess->cipher.direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 16241dee7bc7SPablo de Lara /* Encrypt only with ECB mode XOR IV */ 16251dee7bc7SPablo de Lara if (srclen < block_size) { 16261dee7bc7SPablo de Lara status = process_openssl_cipher_bpi_encrypt(src, dst, 16271dee7bc7SPablo de Lara iv, srclen, 16281dee7bc7SPablo de Lara sess->cipher.bpi_ctx); 16291dee7bc7SPablo de Lara } else { 16301dee7bc7SPablo de Lara srclen -= last_block_len; 16311dee7bc7SPablo de Lara /* Encrypt with the block aligned stream with CBC mode */ 16321dee7bc7SPablo de Lara status = process_openssl_cipher_encrypt(mbuf_src, dst, 16331dee7bc7SPablo de Lara op->sym->cipher.data.offset, iv, 1634b795e127SAkhil Goyal srclen, sess->cipher.ctx, 0); 16351dee7bc7SPablo de Lara if (last_block_len) { 16361dee7bc7SPablo de Lara /* Point at last block */ 16371dee7bc7SPablo de Lara dst += srclen; 16381dee7bc7SPablo de Lara /* 16391dee7bc7SPablo de Lara * IV is the last encrypted block from 16401dee7bc7SPablo de Lara * the previous operation 16411dee7bc7SPablo de Lara */ 16421dee7bc7SPablo de Lara iv = dst - block_size; 16431dee7bc7SPablo de Lara src += srclen; 16441dee7bc7SPablo de Lara srclen = last_block_len; 16451dee7bc7SPablo de Lara /* Encrypt the last frame with ECB mode */ 16461dee7bc7SPablo de Lara status |= process_openssl_cipher_bpi_encrypt(src, 16471dee7bc7SPablo de Lara dst, iv, 16481dee7bc7SPablo de Lara srclen, sess->cipher.bpi_ctx); 16491dee7bc7SPablo de Lara } 16501dee7bc7SPablo de Lara } 16511dee7bc7SPablo de Lara } else { 16521dee7bc7SPablo de Lara /* Decrypt only with ECB mode (encrypt, as it is same operation) */ 16531dee7bc7SPablo de Lara if (srclen < block_size) { 16541dee7bc7SPablo de Lara status = process_openssl_cipher_bpi_encrypt(src, dst, 16551dee7bc7SPablo de Lara iv, 16561dee7bc7SPablo de Lara srclen, 16571dee7bc7SPablo de Lara sess->cipher.bpi_ctx); 16581dee7bc7SPablo de Lara } else { 16591dee7bc7SPablo de Lara if (last_block_len) { 16601dee7bc7SPablo de Lara /* Point at last block */ 16611dee7bc7SPablo de Lara dst += srclen - last_block_len; 16621dee7bc7SPablo de Lara src += srclen - last_block_len; 16631dee7bc7SPablo de Lara /* 16641dee7bc7SPablo de Lara * IV is the last full block 16651dee7bc7SPablo de Lara */ 16661dee7bc7SPablo de Lara iv = src - block_size; 16671dee7bc7SPablo de Lara /* 16681dee7bc7SPablo de Lara * Decrypt the last frame with ECB mode 16691dee7bc7SPablo de Lara * (encrypt, as it is the same operation) 16701dee7bc7SPablo de Lara */ 16711dee7bc7SPablo de Lara status = process_openssl_cipher_bpi_encrypt(src, 16721dee7bc7SPablo de Lara dst, iv, 16731dee7bc7SPablo de Lara last_block_len, sess->cipher.bpi_ctx); 16741dee7bc7SPablo de Lara /* Prepare parameters for CBC mode op */ 16755082f991SPablo de Lara iv = rte_crypto_op_ctod_offset(op, uint8_t *, 16760fbd75a9SPablo de Lara sess->iv.offset); 16771dee7bc7SPablo de Lara dst += last_block_len - srclen; 16781dee7bc7SPablo de Lara srclen -= last_block_len; 16791dee7bc7SPablo de Lara } 16801dee7bc7SPablo de Lara 16811dee7bc7SPablo de Lara /* Decrypt with CBC mode */ 16821dee7bc7SPablo de Lara status |= process_openssl_cipher_decrypt(mbuf_src, dst, 16831dee7bc7SPablo de Lara op->sym->cipher.data.offset, iv, 1684b795e127SAkhil Goyal srclen, sess->cipher.ctx, 0); 16851dee7bc7SPablo de Lara } 16861dee7bc7SPablo de Lara } 16871dee7bc7SPablo de Lara 16881dee7bc7SPablo de Lara if (status != 0) 16891dee7bc7SPablo de Lara op->status = RTE_CRYPTO_OP_STATUS_ERROR; 16901dee7bc7SPablo de Lara } 16911dee7bc7SPablo de Lara 16928a9867a6SSlawomir Mrozowicz /** Process auth operation */ 16938a9867a6SSlawomir Mrozowicz static void 1694f296593fSPablo de Lara process_openssl_auth_op(struct openssl_qp *qp, struct rte_crypto_op *op, 1695f296593fSPablo de Lara struct openssl_session *sess, struct rte_mbuf *mbuf_src, 1696f296593fSPablo de Lara struct rte_mbuf *mbuf_dst) 16978a9867a6SSlawomir Mrozowicz { 16988f675fc7STomasz Kulasek uint8_t *dst; 16998a9867a6SSlawomir Mrozowicz int srclen, status; 170067ab783bSThierry Herbelot EVP_MD_CTX *ctx_a; 170175adf1eaSKai Ji # if OPENSSL_VERSION_NUMBER >= 0x30000000L 170275adf1eaSKai Ji EVP_MAC_CTX *ctx_h; 170375adf1eaSKai Ji EVP_MAC *mac; 170475adf1eaSKai Ji # else 170567ab783bSThierry Herbelot HMAC_CTX *ctx_h; 170675adf1eaSKai Ji # endif 17078a9867a6SSlawomir Mrozowicz 17088a9867a6SSlawomir Mrozowicz srclen = op->sym->auth.data.length; 17098a9867a6SSlawomir Mrozowicz 1710f296593fSPablo de Lara dst = qp->temp_digest; 17118a9867a6SSlawomir Mrozowicz 17128a9867a6SSlawomir Mrozowicz switch (sess->auth.mode) { 17138a9867a6SSlawomir Mrozowicz case OPENSSL_AUTH_AS_AUTH: 171467ab783bSThierry Herbelot ctx_a = EVP_MD_CTX_create(); 171567ab783bSThierry Herbelot EVP_MD_CTX_copy_ex(ctx_a, sess->auth.auth.ctx); 17168f675fc7STomasz Kulasek status = process_openssl_auth(mbuf_src, dst, 17178f675fc7STomasz Kulasek op->sym->auth.data.offset, NULL, NULL, srclen, 171867ab783bSThierry Herbelot ctx_a, sess->auth.auth.evp_algo); 171967ab783bSThierry Herbelot EVP_MD_CTX_destroy(ctx_a); 17208a9867a6SSlawomir Mrozowicz break; 17218a9867a6SSlawomir Mrozowicz case OPENSSL_AUTH_AS_HMAC: 172275adf1eaSKai Ji # if OPENSSL_VERSION_NUMBER >= 0x30000000L 172375adf1eaSKai Ji mac = EVP_MAC_fetch(NULL, "HMAC", NULL); 172475adf1eaSKai Ji ctx_h = EVP_MAC_CTX_new(mac); 172575adf1eaSKai Ji ctx_h = EVP_MAC_CTX_dup(sess->auth.hmac.ctx); 172675adf1eaSKai Ji EVP_MAC_free(mac); 172775adf1eaSKai Ji status = process_openssl_auth_hmac(mbuf_src, dst, 172875adf1eaSKai Ji op->sym->auth.data.offset, srclen, 172975adf1eaSKai Ji ctx_h); 173075adf1eaSKai Ji # else 173167ab783bSThierry Herbelot ctx_h = HMAC_CTX_new(); 173267ab783bSThierry Herbelot HMAC_CTX_copy(ctx_h, sess->auth.hmac.ctx); 17338f675fc7STomasz Kulasek status = process_openssl_auth_hmac(mbuf_src, dst, 17343d0243feSAkhil Goyal op->sym->auth.data.offset, srclen, 173567ab783bSThierry Herbelot ctx_h); 173667ab783bSThierry Herbelot HMAC_CTX_free(ctx_h); 173775adf1eaSKai Ji # endif 17388a9867a6SSlawomir Mrozowicz break; 17398a9867a6SSlawomir Mrozowicz default: 17408a9867a6SSlawomir Mrozowicz status = -1; 17418a9867a6SSlawomir Mrozowicz break; 17428a9867a6SSlawomir Mrozowicz } 17438a9867a6SSlawomir Mrozowicz 17448a9867a6SSlawomir Mrozowicz if (sess->auth.operation == RTE_CRYPTO_AUTH_OP_VERIFY) { 1745a3f9fedeSArek Kusztal if (CRYPTO_memcmp(dst, op->sym->auth.digest.data, 17467f003427SPablo de Lara sess->auth.digest_length) != 0) { 17478a9867a6SSlawomir Mrozowicz op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 17488a9867a6SSlawomir Mrozowicz } 1749c3d22a65SDmitry Eremin-Solenikov } else { 1750c3d22a65SDmitry Eremin-Solenikov uint8_t *auth_dst; 1751c3d22a65SDmitry Eremin-Solenikov 1752c3d22a65SDmitry Eremin-Solenikov auth_dst = op->sym->auth.digest.data; 1753c3d22a65SDmitry Eremin-Solenikov if (auth_dst == NULL) 1754c3d22a65SDmitry Eremin-Solenikov auth_dst = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *, 1755c3d22a65SDmitry Eremin-Solenikov op->sym->auth.data.offset + 1756c3d22a65SDmitry Eremin-Solenikov op->sym->auth.data.length); 1757c3d22a65SDmitry Eremin-Solenikov memcpy(auth_dst, dst, sess->auth.digest_length); 17588a9867a6SSlawomir Mrozowicz } 17598a9867a6SSlawomir Mrozowicz 17608a9867a6SSlawomir Mrozowicz if (status != 0) 17618a9867a6SSlawomir Mrozowicz op->status = RTE_CRYPTO_OP_STATUS_ERROR; 17628a9867a6SSlawomir Mrozowicz } 17638a9867a6SSlawomir Mrozowicz 1764ac42813aSSunila Sahu /* process dsa sign operation */ 17654c7ae22fSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 17664c7ae22fSKai Ji static int 17674c7ae22fSKai Ji process_openssl_dsa_sign_op_evp(struct rte_crypto_op *cop, 17684c7ae22fSKai Ji struct openssl_asym_session *sess) 17694c7ae22fSKai Ji { 17704c7ae22fSKai Ji struct rte_crypto_dsa_op_param *op = &cop->asym->dsa; 17714c7ae22fSKai Ji EVP_PKEY_CTX *dsa_ctx = NULL; 17724c7ae22fSKai Ji EVP_PKEY_CTX *key_ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL); 17734c7ae22fSKai Ji EVP_PKEY *pkey = NULL; 17744c7ae22fSKai Ji OSSL_PARAM_BLD *param_bld = sess->u.s.param_bld; 17754c7ae22fSKai Ji OSSL_PARAM *params = NULL; 17764c7ae22fSKai Ji 17774c7ae22fSKai Ji size_t outlen; 17784c7ae22fSKai Ji unsigned char *dsa_sign_data; 17794c7ae22fSKai Ji const unsigned char *dsa_sign_data_p; 17804c7ae22fSKai Ji 17814c7ae22fSKai Ji cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 17824c7ae22fSKai Ji params = OSSL_PARAM_BLD_to_param(param_bld); 17834c7ae22fSKai Ji if (!params) { 17844c7ae22fSKai Ji OSSL_PARAM_BLD_free(param_bld); 17854c7ae22fSKai Ji return -1; 17864c7ae22fSKai Ji } 17874c7ae22fSKai Ji 17884c7ae22fSKai Ji if (key_ctx == NULL 17894c7ae22fSKai Ji || EVP_PKEY_fromdata_init(key_ctx) <= 0 17904c7ae22fSKai Ji || EVP_PKEY_fromdata(key_ctx, &pkey, 179181e3122fSKai Ji EVP_PKEY_KEYPAIR, params) <= 0) 17924c7ae22fSKai Ji goto err_dsa_sign; 17934c7ae22fSKai Ji 17944c7ae22fSKai Ji dsa_ctx = EVP_PKEY_CTX_new(pkey, NULL); 17954c7ae22fSKai Ji if (!dsa_ctx) 17964c7ae22fSKai Ji goto err_dsa_sign; 17974c7ae22fSKai Ji 17984c7ae22fSKai Ji if (EVP_PKEY_sign_init(dsa_ctx) <= 0) 17994c7ae22fSKai Ji goto err_dsa_sign; 18004c7ae22fSKai Ji 18014c7ae22fSKai Ji if (EVP_PKEY_sign(dsa_ctx, NULL, &outlen, op->message.data, 18024c7ae22fSKai Ji op->message.length) <= 0) 18034c7ae22fSKai Ji goto err_dsa_sign; 18044c7ae22fSKai Ji 18054c7ae22fSKai Ji if (outlen <= 0) 18064c7ae22fSKai Ji goto err_dsa_sign; 18074c7ae22fSKai Ji 18084c7ae22fSKai Ji dsa_sign_data = OPENSSL_malloc(outlen); 18094c7ae22fSKai Ji if (!dsa_sign_data) 18104c7ae22fSKai Ji goto err_dsa_sign; 18114c7ae22fSKai Ji 18124c7ae22fSKai Ji if (EVP_PKEY_sign(dsa_ctx, dsa_sign_data, &outlen, op->message.data, 18134c7ae22fSKai Ji op->message.length) <= 0) { 18144c7ae22fSKai Ji free(dsa_sign_data); 18154c7ae22fSKai Ji goto err_dsa_sign; 18164c7ae22fSKai Ji } 18174c7ae22fSKai Ji 18184c7ae22fSKai Ji dsa_sign_data_p = (const unsigned char *)dsa_sign_data; 18194c7ae22fSKai Ji DSA_SIG *sign = d2i_DSA_SIG(NULL, &dsa_sign_data_p, outlen); 18204c7ae22fSKai Ji if (!sign) { 18214c7ae22fSKai Ji OPENSSL_LOG(ERR, "%s:%d\n", __func__, __LINE__); 18224c7ae22fSKai Ji free(dsa_sign_data); 18234c7ae22fSKai Ji goto err_dsa_sign; 18244c7ae22fSKai Ji } else { 18254c7ae22fSKai Ji const BIGNUM *r = NULL, *s = NULL; 18264c7ae22fSKai Ji get_dsa_sign(sign, &r, &s); 18274c7ae22fSKai Ji 18284c7ae22fSKai Ji op->r.length = BN_bn2bin(r, op->r.data); 18294c7ae22fSKai Ji op->s.length = BN_bn2bin(s, op->s.data); 18304c7ae22fSKai Ji cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 18314c7ae22fSKai Ji } 18324c7ae22fSKai Ji 18334c7ae22fSKai Ji DSA_SIG_free(sign); 18344c7ae22fSKai Ji free(dsa_sign_data); 18354c7ae22fSKai Ji return 0; 18364c7ae22fSKai Ji 18374c7ae22fSKai Ji err_dsa_sign: 18384c7ae22fSKai Ji if (params) 18394c7ae22fSKai Ji OSSL_PARAM_free(params); 18404c7ae22fSKai Ji if (key_ctx) 18414c7ae22fSKai Ji EVP_PKEY_CTX_free(key_ctx); 18424c7ae22fSKai Ji if (dsa_ctx) 18434c7ae22fSKai Ji EVP_PKEY_CTX_free(dsa_ctx); 18444c7ae22fSKai Ji return -1; 18454c7ae22fSKai Ji } 18464c7ae22fSKai Ji 18474c7ae22fSKai Ji /* process dsa verify operation */ 18484c7ae22fSKai Ji static int 18494c7ae22fSKai Ji process_openssl_dsa_verify_op_evp(struct rte_crypto_op *cop, 18504c7ae22fSKai Ji struct openssl_asym_session *sess) 18514c7ae22fSKai Ji { 18524c7ae22fSKai Ji struct rte_crypto_dsa_op_param *op = &cop->asym->dsa; 18534c7ae22fSKai Ji DSA_SIG *sign = DSA_SIG_new(); 18544c7ae22fSKai Ji BIGNUM *r = NULL, *s = NULL; 18554c7ae22fSKai Ji BIGNUM *pub_key = NULL; 18564c7ae22fSKai Ji OSSL_PARAM_BLD *param_bld = sess->u.s.param_bld; 18574c7ae22fSKai Ji OSSL_PARAM *params = NULL; 18584c7ae22fSKai Ji EVP_PKEY *pkey = NULL; 18594c7ae22fSKai Ji EVP_PKEY_CTX *dsa_ctx = NULL; 18604c7ae22fSKai Ji EVP_PKEY_CTX *key_ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL); 18614c7ae22fSKai Ji unsigned char *dsa_sig = NULL; 18624c7ae22fSKai Ji size_t sig_len; 18634c7ae22fSKai Ji int ret = -1; 18644c7ae22fSKai Ji 18654c7ae22fSKai Ji cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 18664c7ae22fSKai Ji if (!param_bld) { 18674c7ae22fSKai Ji OPENSSL_LOG(ERR, " %s:%d\n", __func__, __LINE__); 18684c7ae22fSKai Ji return -1; 18694c7ae22fSKai Ji } 18704c7ae22fSKai Ji 18714c7ae22fSKai Ji r = BN_bin2bn(op->r.data, op->r.length, r); 18724c7ae22fSKai Ji s = BN_bin2bn(op->s.data, op->s.length, s); 18734c7ae22fSKai Ji pub_key = BN_bin2bn(op->y.data, op->y.length, pub_key); 18744c7ae22fSKai Ji if (!r || !s || !pub_key) { 18754c7ae22fSKai Ji BN_free(r); 18764c7ae22fSKai Ji BN_free(s); 18774c7ae22fSKai Ji BN_free(pub_key); 18784c7ae22fSKai Ji OSSL_PARAM_BLD_free(param_bld); 18794c7ae22fSKai Ji goto err_dsa_verify; 18804c7ae22fSKai Ji } 18814c7ae22fSKai Ji 18824c7ae22fSKai Ji set_dsa_sign(sign, r, s); 18834c7ae22fSKai Ji if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_PUB_KEY, pub_key)) { 18844c7ae22fSKai Ji OSSL_PARAM_BLD_free(param_bld); 18854c7ae22fSKai Ji goto err_dsa_verify; 18864c7ae22fSKai Ji } 18874c7ae22fSKai Ji 18884c7ae22fSKai Ji params = OSSL_PARAM_BLD_to_param(param_bld); 18894c7ae22fSKai Ji if (!params) { 18904c7ae22fSKai Ji OSSL_PARAM_BLD_free(param_bld); 18914c7ae22fSKai Ji goto err_dsa_verify; 18924c7ae22fSKai Ji } 18934c7ae22fSKai Ji 18944c7ae22fSKai Ji if (key_ctx == NULL 18954c7ae22fSKai Ji || EVP_PKEY_fromdata_init(key_ctx) <= 0 18964c7ae22fSKai Ji || EVP_PKEY_fromdata(key_ctx, &pkey, EVP_PKEY_KEYPAIR, params) <= 0) 18974c7ae22fSKai Ji goto err_dsa_verify; 18984c7ae22fSKai Ji 18994c7ae22fSKai Ji dsa_ctx = EVP_PKEY_CTX_new(pkey, NULL); 19004c7ae22fSKai Ji if (!dsa_ctx) 19014c7ae22fSKai Ji goto err_dsa_verify; 19024c7ae22fSKai Ji 19034c7ae22fSKai Ji if (!sign) 19044c7ae22fSKai Ji goto err_dsa_verify; 19054c7ae22fSKai Ji 19064c7ae22fSKai Ji sig_len = i2d_DSA_SIG(sign, &dsa_sig); 19074c7ae22fSKai Ji if (EVP_PKEY_verify_init(dsa_ctx) <= 0) 19084c7ae22fSKai Ji goto err_dsa_verify; 19094c7ae22fSKai Ji 19104c7ae22fSKai Ji ret = EVP_PKEY_verify(dsa_ctx, dsa_sig, sig_len, 19114c7ae22fSKai Ji op->message.data, op->message.length); 19124c7ae22fSKai Ji if (ret == 1) { 19134c7ae22fSKai Ji cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 19144c7ae22fSKai Ji ret = 0; 19154c7ae22fSKai Ji } 19164c7ae22fSKai Ji 19174c7ae22fSKai Ji err_dsa_verify: 19184c7ae22fSKai Ji if (sign) 19194c7ae22fSKai Ji DSA_SIG_free(sign); 19204c7ae22fSKai Ji if (params) 19214c7ae22fSKai Ji OSSL_PARAM_free(params); 19224c7ae22fSKai Ji if (key_ctx) 19234c7ae22fSKai Ji EVP_PKEY_CTX_free(key_ctx); 19244c7ae22fSKai Ji if (dsa_ctx) 19254c7ae22fSKai Ji EVP_PKEY_CTX_free(dsa_ctx); 19264c7ae22fSKai Ji 19274c7ae22fSKai Ji return ret; 19284c7ae22fSKai Ji } 19294c7ae22fSKai Ji #else 1930ac42813aSSunila Sahu static int 1931ac42813aSSunila Sahu process_openssl_dsa_sign_op(struct rte_crypto_op *cop, 1932ac42813aSSunila Sahu struct openssl_asym_session *sess) 1933ac42813aSSunila Sahu { 1934ac42813aSSunila Sahu struct rte_crypto_dsa_op_param *op = &cop->asym->dsa; 1935ac42813aSSunila Sahu DSA *dsa = sess->u.s.dsa; 1936ac42813aSSunila Sahu DSA_SIG *sign = NULL; 1937ac42813aSSunila Sahu 1938ac42813aSSunila Sahu sign = DSA_do_sign(op->message.data, 1939ac42813aSSunila Sahu op->message.length, 1940ac42813aSSunila Sahu dsa); 1941ac42813aSSunila Sahu 1942ac42813aSSunila Sahu if (sign == NULL) { 1943ac42813aSSunila Sahu OPENSSL_LOG(ERR, "%s:%d\n", __func__, __LINE__); 1944ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 1945ac42813aSSunila Sahu } else { 1946ac42813aSSunila Sahu const BIGNUM *r = NULL, *s = NULL; 19470b5284adSAshish Gupta get_dsa_sign(sign, &r, &s); 1948ac42813aSSunila Sahu 1949ac42813aSSunila Sahu op->r.length = BN_bn2bin(r, op->r.data); 1950ac42813aSSunila Sahu op->s.length = BN_bn2bin(s, op->s.data); 1951ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 1952ac42813aSSunila Sahu } 1953ac42813aSSunila Sahu 1954ac42813aSSunila Sahu DSA_SIG_free(sign); 1955ac42813aSSunila Sahu 1956ac42813aSSunila Sahu return 0; 1957ac42813aSSunila Sahu } 1958ac42813aSSunila Sahu 1959ac42813aSSunila Sahu /* process dsa verify operation */ 1960ac42813aSSunila Sahu static int 1961ac42813aSSunila Sahu process_openssl_dsa_verify_op(struct rte_crypto_op *cop, 1962ac42813aSSunila Sahu struct openssl_asym_session *sess) 1963ac42813aSSunila Sahu { 1964ac42813aSSunila Sahu struct rte_crypto_dsa_op_param *op = &cop->asym->dsa; 1965ac42813aSSunila Sahu DSA *dsa = sess->u.s.dsa; 1966ac42813aSSunila Sahu int ret; 1967ac42813aSSunila Sahu DSA_SIG *sign = DSA_SIG_new(); 1968ac42813aSSunila Sahu BIGNUM *r = NULL, *s = NULL; 1969ac42813aSSunila Sahu BIGNUM *pub_key = NULL; 1970ac42813aSSunila Sahu 1971ac42813aSSunila Sahu if (sign == NULL) { 1972ac42813aSSunila Sahu OPENSSL_LOG(ERR, " %s:%d\n", __func__, __LINE__); 1973ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 1974ac42813aSSunila Sahu return -1; 1975ac42813aSSunila Sahu } 1976ac42813aSSunila Sahu 1977ac42813aSSunila Sahu r = BN_bin2bn(op->r.data, 1978ac42813aSSunila Sahu op->r.length, 1979ac42813aSSunila Sahu r); 1980ac42813aSSunila Sahu s = BN_bin2bn(op->s.data, 1981ac42813aSSunila Sahu op->s.length, 1982ac42813aSSunila Sahu s); 1983ac42813aSSunila Sahu pub_key = BN_bin2bn(op->y.data, 1984ac42813aSSunila Sahu op->y.length, 1985ac42813aSSunila Sahu pub_key); 1986ac42813aSSunila Sahu if (!r || !s || !pub_key) { 1987ac42813aSSunila Sahu BN_free(r); 1988ac42813aSSunila Sahu BN_free(s); 1989ac42813aSSunila Sahu BN_free(pub_key); 1990ac42813aSSunila Sahu 1991ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 1992ac42813aSSunila Sahu return -1; 1993ac42813aSSunila Sahu } 1994ac42813aSSunila Sahu set_dsa_sign(sign, r, s); 1995ac42813aSSunila Sahu set_dsa_pub_key(dsa, pub_key); 1996ac42813aSSunila Sahu 1997ac42813aSSunila Sahu ret = DSA_do_verify(op->message.data, 1998ac42813aSSunila Sahu op->message.length, 1999ac42813aSSunila Sahu sign, 2000ac42813aSSunila Sahu dsa); 2001ac42813aSSunila Sahu 2002ac42813aSSunila Sahu if (ret != 1) 2003ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 2004ac42813aSSunila Sahu else 2005ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 2006ac42813aSSunila Sahu 2007ac42813aSSunila Sahu DSA_SIG_free(sign); 2008ac42813aSSunila Sahu 2009ac42813aSSunila Sahu return 0; 2010ac42813aSSunila Sahu } 20114c7ae22fSKai Ji #endif 2012ac42813aSSunila Sahu 2013ac42813aSSunila Sahu /* process dh operation */ 2014c794b40cSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 2015c794b40cSKai Ji static int 2016c794b40cSKai Ji process_openssl_dh_op_evp(struct rte_crypto_op *cop, 2017c794b40cSKai Ji struct openssl_asym_session *sess) 2018c794b40cSKai Ji { 2019c794b40cSKai Ji struct rte_crypto_dh_op_param *op = &cop->asym->dh; 2020c794b40cSKai Ji OSSL_PARAM_BLD *param_bld = sess->u.dh.param_bld; 2021c794b40cSKai Ji OSSL_PARAM_BLD *param_bld_peer = sess->u.dh.param_bld_peer; 2022c794b40cSKai Ji OSSL_PARAM *params = NULL; 2023c794b40cSKai Ji EVP_PKEY *dhpkey = NULL; 2024c794b40cSKai Ji EVP_PKEY *peerkey = NULL; 2025c794b40cSKai Ji BIGNUM *priv_key = NULL; 2026c794b40cSKai Ji BIGNUM *pub_key = NULL; 2027c794b40cSKai Ji int ret = -1; 2028c794b40cSKai Ji 2029c794b40cSKai Ji cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 2030c794b40cSKai Ji EVP_PKEY_CTX *dh_ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DH, NULL); 2031c794b40cSKai Ji if (dh_ctx == NULL || param_bld == NULL) 2032c794b40cSKai Ji return ret; 2033c794b40cSKai Ji 2034c794b40cSKai Ji if (op->ke_type == RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE) { 2035c794b40cSKai Ji OSSL_PARAM *params_peer = NULL; 2036c794b40cSKai Ji 2037c794b40cSKai Ji if (!param_bld_peer) 2038c794b40cSKai Ji return ret; 2039c794b40cSKai Ji 2040c794b40cSKai Ji pub_key = BN_bin2bn(op->pub_key.data, op->pub_key.length, 2041c794b40cSKai Ji pub_key); 2042c794b40cSKai Ji if (pub_key == NULL) { 2043c794b40cSKai Ji OSSL_PARAM_BLD_free(param_bld_peer); 2044c794b40cSKai Ji return ret; 2045c794b40cSKai Ji } 2046c794b40cSKai Ji 2047c794b40cSKai Ji if (!OSSL_PARAM_BLD_push_BN(param_bld_peer, OSSL_PKEY_PARAM_PUB_KEY, 2048c794b40cSKai Ji pub_key)) { 2049c794b40cSKai Ji OPENSSL_LOG(ERR, "Failed to set public key\n"); 2050c794b40cSKai Ji OSSL_PARAM_BLD_free(param_bld_peer); 2051c794b40cSKai Ji BN_free(pub_key); 2052c794b40cSKai Ji return ret; 2053c794b40cSKai Ji } 2054c794b40cSKai Ji 2055c794b40cSKai Ji params_peer = OSSL_PARAM_BLD_to_param(param_bld_peer); 2056c794b40cSKai Ji if (!params_peer) { 2057c794b40cSKai Ji OSSL_PARAM_BLD_free(param_bld_peer); 2058c794b40cSKai Ji BN_free(pub_key); 2059c794b40cSKai Ji return ret; 2060c794b40cSKai Ji } 2061c794b40cSKai Ji 2062c794b40cSKai Ji EVP_PKEY_CTX *peer_ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DH, NULL); 2063c794b40cSKai Ji if (EVP_PKEY_keygen_init(peer_ctx) != 1) { 2064c794b40cSKai Ji OSSL_PARAM_free(params_peer); 2065c794b40cSKai Ji BN_free(pub_key); 2066c794b40cSKai Ji return ret; 2067c794b40cSKai Ji } 2068c794b40cSKai Ji 2069c794b40cSKai Ji if (EVP_PKEY_CTX_set_params(peer_ctx, params_peer) != 1) { 2070c794b40cSKai Ji EVP_PKEY_CTX_free(peer_ctx); 2071c794b40cSKai Ji OSSL_PARAM_free(params_peer); 2072c794b40cSKai Ji BN_free(pub_key); 2073c794b40cSKai Ji return ret; 2074c794b40cSKai Ji } 2075c794b40cSKai Ji 2076c794b40cSKai Ji if (EVP_PKEY_keygen(peer_ctx, &peerkey) != 1) { 2077c794b40cSKai Ji EVP_PKEY_CTX_free(peer_ctx); 2078c794b40cSKai Ji OSSL_PARAM_free(params_peer); 2079c794b40cSKai Ji BN_free(pub_key); 2080c794b40cSKai Ji return ret; 2081c794b40cSKai Ji } 2082c794b40cSKai Ji 2083c794b40cSKai Ji priv_key = BN_bin2bn(op->priv_key.data, op->priv_key.length, 2084c794b40cSKai Ji priv_key); 2085c794b40cSKai Ji if (priv_key == NULL) { 2086c794b40cSKai Ji EVP_PKEY_CTX_free(peer_ctx); 2087c794b40cSKai Ji OSSL_PARAM_free(params_peer); 2088c794b40cSKai Ji BN_free(pub_key); 2089c794b40cSKai Ji return ret; 2090c794b40cSKai Ji } 2091c794b40cSKai Ji 2092c794b40cSKai Ji if (!OSSL_PARAM_BLD_push_BN(param_bld, OSSL_PKEY_PARAM_PRIV_KEY, 2093c794b40cSKai Ji priv_key)) { 2094c794b40cSKai Ji OPENSSL_LOG(ERR, "Failed to set private key\n"); 2095c794b40cSKai Ji EVP_PKEY_CTX_free(peer_ctx); 2096c794b40cSKai Ji OSSL_PARAM_free(params_peer); 2097c794b40cSKai Ji BN_free(pub_key); 2098c794b40cSKai Ji BN_free(priv_key); 2099c794b40cSKai Ji return ret; 2100c794b40cSKai Ji } 2101c794b40cSKai Ji 2102c794b40cSKai Ji OSSL_PARAM_free(params_peer); 2103c794b40cSKai Ji EVP_PKEY_CTX_free(peer_ctx); 2104c794b40cSKai Ji } 2105c794b40cSKai Ji 2106c794b40cSKai Ji params = OSSL_PARAM_BLD_to_param(param_bld); 2107c794b40cSKai Ji if (!params) 2108c794b40cSKai Ji goto err_dh; 2109c794b40cSKai Ji 2110c794b40cSKai Ji if (EVP_PKEY_keygen_init(dh_ctx) != 1) 2111c794b40cSKai Ji goto err_dh; 2112c794b40cSKai Ji 2113c794b40cSKai Ji if (EVP_PKEY_CTX_set_params(dh_ctx, params) != 1) 2114c794b40cSKai Ji goto err_dh; 2115c794b40cSKai Ji 2116c794b40cSKai Ji if (EVP_PKEY_keygen(dh_ctx, &dhpkey) != 1) 2117c794b40cSKai Ji goto err_dh; 2118c794b40cSKai Ji 2119c794b40cSKai Ji if (op->ke_type == RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE) { 2120c794b40cSKai Ji OPENSSL_LOG(DEBUG, "%s:%d updated pub key\n", __func__, __LINE__); 2121c794b40cSKai Ji if (!EVP_PKEY_get_bn_param(dhpkey, OSSL_PKEY_PARAM_PUB_KEY, &pub_key)) 2122c794b40cSKai Ji goto err_dh; 2123c794b40cSKai Ji /* output public key */ 2124c794b40cSKai Ji op->pub_key.length = BN_bn2bin(pub_key, op->pub_key.data); 2125c794b40cSKai Ji } 2126c794b40cSKai Ji 2127c794b40cSKai Ji if (op->ke_type == RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE) { 2128c794b40cSKai Ji 2129c794b40cSKai Ji OPENSSL_LOG(DEBUG, "%s:%d updated priv key\n", __func__, __LINE__); 2130c794b40cSKai Ji if (!EVP_PKEY_get_bn_param(dhpkey, OSSL_PKEY_PARAM_PRIV_KEY, &priv_key)) 2131c794b40cSKai Ji goto err_dh; 2132c794b40cSKai Ji 2133c794b40cSKai Ji /* provide generated private key back to user */ 2134c794b40cSKai Ji op->priv_key.length = BN_bn2bin(priv_key, op->priv_key.data); 2135c794b40cSKai Ji } 2136c794b40cSKai Ji 2137c794b40cSKai Ji if (op->ke_type == RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE) { 2138c794b40cSKai Ji size_t skey_len; 2139c794b40cSKai Ji EVP_PKEY_CTX *sc_ctx = EVP_PKEY_CTX_new(dhpkey, NULL); 2140c794b40cSKai Ji if (!sc_ctx) 2141c794b40cSKai Ji goto err_dh; 2142c794b40cSKai Ji 2143c794b40cSKai Ji if (EVP_PKEY_derive_init(sc_ctx) <= 0) { 2144c794b40cSKai Ji EVP_PKEY_CTX_free(sc_ctx); 2145c794b40cSKai Ji goto err_dh; 2146c794b40cSKai Ji } 2147c794b40cSKai Ji 2148c794b40cSKai Ji if (!peerkey) { 2149c794b40cSKai Ji EVP_PKEY_CTX_free(sc_ctx); 2150c794b40cSKai Ji goto err_dh; 2151c794b40cSKai Ji } 2152c794b40cSKai Ji 2153c794b40cSKai Ji if (EVP_PKEY_derive_set_peer(sc_ctx, peerkey) <= 0) { 2154c794b40cSKai Ji EVP_PKEY_CTX_free(sc_ctx); 2155c794b40cSKai Ji goto err_dh; 2156c794b40cSKai Ji } 2157c794b40cSKai Ji 2158c794b40cSKai Ji /* Determine buffer length */ 2159c794b40cSKai Ji if (EVP_PKEY_derive(sc_ctx, NULL, &skey_len) <= 0) { 2160c794b40cSKai Ji EVP_PKEY_CTX_free(sc_ctx); 2161c794b40cSKai Ji goto err_dh; 2162c794b40cSKai Ji } 2163c794b40cSKai Ji 2164c794b40cSKai Ji if (EVP_PKEY_derive(sc_ctx, op->shared_secret.data, &skey_len) <= 0) { 2165c794b40cSKai Ji EVP_PKEY_CTX_free(sc_ctx); 2166c794b40cSKai Ji goto err_dh; 2167c794b40cSKai Ji } 2168c794b40cSKai Ji 2169c794b40cSKai Ji op->shared_secret.length = skey_len; 2170c794b40cSKai Ji EVP_PKEY_CTX_free(sc_ctx); 2171c794b40cSKai Ji } 2172c794b40cSKai Ji 2173c794b40cSKai Ji cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 2174c794b40cSKai Ji ret = 0; 2175c794b40cSKai Ji 2176c794b40cSKai Ji err_dh: 2177c794b40cSKai Ji if (pub_key) 2178c794b40cSKai Ji BN_free(pub_key); 2179c794b40cSKai Ji if (priv_key) 2180c794b40cSKai Ji BN_free(priv_key); 2181c794b40cSKai Ji if (params) 2182c794b40cSKai Ji OSSL_PARAM_free(params); 2183c794b40cSKai Ji if (dhpkey) 2184c794b40cSKai Ji EVP_PKEY_free(dhpkey); 2185c794b40cSKai Ji if (peerkey) 2186c794b40cSKai Ji EVP_PKEY_free(peerkey); 2187c794b40cSKai Ji 2188c794b40cSKai Ji EVP_PKEY_CTX_free(dh_ctx); 2189c794b40cSKai Ji 2190c794b40cSKai Ji return ret; 2191c794b40cSKai Ji } 2192c794b40cSKai Ji #else 2193ac42813aSSunila Sahu static int 2194ac42813aSSunila Sahu process_openssl_dh_op(struct rte_crypto_op *cop, 2195ac42813aSSunila Sahu struct openssl_asym_session *sess) 2196ac42813aSSunila Sahu { 2197ac42813aSSunila Sahu struct rte_crypto_dh_op_param *op = &cop->asym->dh; 2198515a704dSArek Kusztal struct rte_crypto_asym_op *asym_op = cop->asym; 2199ac42813aSSunila Sahu DH *dh_key = sess->u.dh.dh_key; 2200ac42813aSSunila Sahu BIGNUM *priv_key = NULL; 2201ac42813aSSunila Sahu int ret = 0; 2202ac42813aSSunila Sahu 2203515a704dSArek Kusztal if (asym_op->dh.ke_type == RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE) { 2204ac42813aSSunila Sahu /* compute shared secret using peer public key 2205ac42813aSSunila Sahu * and current private key 2206ac42813aSSunila Sahu * shared secret = peer_key ^ priv_key mod p 2207ac42813aSSunila Sahu */ 2208ac42813aSSunila Sahu BIGNUM *peer_key = NULL; 2209ac42813aSSunila Sahu 2210ac42813aSSunila Sahu /* copy private key and peer key and compute shared secret */ 2211ac42813aSSunila Sahu peer_key = BN_bin2bn(op->pub_key.data, 2212ac42813aSSunila Sahu op->pub_key.length, 2213ac42813aSSunila Sahu peer_key); 2214ac42813aSSunila Sahu if (peer_key == NULL) { 2215ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 2216ac42813aSSunila Sahu return -1; 2217ac42813aSSunila Sahu } 2218ac42813aSSunila Sahu priv_key = BN_bin2bn(op->priv_key.data, 2219ac42813aSSunila Sahu op->priv_key.length, 2220ac42813aSSunila Sahu priv_key); 2221ac42813aSSunila Sahu if (priv_key == NULL) { 2222ac42813aSSunila Sahu BN_free(peer_key); 2223ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 2224ac42813aSSunila Sahu return -1; 2225ac42813aSSunila Sahu } 22260b5284adSAshish Gupta ret = set_dh_priv_key(dh_key, priv_key); 2227ac42813aSSunila Sahu if (ret) { 2228ac42813aSSunila Sahu OPENSSL_LOG(ERR, "Failed to set private key\n"); 2229ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 2230ac42813aSSunila Sahu BN_free(peer_key); 2231ac42813aSSunila Sahu BN_free(priv_key); 2232ac42813aSSunila Sahu return 0; 2233ac42813aSSunila Sahu } 2234ac42813aSSunila Sahu 2235ac42813aSSunila Sahu ret = DH_compute_key( 2236ac42813aSSunila Sahu op->shared_secret.data, 2237ac42813aSSunila Sahu peer_key, dh_key); 2238ac42813aSSunila Sahu if (ret < 0) { 2239ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 2240ac42813aSSunila Sahu BN_free(peer_key); 2241ac42813aSSunila Sahu /* priv key is already loaded into dh, 2242ac42813aSSunila Sahu * let's not free that directly here. 2243ac42813aSSunila Sahu * DH_free() will auto free it later. 2244ac42813aSSunila Sahu */ 2245ac42813aSSunila Sahu return 0; 2246ac42813aSSunila Sahu } 2247ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 2248ac42813aSSunila Sahu op->shared_secret.length = ret; 2249ac42813aSSunila Sahu BN_free(peer_key); 2250ac42813aSSunila Sahu return 0; 2251ac42813aSSunila Sahu } 2252ac42813aSSunila Sahu 2253ac42813aSSunila Sahu /* 2254ac42813aSSunila Sahu * other options are public and private key generations. 2255ac42813aSSunila Sahu * 2256ac42813aSSunila Sahu * if user provides private key, 2257ac42813aSSunila Sahu * then first set DH with user provided private key 2258ac42813aSSunila Sahu */ 2259515a704dSArek Kusztal if (asym_op->dh.ke_type == RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE && 2260515a704dSArek Kusztal op->priv_key.length) { 2261ac42813aSSunila Sahu /* generate public key using user-provided private key 2262ac42813aSSunila Sahu * pub_key = g ^ priv_key mod p 2263ac42813aSSunila Sahu */ 2264ac42813aSSunila Sahu 2265ac42813aSSunila Sahu /* load private key into DH */ 2266ac42813aSSunila Sahu priv_key = BN_bin2bn(op->priv_key.data, 2267ac42813aSSunila Sahu op->priv_key.length, 2268ac42813aSSunila Sahu priv_key); 2269ac42813aSSunila Sahu if (priv_key == NULL) { 2270ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 2271ac42813aSSunila Sahu return -1; 2272ac42813aSSunila Sahu } 22730b5284adSAshish Gupta ret = set_dh_priv_key(dh_key, priv_key); 2274ac42813aSSunila Sahu if (ret) { 2275ac42813aSSunila Sahu OPENSSL_LOG(ERR, "Failed to set private key\n"); 2276ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 2277ac42813aSSunila Sahu BN_free(priv_key); 2278ac42813aSSunila Sahu return 0; 2279ac42813aSSunila Sahu } 2280ac42813aSSunila Sahu } 2281ac42813aSSunila Sahu 2282ac42813aSSunila Sahu /* generate public and private key pair. 2283ac42813aSSunila Sahu * 2284ac42813aSSunila Sahu * if private key already set, generates only public key. 2285ac42813aSSunila Sahu * 2286ac42813aSSunila Sahu * if private key is not already set, then set it to random value 2287ac42813aSSunila Sahu * and update internal private key. 2288ac42813aSSunila Sahu */ 2289ac42813aSSunila Sahu if (!DH_generate_key(dh_key)) { 2290ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 2291ac42813aSSunila Sahu return 0; 2292ac42813aSSunila Sahu } 2293ac42813aSSunila Sahu 2294515a704dSArek Kusztal if (asym_op->dh.ke_type == RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE) { 2295ac42813aSSunila Sahu const BIGNUM *pub_key = NULL; 2296ac42813aSSunila Sahu 2297ac42813aSSunila Sahu OPENSSL_LOG(DEBUG, "%s:%d update public key\n", 2298ac42813aSSunila Sahu __func__, __LINE__); 2299ac42813aSSunila Sahu 2300ac42813aSSunila Sahu /* get the generated keys */ 23010b5284adSAshish Gupta get_dh_pub_key(dh_key, &pub_key); 2302ac42813aSSunila Sahu 2303ac42813aSSunila Sahu /* output public key */ 2304ac42813aSSunila Sahu op->pub_key.length = BN_bn2bin(pub_key, 2305ac42813aSSunila Sahu op->pub_key.data); 2306ac42813aSSunila Sahu } 2307ac42813aSSunila Sahu 2308515a704dSArek Kusztal if (asym_op->dh.ke_type == RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE) { 2309ac42813aSSunila Sahu const BIGNUM *priv_key = NULL; 2310ac42813aSSunila Sahu 2311ac42813aSSunila Sahu OPENSSL_LOG(DEBUG, "%s:%d updated priv key\n", 2312ac42813aSSunila Sahu __func__, __LINE__); 2313ac42813aSSunila Sahu 2314ac42813aSSunila Sahu /* get the generated keys */ 23150b5284adSAshish Gupta get_dh_priv_key(dh_key, &priv_key); 2316ac42813aSSunila Sahu 2317ac42813aSSunila Sahu /* provide generated private key back to user */ 2318ac42813aSSunila Sahu op->priv_key.length = BN_bn2bin(priv_key, 2319ac42813aSSunila Sahu op->priv_key.data); 2320ac42813aSSunila Sahu } 2321ac42813aSSunila Sahu 2322ac42813aSSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 2323ac42813aSSunila Sahu 2324ac42813aSSunila Sahu return 0; 2325ac42813aSSunila Sahu } 2326c794b40cSKai Ji #endif 2327ac42813aSSunila Sahu 23283e9d6bd4SSunila Sahu /* process modinv operation */ 23293e9d6bd4SSunila Sahu static int 23303e9d6bd4SSunila Sahu process_openssl_modinv_op(struct rte_crypto_op *cop, 23313e9d6bd4SSunila Sahu struct openssl_asym_session *sess) 23323e9d6bd4SSunila Sahu { 23333e9d6bd4SSunila Sahu struct rte_crypto_asym_op *op = cop->asym; 23343e9d6bd4SSunila Sahu BIGNUM *base = BN_CTX_get(sess->u.m.ctx); 23353e9d6bd4SSunila Sahu BIGNUM *res = BN_CTX_get(sess->u.m.ctx); 23363e9d6bd4SSunila Sahu 23373e9d6bd4SSunila Sahu if (unlikely(base == NULL || res == NULL)) { 23383e9d6bd4SSunila Sahu BN_free(base); 23393e9d6bd4SSunila Sahu BN_free(res); 23403e9d6bd4SSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 23413e9d6bd4SSunila Sahu return -1; 23423e9d6bd4SSunila Sahu } 23433e9d6bd4SSunila Sahu 23443e9d6bd4SSunila Sahu base = BN_bin2bn((const unsigned char *)op->modinv.base.data, 23453e9d6bd4SSunila Sahu op->modinv.base.length, base); 23463e9d6bd4SSunila Sahu 23473e9d6bd4SSunila Sahu if (BN_mod_inverse(res, base, sess->u.m.modulus, sess->u.m.ctx)) { 23483e9d6bd4SSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 2349aeded111SArek Kusztal op->modinv.result.length = BN_bn2bin(res, op->modinv.result.data); 23503e9d6bd4SSunila Sahu } else { 23513e9d6bd4SSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 23523e9d6bd4SSunila Sahu } 23533e9d6bd4SSunila Sahu 2354990b1802SArek Kusztal BN_clear(res); 2355990b1802SArek Kusztal BN_clear(base); 2356990b1802SArek Kusztal 23573e9d6bd4SSunila Sahu return 0; 23583e9d6bd4SSunila Sahu } 23593e9d6bd4SSunila Sahu 23603e9d6bd4SSunila Sahu /* process modexp operation */ 23613e9d6bd4SSunila Sahu static int 23623e9d6bd4SSunila Sahu process_openssl_modexp_op(struct rte_crypto_op *cop, 23633e9d6bd4SSunila Sahu struct openssl_asym_session *sess) 23643e9d6bd4SSunila Sahu { 23653e9d6bd4SSunila Sahu struct rte_crypto_asym_op *op = cop->asym; 23663e9d6bd4SSunila Sahu BIGNUM *base = BN_CTX_get(sess->u.e.ctx); 23673e9d6bd4SSunila Sahu BIGNUM *res = BN_CTX_get(sess->u.e.ctx); 23683e9d6bd4SSunila Sahu 23693e9d6bd4SSunila Sahu if (unlikely(base == NULL || res == NULL)) { 23703e9d6bd4SSunila Sahu BN_free(base); 23713e9d6bd4SSunila Sahu BN_free(res); 23723e9d6bd4SSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 23733e9d6bd4SSunila Sahu return -1; 23743e9d6bd4SSunila Sahu } 23753e9d6bd4SSunila Sahu 237627323f53SArek Kusztal base = BN_bin2bn((const unsigned char *)op->modex.base.data, 237727323f53SArek Kusztal op->modex.base.length, base); 23783e9d6bd4SSunila Sahu 23793e9d6bd4SSunila Sahu if (BN_mod_exp(res, base, sess->u.e.exp, 23803e9d6bd4SSunila Sahu sess->u.e.mod, sess->u.e.ctx)) { 2381aeded111SArek Kusztal op->modex.result.length = BN_bn2bin(res, op->modex.result.data); 23823e9d6bd4SSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 23833e9d6bd4SSunila Sahu } else { 23843e9d6bd4SSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 23853e9d6bd4SSunila Sahu } 23863e9d6bd4SSunila Sahu 2387990b1802SArek Kusztal BN_clear(res); 2388990b1802SArek Kusztal BN_clear(base); 2389990b1802SArek Kusztal 23903e9d6bd4SSunila Sahu return 0; 23913e9d6bd4SSunila Sahu } 23923e9d6bd4SSunila Sahu 23933e9d6bd4SSunila Sahu /* process rsa operations */ 2394d7bd42f6SKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 2395d7bd42f6SKai Ji static int 2396d7bd42f6SKai Ji process_openssl_rsa_op_evp(struct rte_crypto_op *cop, 2397d7bd42f6SKai Ji struct openssl_asym_session *sess) 2398d7bd42f6SKai Ji { 2399d7bd42f6SKai Ji struct rte_crypto_asym_op *op = cop->asym; 2400d7bd42f6SKai Ji uint32_t pad = (op->rsa.padding.type); 2401d7bd42f6SKai Ji uint8_t *tmp; 2402d7bd42f6SKai Ji size_t outlen = 0; 2403d7bd42f6SKai Ji int ret = -1; 2404d7bd42f6SKai Ji 2405d7bd42f6SKai Ji cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 2406d7bd42f6SKai Ji EVP_PKEY_CTX *rsa_ctx = sess->u.r.ctx; 2407d7bd42f6SKai Ji if (!rsa_ctx) 2408d7bd42f6SKai Ji return ret; 2409d7bd42f6SKai Ji 2410d7bd42f6SKai Ji switch (pad) { 2411d7bd42f6SKai Ji case RTE_CRYPTO_RSA_PADDING_PKCS1_5: 2412d7bd42f6SKai Ji pad = RSA_PKCS1_PADDING; 2413d7bd42f6SKai Ji break; 2414d7bd42f6SKai Ji case RTE_CRYPTO_RSA_PADDING_NONE: 2415d7bd42f6SKai Ji pad = RSA_NO_PADDING; 2416d7bd42f6SKai Ji break; 2417d7bd42f6SKai Ji default: 2418d7bd42f6SKai Ji cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; 2419d7bd42f6SKai Ji OPENSSL_LOG(ERR, 2420d7bd42f6SKai Ji "rsa pad type not supported %d\n", pad); 2421d7bd42f6SKai Ji return ret; 2422d7bd42f6SKai Ji } 2423d7bd42f6SKai Ji 2424d7bd42f6SKai Ji switch (op->rsa.op_type) { 2425d7bd42f6SKai Ji case RTE_CRYPTO_ASYM_OP_ENCRYPT: 2426d7bd42f6SKai Ji if (EVP_PKEY_encrypt_init(rsa_ctx) != 1) 2427d7bd42f6SKai Ji goto err_rsa; 2428d7bd42f6SKai Ji 2429d7bd42f6SKai Ji if (EVP_PKEY_CTX_set_rsa_padding(rsa_ctx, pad) <= 0) 2430d7bd42f6SKai Ji goto err_rsa; 2431d7bd42f6SKai Ji 2432d7bd42f6SKai Ji if (EVP_PKEY_encrypt(rsa_ctx, NULL, &outlen, 2433d7bd42f6SKai Ji op->rsa.message.data, 2434d7bd42f6SKai Ji op->rsa.message.length) <= 0) 2435d7bd42f6SKai Ji goto err_rsa; 2436d7bd42f6SKai Ji 2437d7bd42f6SKai Ji if (outlen <= 0) 2438d7bd42f6SKai Ji goto err_rsa; 2439d7bd42f6SKai Ji 2440d7bd42f6SKai Ji if (EVP_PKEY_encrypt(rsa_ctx, op->rsa.cipher.data, &outlen, 2441d7bd42f6SKai Ji op->rsa.message.data, 2442d7bd42f6SKai Ji op->rsa.message.length) <= 0) 2443d7bd42f6SKai Ji goto err_rsa; 2444d7bd42f6SKai Ji op->rsa.cipher.length = outlen; 2445d7bd42f6SKai Ji 2446d7bd42f6SKai Ji OPENSSL_LOG(DEBUG, 2447d7bd42f6SKai Ji "length of encrypted text %zu\n", outlen); 2448d7bd42f6SKai Ji break; 2449d7bd42f6SKai Ji 2450d7bd42f6SKai Ji case RTE_CRYPTO_ASYM_OP_DECRYPT: 2451d7bd42f6SKai Ji if (EVP_PKEY_decrypt_init(rsa_ctx) != 1) 2452d7bd42f6SKai Ji goto err_rsa; 2453d7bd42f6SKai Ji 2454d7bd42f6SKai Ji if (EVP_PKEY_CTX_set_rsa_padding(rsa_ctx, pad) <= 0) 2455d7bd42f6SKai Ji goto err_rsa; 2456d7bd42f6SKai Ji 2457d7bd42f6SKai Ji if (EVP_PKEY_decrypt(rsa_ctx, NULL, &outlen, 2458d7bd42f6SKai Ji op->rsa.cipher.data, 2459d7bd42f6SKai Ji op->rsa.cipher.length) <= 0) 2460d7bd42f6SKai Ji goto err_rsa; 2461d7bd42f6SKai Ji 2462d7bd42f6SKai Ji if (outlen <= 0) 2463d7bd42f6SKai Ji goto err_rsa; 2464d7bd42f6SKai Ji 2465d7bd42f6SKai Ji if (EVP_PKEY_decrypt(rsa_ctx, op->rsa.message.data, &outlen, 2466d7bd42f6SKai Ji op->rsa.cipher.data, 2467d7bd42f6SKai Ji op->rsa.cipher.length) <= 0) 2468d7bd42f6SKai Ji goto err_rsa; 2469d7bd42f6SKai Ji op->rsa.message.length = outlen; 2470d7bd42f6SKai Ji 2471d7bd42f6SKai Ji OPENSSL_LOG(DEBUG, "length of decrypted text %zu\n", outlen); 2472d7bd42f6SKai Ji break; 2473d7bd42f6SKai Ji 2474d7bd42f6SKai Ji case RTE_CRYPTO_ASYM_OP_SIGN: 2475d7bd42f6SKai Ji if (EVP_PKEY_sign_init(rsa_ctx) <= 0) 2476d7bd42f6SKai Ji goto err_rsa; 2477d7bd42f6SKai Ji 2478d7bd42f6SKai Ji if (EVP_PKEY_CTX_set_rsa_padding(rsa_ctx, pad) <= 0) 2479d7bd42f6SKai Ji goto err_rsa; 2480d7bd42f6SKai Ji 248181e3122fSKai Ji if (EVP_PKEY_sign(rsa_ctx, NULL, &outlen, 248281e3122fSKai Ji op->rsa.message.data, 248381e3122fSKai Ji op->rsa.message.length) <= 0) 248481e3122fSKai Ji goto err_rsa; 248581e3122fSKai Ji 248681e3122fSKai Ji if (outlen <= 0) 248781e3122fSKai Ji goto err_rsa; 248881e3122fSKai Ji 2489d7bd42f6SKai Ji if (EVP_PKEY_sign(rsa_ctx, op->rsa.sign.data, &outlen, 2490d7bd42f6SKai Ji op->rsa.message.data, 2491d7bd42f6SKai Ji op->rsa.message.length) <= 0) 2492d7bd42f6SKai Ji goto err_rsa; 2493d7bd42f6SKai Ji op->rsa.sign.length = outlen; 2494d7bd42f6SKai Ji break; 2495d7bd42f6SKai Ji 2496d7bd42f6SKai Ji case RTE_CRYPTO_ASYM_OP_VERIFY: 249781e3122fSKai Ji if (EVP_PKEY_verify_recover_init(rsa_ctx) <= 0) 249881e3122fSKai Ji goto err_rsa; 249981e3122fSKai Ji 250081e3122fSKai Ji if (EVP_PKEY_CTX_set_rsa_padding(rsa_ctx, pad) <= 0) 250181e3122fSKai Ji goto err_rsa; 250281e3122fSKai Ji 250381e3122fSKai Ji if (EVP_PKEY_verify_recover(rsa_ctx, NULL, &outlen, 250481e3122fSKai Ji op->rsa.sign.data, 250581e3122fSKai Ji op->rsa.sign.length) <= 0) 250681e3122fSKai Ji goto err_rsa; 250781e3122fSKai Ji 250881e3122fSKai Ji if ((outlen <= 0) || (outlen != op->rsa.sign.length)) 250981e3122fSKai Ji goto err_rsa; 251081e3122fSKai Ji 251181e3122fSKai Ji tmp = OPENSSL_malloc(outlen); 2512d7bd42f6SKai Ji if (tmp == NULL) { 2513d7bd42f6SKai Ji OPENSSL_LOG(ERR, "Memory allocation failed"); 2514d7bd42f6SKai Ji goto err_rsa; 2515d7bd42f6SKai Ji } 2516d7bd42f6SKai Ji 2517d7bd42f6SKai Ji if (EVP_PKEY_verify_recover(rsa_ctx, tmp, &outlen, 2518d7bd42f6SKai Ji op->rsa.sign.data, 2519d7bd42f6SKai Ji op->rsa.sign.length) <= 0) { 2520d7bd42f6SKai Ji rte_free(tmp); 2521d7bd42f6SKai Ji goto err_rsa; 2522d7bd42f6SKai Ji } 2523d7bd42f6SKai Ji 2524d7bd42f6SKai Ji OPENSSL_LOG(DEBUG, 2525d7bd42f6SKai Ji "Length of public_decrypt %zu " 2526d7bd42f6SKai Ji "length of message %zd\n", 2527d7bd42f6SKai Ji outlen, op->rsa.message.length); 2528d7bd42f6SKai Ji if (CRYPTO_memcmp(tmp, op->rsa.message.data, 2529d7bd42f6SKai Ji op->rsa.message.length)) { 2530d7bd42f6SKai Ji OPENSSL_LOG(ERR, "RSA sign Verification failed"); 2531d7bd42f6SKai Ji } 2532d7bd42f6SKai Ji rte_free(tmp); 2533d7bd42f6SKai Ji break; 2534d7bd42f6SKai Ji 2535d7bd42f6SKai Ji default: 2536d7bd42f6SKai Ji /* allow ops with invalid args to be pushed to 2537d7bd42f6SKai Ji * completion queue 2538d7bd42f6SKai Ji */ 2539d7bd42f6SKai Ji cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; 2540d7bd42f6SKai Ji goto err_rsa; 2541d7bd42f6SKai Ji } 2542d7bd42f6SKai Ji 2543d7bd42f6SKai Ji ret = 0; 2544d7bd42f6SKai Ji cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 2545d7bd42f6SKai Ji err_rsa: 2546d7bd42f6SKai Ji return ret; 2547d7bd42f6SKai Ji 2548d7bd42f6SKai Ji } 2549d7bd42f6SKai Ji #else 25503e9d6bd4SSunila Sahu static int 25513e9d6bd4SSunila Sahu process_openssl_rsa_op(struct rte_crypto_op *cop, 25523e9d6bd4SSunila Sahu struct openssl_asym_session *sess) 25533e9d6bd4SSunila Sahu { 25543e9d6bd4SSunila Sahu int ret = 0; 25553e9d6bd4SSunila Sahu struct rte_crypto_asym_op *op = cop->asym; 25563e9d6bd4SSunila Sahu RSA *rsa = sess->u.r.rsa; 2557db8d2a2cSArek Kusztal uint32_t pad = (op->rsa.padding.type); 2558fe1606e0SAkash Saxena uint8_t *tmp; 2559fe1606e0SAkash Saxena 2560fe1606e0SAkash Saxena cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 25613e9d6bd4SSunila Sahu 25623e9d6bd4SSunila Sahu switch (pad) { 256340dd1f42SArek Kusztal case RTE_CRYPTO_RSA_PADDING_PKCS1_5: 25643e9d6bd4SSunila Sahu pad = RSA_PKCS1_PADDING; 25653e9d6bd4SSunila Sahu break; 25663e9d6bd4SSunila Sahu case RTE_CRYPTO_RSA_PADDING_NONE: 25673e9d6bd4SSunila Sahu pad = RSA_NO_PADDING; 25683e9d6bd4SSunila Sahu break; 25693e9d6bd4SSunila Sahu default: 25703e9d6bd4SSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; 25713e9d6bd4SSunila Sahu OPENSSL_LOG(ERR, 25723e9d6bd4SSunila Sahu "rsa pad type not supported %d\n", pad); 25733e9d6bd4SSunila Sahu return 0; 25743e9d6bd4SSunila Sahu } 25753e9d6bd4SSunila Sahu 25763e9d6bd4SSunila Sahu switch (op->rsa.op_type) { 25773e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_OP_ENCRYPT: 25783e9d6bd4SSunila Sahu ret = RSA_public_encrypt(op->rsa.message.length, 25793e9d6bd4SSunila Sahu op->rsa.message.data, 2580501ed9c6SArek Kusztal op->rsa.cipher.data, 25813e9d6bd4SSunila Sahu rsa, 25823e9d6bd4SSunila Sahu pad); 25833e9d6bd4SSunila Sahu 25843e9d6bd4SSunila Sahu if (ret > 0) 2585501ed9c6SArek Kusztal op->rsa.cipher.length = ret; 25863e9d6bd4SSunila Sahu OPENSSL_LOG(DEBUG, 25873e9d6bd4SSunila Sahu "length of encrypted text %d\n", ret); 25883e9d6bd4SSunila Sahu break; 25893e9d6bd4SSunila Sahu 25903e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_OP_DECRYPT: 2591501ed9c6SArek Kusztal ret = RSA_private_decrypt(op->rsa.cipher.length, 2592501ed9c6SArek Kusztal op->rsa.cipher.data, 25933e9d6bd4SSunila Sahu op->rsa.message.data, 25943e9d6bd4SSunila Sahu rsa, 25953e9d6bd4SSunila Sahu pad); 25963e9d6bd4SSunila Sahu if (ret > 0) 25973e9d6bd4SSunila Sahu op->rsa.message.length = ret; 25983e9d6bd4SSunila Sahu break; 25993e9d6bd4SSunila Sahu 26003e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_OP_SIGN: 26013e9d6bd4SSunila Sahu ret = RSA_private_encrypt(op->rsa.message.length, 26023e9d6bd4SSunila Sahu op->rsa.message.data, 26033e9d6bd4SSunila Sahu op->rsa.sign.data, 26043e9d6bd4SSunila Sahu rsa, 26053e9d6bd4SSunila Sahu pad); 26063e9d6bd4SSunila Sahu if (ret > 0) 26073e9d6bd4SSunila Sahu op->rsa.sign.length = ret; 26083e9d6bd4SSunila Sahu break; 26093e9d6bd4SSunila Sahu 26103e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_OP_VERIFY: 2611fe1606e0SAkash Saxena tmp = rte_malloc(NULL, op->rsa.sign.length, 0); 2612fe1606e0SAkash Saxena if (tmp == NULL) { 2613fe1606e0SAkash Saxena OPENSSL_LOG(ERR, "Memory allocation failed"); 2614fe1606e0SAkash Saxena cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 2615fe1606e0SAkash Saxena break; 2616fe1606e0SAkash Saxena } 26173e9d6bd4SSunila Sahu ret = RSA_public_decrypt(op->rsa.sign.length, 26183e9d6bd4SSunila Sahu op->rsa.sign.data, 2619fe1606e0SAkash Saxena tmp, 26203e9d6bd4SSunila Sahu rsa, 26213e9d6bd4SSunila Sahu pad); 26223e9d6bd4SSunila Sahu 26233e9d6bd4SSunila Sahu OPENSSL_LOG(DEBUG, 26243e9d6bd4SSunila Sahu "Length of public_decrypt %d " 26253e9d6bd4SSunila Sahu "length of message %zd\n", 26263e9d6bd4SSunila Sahu ret, op->rsa.message.length); 2627a3f9fedeSArek Kusztal if ((ret <= 0) || (CRYPTO_memcmp(tmp, op->rsa.message.data, 2628fe1606e0SAkash Saxena op->rsa.message.length))) { 2629fe1606e0SAkash Saxena OPENSSL_LOG(ERR, "RSA sign Verification failed"); 2630fe1606e0SAkash Saxena cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 26313e9d6bd4SSunila Sahu } 2632fe1606e0SAkash Saxena rte_free(tmp); 26333e9d6bd4SSunila Sahu break; 26343e9d6bd4SSunila Sahu 26353e9d6bd4SSunila Sahu default: 26363e9d6bd4SSunila Sahu /* allow ops with invalid args to be pushed to 26373e9d6bd4SSunila Sahu * completion queue 26383e9d6bd4SSunila Sahu */ 26393e9d6bd4SSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; 26403e9d6bd4SSunila Sahu break; 26413e9d6bd4SSunila Sahu } 26423e9d6bd4SSunila Sahu 26433e9d6bd4SSunila Sahu if (ret < 0) 26443e9d6bd4SSunila Sahu cop->status = RTE_CRYPTO_OP_STATUS_ERROR; 26453e9d6bd4SSunila Sahu 26463e9d6bd4SSunila Sahu return 0; 26473e9d6bd4SSunila Sahu } 2648d7bd42f6SKai Ji #endif 26493e9d6bd4SSunila Sahu 26503e9d6bd4SSunila Sahu static int 26513e9d6bd4SSunila Sahu process_asym_op(struct openssl_qp *qp, struct rte_crypto_op *op, 26523e9d6bd4SSunila Sahu struct openssl_asym_session *sess) 26533e9d6bd4SSunila Sahu { 26543e9d6bd4SSunila Sahu int retval = 0; 26553e9d6bd4SSunila Sahu 26563e9d6bd4SSunila Sahu op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 26573e9d6bd4SSunila Sahu 26583e9d6bd4SSunila Sahu switch (sess->xfrm_type) { 26593e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_XFORM_RSA: 2660d7bd42f6SKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 2661d7bd42f6SKai Ji retval = process_openssl_rsa_op_evp(op, sess); 2662d7bd42f6SKai Ji # else 26633e9d6bd4SSunila Sahu retval = process_openssl_rsa_op(op, sess); 2664d7bd42f6SKai Ji #endif 26653e9d6bd4SSunila Sahu break; 26663e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_XFORM_MODEX: 26673e9d6bd4SSunila Sahu retval = process_openssl_modexp_op(op, sess); 26683e9d6bd4SSunila Sahu break; 26693e9d6bd4SSunila Sahu case RTE_CRYPTO_ASYM_XFORM_MODINV: 26703e9d6bd4SSunila Sahu retval = process_openssl_modinv_op(op, sess); 26713e9d6bd4SSunila Sahu break; 2672ac42813aSSunila Sahu case RTE_CRYPTO_ASYM_XFORM_DH: 2673c794b40cSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 2674c794b40cSKai Ji retval = process_openssl_dh_op_evp(op, sess); 2675c794b40cSKai Ji # else 2676ac42813aSSunila Sahu retval = process_openssl_dh_op(op, sess); 2677c794b40cSKai Ji #endif 2678ac42813aSSunila Sahu break; 2679ac42813aSSunila Sahu case RTE_CRYPTO_ASYM_XFORM_DSA: 26804c7ae22fSKai Ji #if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 26814c7ae22fSKai Ji if (op->asym->dsa.op_type == RTE_CRYPTO_ASYM_OP_SIGN) 26824c7ae22fSKai Ji retval = process_openssl_dsa_sign_op_evp(op, sess); 26834c7ae22fSKai Ji else if (op->asym->dsa.op_type == 26844c7ae22fSKai Ji RTE_CRYPTO_ASYM_OP_VERIFY) 26854c7ae22fSKai Ji retval = 26864c7ae22fSKai Ji process_openssl_dsa_verify_op_evp(op, sess); 26874c7ae22fSKai Ji #else 2688ac42813aSSunila Sahu if (op->asym->dsa.op_type == RTE_CRYPTO_ASYM_OP_SIGN) 2689ac42813aSSunila Sahu retval = process_openssl_dsa_sign_op(op, sess); 2690ac42813aSSunila Sahu else if (op->asym->dsa.op_type == 2691ac42813aSSunila Sahu RTE_CRYPTO_ASYM_OP_VERIFY) 2692ac42813aSSunila Sahu retval = 2693ac42813aSSunila Sahu process_openssl_dsa_verify_op(op, sess); 2694ac42813aSSunila Sahu else 2695ac42813aSSunila Sahu op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; 26964c7ae22fSKai Ji #endif 2697ac42813aSSunila Sahu break; 26983e9d6bd4SSunila Sahu default: 26993e9d6bd4SSunila Sahu op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; 27003e9d6bd4SSunila Sahu break; 27013e9d6bd4SSunila Sahu } 27023e9d6bd4SSunila Sahu if (!retval) { 27033e9d6bd4SSunila Sahu /* op processed so push to completion queue as processed */ 27043e9d6bd4SSunila Sahu retval = rte_ring_enqueue(qp->processed_ops, (void *)op); 27053e9d6bd4SSunila Sahu if (retval) 27063e9d6bd4SSunila Sahu /* return error if failed to put in completion queue */ 27073e9d6bd4SSunila Sahu retval = -1; 27083e9d6bd4SSunila Sahu } 27093e9d6bd4SSunila Sahu 27103e9d6bd4SSunila Sahu return retval; 27113e9d6bd4SSunila Sahu } 27123e9d6bd4SSunila Sahu 27131fa538faSPablo de Lara static void 27141fa538faSPablo de Lara copy_plaintext(struct rte_mbuf *m_src, struct rte_mbuf *m_dst, 27151fa538faSPablo de Lara struct rte_crypto_op *op) 27161fa538faSPablo de Lara { 27171fa538faSPablo de Lara uint8_t *p_src, *p_dst; 27181fa538faSPablo de Lara 27191fa538faSPablo de Lara p_src = rte_pktmbuf_mtod(m_src, uint8_t *); 27201fa538faSPablo de Lara p_dst = rte_pktmbuf_mtod(m_dst, uint8_t *); 27211fa538faSPablo de Lara 27221fa538faSPablo de Lara /** 27231fa538faSPablo de Lara * Copy the content between cipher offset and auth offset 27241fa538faSPablo de Lara * for generating correct digest. 27251fa538faSPablo de Lara */ 27261fa538faSPablo de Lara if (op->sym->cipher.data.offset > op->sym->auth.data.offset) 27271fa538faSPablo de Lara memcpy(p_dst + op->sym->auth.data.offset, 27281fa538faSPablo de Lara p_src + op->sym->auth.data.offset, 27291fa538faSPablo de Lara op->sym->cipher.data.offset - 27301fa538faSPablo de Lara op->sym->auth.data.offset); 27311fa538faSPablo de Lara } 27321fa538faSPablo de Lara 27338a9867a6SSlawomir Mrozowicz /** Process crypto operation for mbuf */ 27348a9867a6SSlawomir Mrozowicz static int 2735f296593fSPablo de Lara process_op(struct openssl_qp *qp, struct rte_crypto_op *op, 27368a9867a6SSlawomir Mrozowicz struct openssl_session *sess) 27378a9867a6SSlawomir Mrozowicz { 27388a9867a6SSlawomir Mrozowicz struct rte_mbuf *msrc, *mdst; 27398a9867a6SSlawomir Mrozowicz int retval; 27408a9867a6SSlawomir Mrozowicz 27418a9867a6SSlawomir Mrozowicz msrc = op->sym->m_src; 27428a9867a6SSlawomir Mrozowicz mdst = op->sym->m_dst ? op->sym->m_dst : op->sym->m_src; 27438a9867a6SSlawomir Mrozowicz 27448a9867a6SSlawomir Mrozowicz op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 27458a9867a6SSlawomir Mrozowicz 27468a9867a6SSlawomir Mrozowicz switch (sess->chain_order) { 27478a9867a6SSlawomir Mrozowicz case OPENSSL_CHAIN_ONLY_CIPHER: 27488a9867a6SSlawomir Mrozowicz process_openssl_cipher_op(op, sess, msrc, mdst); 27498a9867a6SSlawomir Mrozowicz break; 27508a9867a6SSlawomir Mrozowicz case OPENSSL_CHAIN_ONLY_AUTH: 2751f296593fSPablo de Lara process_openssl_auth_op(qp, op, sess, msrc, mdst); 27528a9867a6SSlawomir Mrozowicz break; 27538a9867a6SSlawomir Mrozowicz case OPENSSL_CHAIN_CIPHER_AUTH: 27548a9867a6SSlawomir Mrozowicz process_openssl_cipher_op(op, sess, msrc, mdst); 27551fa538faSPablo de Lara /* OOP */ 27561fa538faSPablo de Lara if (msrc != mdst) 27571fa538faSPablo de Lara copy_plaintext(msrc, mdst, op); 2758f296593fSPablo de Lara process_openssl_auth_op(qp, op, sess, mdst, mdst); 27598a9867a6SSlawomir Mrozowicz break; 27608a9867a6SSlawomir Mrozowicz case OPENSSL_CHAIN_AUTH_CIPHER: 2761f296593fSPablo de Lara process_openssl_auth_op(qp, op, sess, msrc, mdst); 27628a9867a6SSlawomir Mrozowicz process_openssl_cipher_op(op, sess, msrc, mdst); 27638a9867a6SSlawomir Mrozowicz break; 27648a9867a6SSlawomir Mrozowicz case OPENSSL_CHAIN_COMBINED: 27658a9867a6SSlawomir Mrozowicz process_openssl_combined_op(op, sess, msrc, mdst); 27668a9867a6SSlawomir Mrozowicz break; 27671dee7bc7SPablo de Lara case OPENSSL_CHAIN_CIPHER_BPI: 27681dee7bc7SPablo de Lara process_openssl_docsis_bpi_op(op, sess, msrc, mdst); 27691dee7bc7SPablo de Lara break; 27708a9867a6SSlawomir Mrozowicz default: 27718a9867a6SSlawomir Mrozowicz op->status = RTE_CRYPTO_OP_STATUS_ERROR; 27728a9867a6SSlawomir Mrozowicz break; 27738a9867a6SSlawomir Mrozowicz } 27748a9867a6SSlawomir Mrozowicz 27758a9867a6SSlawomir Mrozowicz /* Free session if a session-less crypto op */ 27765209df0dSPablo de Lara if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) { 27778a9867a6SSlawomir Mrozowicz openssl_reset_session(sess); 27788a9867a6SSlawomir Mrozowicz memset(sess, 0, sizeof(struct openssl_session)); 2779b3bbd9e5SSlawomir Mrozowicz memset(op->sym->session, 0, 27800b60386aSFan Zhang rte_cryptodev_sym_get_existing_header_session_size( 27810b60386aSFan Zhang op->sym->session)); 2782725d2a7fSFan Zhang rte_mempool_put(qp->sess_mp_priv, sess); 27838a9867a6SSlawomir Mrozowicz rte_mempool_put(qp->sess_mp, op->sym->session); 27848a9867a6SSlawomir Mrozowicz op->sym->session = NULL; 27858a9867a6SSlawomir Mrozowicz } 27868a9867a6SSlawomir Mrozowicz 27878a9867a6SSlawomir Mrozowicz if (op->status == RTE_CRYPTO_OP_STATUS_NOT_PROCESSED) 27888a9867a6SSlawomir Mrozowicz op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 27898a9867a6SSlawomir Mrozowicz 27908a9867a6SSlawomir Mrozowicz if (op->status != RTE_CRYPTO_OP_STATUS_ERROR) 27918a9867a6SSlawomir Mrozowicz retval = rte_ring_enqueue(qp->processed_ops, (void *)op); 27928a9867a6SSlawomir Mrozowicz else 27938a9867a6SSlawomir Mrozowicz retval = -1; 27948a9867a6SSlawomir Mrozowicz 27958a9867a6SSlawomir Mrozowicz return retval; 27968a9867a6SSlawomir Mrozowicz } 27978a9867a6SSlawomir Mrozowicz 27988a9867a6SSlawomir Mrozowicz /* 27998a9867a6SSlawomir Mrozowicz *------------------------------------------------------------------------------ 28008a9867a6SSlawomir Mrozowicz * PMD Framework 28018a9867a6SSlawomir Mrozowicz *------------------------------------------------------------------------------ 28028a9867a6SSlawomir Mrozowicz */ 28038a9867a6SSlawomir Mrozowicz 28048a9867a6SSlawomir Mrozowicz /** Enqueue burst */ 28058a9867a6SSlawomir Mrozowicz static uint16_t 28068a9867a6SSlawomir Mrozowicz openssl_pmd_enqueue_burst(void *queue_pair, struct rte_crypto_op **ops, 28078a9867a6SSlawomir Mrozowicz uint16_t nb_ops) 28088a9867a6SSlawomir Mrozowicz { 28093e9d6bd4SSunila Sahu void *sess; 28108a9867a6SSlawomir Mrozowicz struct openssl_qp *qp = queue_pair; 28118a9867a6SSlawomir Mrozowicz int i, retval; 28128a9867a6SSlawomir Mrozowicz 28138a9867a6SSlawomir Mrozowicz for (i = 0; i < nb_ops; i++) { 28148a9867a6SSlawomir Mrozowicz sess = get_session(qp, ops[i]); 28158a9867a6SSlawomir Mrozowicz if (unlikely(sess == NULL)) 28168a9867a6SSlawomir Mrozowicz goto enqueue_err; 28178a9867a6SSlawomir Mrozowicz 28183e9d6bd4SSunila Sahu if (ops[i]->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) 28193e9d6bd4SSunila Sahu retval = process_op(qp, ops[i], 28203e9d6bd4SSunila Sahu (struct openssl_session *) sess); 28213e9d6bd4SSunila Sahu else 28223e9d6bd4SSunila Sahu retval = process_asym_op(qp, ops[i], 28233e9d6bd4SSunila Sahu (struct openssl_asym_session *) sess); 28248a9867a6SSlawomir Mrozowicz if (unlikely(retval < 0)) 28258a9867a6SSlawomir Mrozowicz goto enqueue_err; 28268a9867a6SSlawomir Mrozowicz } 28278a9867a6SSlawomir Mrozowicz 28288a9867a6SSlawomir Mrozowicz qp->stats.enqueued_count += i; 28298a9867a6SSlawomir Mrozowicz return i; 28308a9867a6SSlawomir Mrozowicz 28318a9867a6SSlawomir Mrozowicz enqueue_err: 28328a9867a6SSlawomir Mrozowicz qp->stats.enqueue_err_count++; 28338a9867a6SSlawomir Mrozowicz return i; 28348a9867a6SSlawomir Mrozowicz } 28358a9867a6SSlawomir Mrozowicz 28368a9867a6SSlawomir Mrozowicz /** Dequeue burst */ 28378a9867a6SSlawomir Mrozowicz static uint16_t 28388a9867a6SSlawomir Mrozowicz openssl_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops, 28398a9867a6SSlawomir Mrozowicz uint16_t nb_ops) 28408a9867a6SSlawomir Mrozowicz { 28418a9867a6SSlawomir Mrozowicz struct openssl_qp *qp = queue_pair; 28428a9867a6SSlawomir Mrozowicz 28438a9867a6SSlawomir Mrozowicz unsigned int nb_dequeued = 0; 28448a9867a6SSlawomir Mrozowicz 28458a9867a6SSlawomir Mrozowicz nb_dequeued = rte_ring_dequeue_burst(qp->processed_ops, 2846ecaed092SBruce Richardson (void **)ops, nb_ops, NULL); 28478a9867a6SSlawomir Mrozowicz qp->stats.dequeued_count += nb_dequeued; 28488a9867a6SSlawomir Mrozowicz 28498a9867a6SSlawomir Mrozowicz return nb_dequeued; 28508a9867a6SSlawomir Mrozowicz } 28518a9867a6SSlawomir Mrozowicz 28528a9867a6SSlawomir Mrozowicz /** Create OPENSSL crypto device */ 28538a9867a6SSlawomir Mrozowicz static int 2854168b9e76SPablo de Lara cryptodev_openssl_create(const char *name, 2855168b9e76SPablo de Lara struct rte_vdev_device *vdev, 2856f2f020d2SDeclan Doherty struct rte_cryptodev_pmd_init_params *init_params) 28578a9867a6SSlawomir Mrozowicz { 28588a9867a6SSlawomir Mrozowicz struct rte_cryptodev *dev; 28598a9867a6SSlawomir Mrozowicz struct openssl_private *internals; 28608a9867a6SSlawomir Mrozowicz 2861f2f020d2SDeclan Doherty dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params); 28628a9867a6SSlawomir Mrozowicz if (dev == NULL) { 2863094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "failed to create cryptodev vdev"); 28648a9867a6SSlawomir Mrozowicz goto init_error; 28658a9867a6SSlawomir Mrozowicz } 28668a9867a6SSlawomir Mrozowicz 28677a364faeSSlawomir Mrozowicz dev->driver_id = cryptodev_driver_id; 28688a9867a6SSlawomir Mrozowicz dev->dev_ops = rte_openssl_pmd_ops; 28698a9867a6SSlawomir Mrozowicz 28708a9867a6SSlawomir Mrozowicz /* register rx/tx burst functions for data path */ 28718a9867a6SSlawomir Mrozowicz dev->dequeue_burst = openssl_pmd_dequeue_burst; 28728a9867a6SSlawomir Mrozowicz dev->enqueue_burst = openssl_pmd_enqueue_burst; 28738a9867a6SSlawomir Mrozowicz 28748a9867a6SSlawomir Mrozowicz dev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO | 28758a9867a6SSlawomir Mrozowicz RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING | 28768f675fc7STomasz Kulasek RTE_CRYPTODEV_FF_CPU_AESNI | 2877b795e127SAkhil Goyal RTE_CRYPTODEV_FF_IN_PLACE_SGL | 28782717246eSPablo de Lara RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT | 28793e9d6bd4SSunila Sahu RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT | 2880378e08ebSAyuj Verma RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO | 2881378e08ebSAyuj Verma RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP | 2882b3aaf24dSPablo de Lara RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT | 2883b3aaf24dSPablo de Lara RTE_CRYPTODEV_FF_SYM_SESSIONLESS; 28848a9867a6SSlawomir Mrozowicz 28858a9867a6SSlawomir Mrozowicz internals = dev->data->dev_private; 28868a9867a6SSlawomir Mrozowicz 28878a9867a6SSlawomir Mrozowicz internals->max_nb_qpairs = init_params->max_nb_queue_pairs; 28888a9867a6SSlawomir Mrozowicz 2889d54c72ecSAkhil Goyal rte_cryptodev_pmd_probing_finish(dev); 2890d54c72ecSAkhil Goyal 289175adf1eaSKai Ji # if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 289275adf1eaSKai Ji /* Load legacy provider 289375adf1eaSKai Ji * Some algorithms are no longer available in earlier version of openssl, 289475adf1eaSKai Ji * unless the legacy provider explicitly loaded. e.g. DES 289575adf1eaSKai Ji */ 289675adf1eaSKai Ji ossl_legacy_provider_load(); 289775adf1eaSKai Ji # endif 28988a9867a6SSlawomir Mrozowicz return 0; 28998a9867a6SSlawomir Mrozowicz 29008a9867a6SSlawomir Mrozowicz init_error: 2901094b2386SNaga Suresh Somarowthu OPENSSL_LOG(ERR, "driver %s: create failed", 2902d803b443SFan Zhang init_params->name); 29038a9867a6SSlawomir Mrozowicz 29045d2aa461SJan Blunck cryptodev_openssl_remove(vdev); 29058a9867a6SSlawomir Mrozowicz return -EFAULT; 29068a9867a6SSlawomir Mrozowicz } 29078a9867a6SSlawomir Mrozowicz 29088a9867a6SSlawomir Mrozowicz /** Initialise OPENSSL crypto device */ 29098a9867a6SSlawomir Mrozowicz static int 29105d2aa461SJan Blunck cryptodev_openssl_probe(struct rte_vdev_device *vdev) 29118a9867a6SSlawomir Mrozowicz { 2912f2f020d2SDeclan Doherty struct rte_cryptodev_pmd_init_params init_params = { 2913f2f020d2SDeclan Doherty "", 2914f2f020d2SDeclan Doherty sizeof(struct openssl_private), 2915d803b443SFan Zhang rte_socket_id(), 2916e1fc5b76SPablo de Lara RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS 29178a9867a6SSlawomir Mrozowicz }; 29185d2aa461SJan Blunck const char *name; 29195d2aa461SJan Blunck const char *input_args; 29205d2aa461SJan Blunck 29215d2aa461SJan Blunck name = rte_vdev_device_name(vdev); 29227e214771SPablo de Lara if (name == NULL) 29237e214771SPablo de Lara return -EINVAL; 29245d2aa461SJan Blunck input_args = rte_vdev_device_args(vdev); 29258a9867a6SSlawomir Mrozowicz 2926f2f020d2SDeclan Doherty rte_cryptodev_pmd_parse_input_args(&init_params, input_args); 29278a9867a6SSlawomir Mrozowicz 2928168b9e76SPablo de Lara return cryptodev_openssl_create(name, vdev, &init_params); 29298a9867a6SSlawomir Mrozowicz } 29308a9867a6SSlawomir Mrozowicz 29318a9867a6SSlawomir Mrozowicz /** Uninitialise OPENSSL crypto device */ 29328a9867a6SSlawomir Mrozowicz static int 29335d2aa461SJan Blunck cryptodev_openssl_remove(struct rte_vdev_device *vdev) 29348a9867a6SSlawomir Mrozowicz { 2935f2f020d2SDeclan Doherty struct rte_cryptodev *cryptodev; 29365d2aa461SJan Blunck const char *name; 29375d2aa461SJan Blunck 29385d2aa461SJan Blunck name = rte_vdev_device_name(vdev); 29398a9867a6SSlawomir Mrozowicz if (name == NULL) 29408a9867a6SSlawomir Mrozowicz return -EINVAL; 29418a9867a6SSlawomir Mrozowicz 2942f2f020d2SDeclan Doherty cryptodev = rte_cryptodev_pmd_get_named_dev(name); 2943f2f020d2SDeclan Doherty if (cryptodev == NULL) 2944f2f020d2SDeclan Doherty return -ENODEV; 29458a9867a6SSlawomir Mrozowicz 294675adf1eaSKai Ji # if (OPENSSL_VERSION_NUMBER >= 0x30000000L) 294775adf1eaSKai Ji ossl_legacy_provider_unload(); 294875adf1eaSKai Ji # endif 2949f2f020d2SDeclan Doherty return rte_cryptodev_pmd_destroy(cryptodev); 29508a9867a6SSlawomir Mrozowicz } 29518a9867a6SSlawomir Mrozowicz 29528a9867a6SSlawomir Mrozowicz static struct rte_vdev_driver cryptodev_openssl_pmd_drv = { 29538a9867a6SSlawomir Mrozowicz .probe = cryptodev_openssl_probe, 29548a9867a6SSlawomir Mrozowicz .remove = cryptodev_openssl_remove 29558a9867a6SSlawomir Mrozowicz }; 29568a9867a6SSlawomir Mrozowicz 2957effd3b9fSPablo de Lara static struct cryptodev_driver openssl_crypto_drv; 2958effd3b9fSPablo de Lara 29598a9867a6SSlawomir Mrozowicz RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_OPENSSL_PMD, 29608a9867a6SSlawomir Mrozowicz cryptodev_openssl_pmd_drv); 29618a9867a6SSlawomir Mrozowicz RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_OPENSSL_PMD, 29628a9867a6SSlawomir Mrozowicz "max_nb_queue_pairs=<int> " 29638a9867a6SSlawomir Mrozowicz "socket_id=<int>"); 2964f737f5ceSFiona Trahe RTE_PMD_REGISTER_CRYPTO_DRIVER(openssl_crypto_drv, 2965f737f5ceSFiona Trahe cryptodev_openssl_pmd_drv.driver, cryptodev_driver_id); 2966eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(openssl_logtype_driver, INFO); 2967