141287a7fSFiona Trahe /* SPDX-License-Identifier: BSD-3-Clause 2e0a67610SKai Ji * Copyright(c) 2015-2022 Intel Corporation 341287a7fSFiona Trahe */ 441287a7fSFiona Trahe 5bba31cffSFiona Trahe #ifndef _QAT_SYM_H_ 6bba31cffSFiona Trahe #define _QAT_SYM_H_ 741287a7fSFiona Trahe 8af668035SAkhil Goyal #include <cryptodev_pmd.h> 96f0ef237SDavid Coyle #include <rte_net_crc.h> 1098c4a35cSTomasz Jozwiak 1198c4a35cSTomasz Jozwiak #ifdef BUILD_QAT_SYM 1262126a92SCiara Power #ifdef RTE_QAT_OPENSSL 1391614c73SFiona Trahe #include <openssl/evp.h> 1462126a92SCiara Power #endif 153f3fc330SAkhil Goyal #include <rte_security_driver.h> 1641287a7fSFiona Trahe 1741287a7fSFiona Trahe #include "qat_common.h" 1891614c73SFiona Trahe #include "qat_sym_session.h" 19e0a67610SKai Ji #include "qat_crypto.h" 20ab8a58feSTomasz Jozwiak #include "qat_logs.h" 2191614c73SFiona Trahe 2291614c73SFiona Trahe #define BYTE_LENGTH 8 2391614c73SFiona Trahe /* bpi is only used for partial blocks of DES and AES 2491614c73SFiona Trahe * so AES block len can be assumed as max len for iv, src and dst 2591614c73SFiona Trahe */ 2691614c73SFiona Trahe #define BPI_MAX_ENCR_IV_LEN ICP_QAT_HW_AES_BLK_SZ 2741287a7fSFiona Trahe 28e0a67610SKai Ji /** Intel(R) QAT Symmetric Crypto PMD name */ 29e0a67610SKai Ji #define CRYPTODEV_NAME_QAT_SYM_PMD crypto_qat 30e0a67610SKai Ji 31e0a67610SKai Ji /* Internal capabilities */ 32e0a67610SKai Ji #define QAT_SYM_CAP_MIXED_CRYPTO (1 << 0) 33ce7a737cSKevin O'Sullivan #define QAT_SYM_CAP_CIPHER_CRC (1 << 1) 34e0a67610SKai Ji #define QAT_SYM_CAP_VALID (1 << 31) 35e0a67610SKai Ji 36e0a67610SKai Ji /** 37e0a67610SKai Ji * Macro to add a sym capability 38e0a67610SKai Ji * helper function to add an sym capability 39e0a67610SKai Ji * <n: name> <b: block size> <k: key size> <d: digest size> 40e0a67610SKai Ji * <a: aad_size> <i: iv_size> 41e0a67610SKai Ji **/ 42e0a67610SKai Ji #define QAT_SYM_PLAIN_AUTH_CAP(n, b, d) \ 43e0a67610SKai Ji { \ 44e0a67610SKai Ji .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, \ 45e0a67610SKai Ji {.sym = { \ 46e0a67610SKai Ji .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, \ 47e0a67610SKai Ji {.auth = { \ 48e0a67610SKai Ji .algo = RTE_CRYPTO_AUTH_##n, \ 49e0a67610SKai Ji b, d \ 50e0a67610SKai Ji }, } \ 51e0a67610SKai Ji }, } \ 52e0a67610SKai Ji } 53e0a67610SKai Ji 54e0a67610SKai Ji #define QAT_SYM_AUTH_CAP(n, b, k, d, a, i) \ 55e0a67610SKai Ji { \ 56e0a67610SKai Ji .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, \ 57e0a67610SKai Ji {.sym = { \ 58e0a67610SKai Ji .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, \ 59e0a67610SKai Ji {.auth = { \ 60e0a67610SKai Ji .algo = RTE_CRYPTO_AUTH_##n, \ 61e0a67610SKai Ji b, k, d, a, i \ 62e0a67610SKai Ji }, } \ 63e0a67610SKai Ji }, } \ 64e0a67610SKai Ji } 65e0a67610SKai Ji 66e0a67610SKai Ji #define QAT_SYM_AEAD_CAP(n, b, k, d, a, i) \ 67e0a67610SKai Ji { \ 68e0a67610SKai Ji .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, \ 69e0a67610SKai Ji {.sym = { \ 70e0a67610SKai Ji .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD, \ 71e0a67610SKai Ji {.aead = { \ 72e0a67610SKai Ji .algo = RTE_CRYPTO_AEAD_##n, \ 73e0a67610SKai Ji b, k, d, a, i \ 74e0a67610SKai Ji }, } \ 75e0a67610SKai Ji }, } \ 76e0a67610SKai Ji } 77e0a67610SKai Ji 78e0a67610SKai Ji #define QAT_SYM_CIPHER_CAP(n, b, k, i) \ 79e0a67610SKai Ji { \ 80e0a67610SKai Ji .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, \ 81e0a67610SKai Ji {.sym = { \ 82e0a67610SKai Ji .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, \ 83e0a67610SKai Ji {.cipher = { \ 84e0a67610SKai Ji .algo = RTE_CRYPTO_CIPHER_##n, \ 85e0a67610SKai Ji b, k, i \ 86e0a67610SKai Ji }, } \ 87e0a67610SKai Ji }, } \ 88e0a67610SKai Ji } 89e0a67610SKai Ji 90944027acSFiona Trahe /* 91944027acSFiona Trahe * Maximum number of SGL entries 92944027acSFiona Trahe */ 93944027acSFiona Trahe #define QAT_SYM_SGL_MAX_NUMBER 16 94944027acSFiona Trahe 9545fe9ea9SAdam Dybkowski /* Maximum data length for single pass GMAC: 2^14-1 */ 9645fe9ea9SAdam Dybkowski #define QAT_AES_GMAC_SPC_MAX_SIZE 16383 9745fe9ea9SAdam Dybkowski 98e9271821SNishikant Nayak /* Digest length for GCM Algo is 16 bytes */ 99e9271821SNishikant Nayak #define GCM_256_DIGEST_LEN 16 100e9271821SNishikant Nayak 101e9271821SNishikant Nayak /* IV length for GCM algo is 12 bytes */ 102e9271821SNishikant Nayak #define GCM_IV_LENGTH_GEN_LCE 12 103e9271821SNishikant Nayak 1046132b718SFiona Trahe struct qat_sym_session; 10541287a7fSFiona Trahe 106*e7750639SAndre Muezerie struct __rte_cache_aligned __rte_packed_begin qat_sym_sgl { 107944027acSFiona Trahe qat_sgl_hdr; 108944027acSFiona Trahe struct qat_flat_buf buffers[QAT_SYM_SGL_MAX_NUMBER]; 109*e7750639SAndre Muezerie } __rte_packed_end; 110944027acSFiona Trahe 111571ffe23SFiona Trahe struct qat_sym_op_cookie { 112944027acSFiona Trahe struct qat_sym_sgl qat_sgl_src; 113944027acSFiona Trahe struct qat_sym_sgl qat_sgl_dst; 114571ffe23SFiona Trahe phys_addr_t qat_sgl_src_phys_addr; 115571ffe23SFiona Trahe phys_addr_t qat_sgl_dst_phys_addr; 11645fe9ea9SAdam Dybkowski union { 11745fe9ea9SAdam Dybkowski /* Used for Single-Pass AES-GMAC only */ 11845fe9ea9SAdam Dybkowski struct { 119*e7750639SAndre Muezerie alignas(RTE_CACHE_LINE_SIZE) struct __rte_packed_begin 120*e7750639SAndre Muezerie icp_qat_hw_cipher_algo_blk cd_cipher __rte_packed_end; 12145fe9ea9SAdam Dybkowski phys_addr_t cd_phys_addr; 12245fe9ea9SAdam Dybkowski } spc_gmac; 12345fe9ea9SAdam Dybkowski } opt; 1248b4618a7SCiara Power uint8_t digest_null[4]; 1258b4618a7SCiara Power phys_addr_t digest_null_phys_addr; 1260fda888bSSivaramakrishnan Venkat enum rte_crypto_op_status status; 127571ffe23SFiona Trahe }; 128571ffe23SFiona Trahe 129e0a67610SKai Ji struct qat_sym_dp_ctx { 130e0a67610SKai Ji struct qat_sym_session *session; 131e0a67610SKai Ji uint32_t tail; 132e0a67610SKai Ji uint32_t head; 133e0a67610SKai Ji uint16_t cached_enqueue; 134e0a67610SKai Ji uint16_t cached_dequeue; 135e0a67610SKai Ji }; 136e0a67610SKai Ji 137e0a67610SKai Ji uint16_t 138e0a67610SKai Ji qat_sym_enqueue_burst(void *qp, struct rte_crypto_op **ops, 139e0a67610SKai Ji uint16_t nb_ops); 140e0a67610SKai Ji 141e0a67610SKai Ji uint16_t 142e0a67610SKai Ji qat_sym_dequeue_burst(void *qp, struct rte_crypto_op **ops, 143e0a67610SKai Ji uint16_t nb_ops); 144e0a67610SKai Ji 145e2c11053SNishikant Nayak uint16_t 146e2c11053SNishikant Nayak qat_sym_dequeue_burst_gen_lce(void *qp, struct rte_crypto_op **ops, uint16_t nb_ops); 147e2c11053SNishikant Nayak 14862126a92SCiara Power #ifdef RTE_QAT_OPENSSL 14991614c73SFiona Trahe /** Encrypt a single partial block 15091614c73SFiona Trahe * Depends on openssl libcrypto 15191614c73SFiona Trahe * Uses ECB+XOR to do CFB encryption, same result, more performant 15291614c73SFiona Trahe */ 15391614c73SFiona Trahe static inline int 15491614c73SFiona Trahe bpi_cipher_encrypt(uint8_t *src, uint8_t *dst, 15591614c73SFiona Trahe uint8_t *iv, int ivlen, int srclen, 15691614c73SFiona Trahe void *bpi_ctx) 15791614c73SFiona Trahe { 15891614c73SFiona Trahe EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)bpi_ctx; 15991614c73SFiona Trahe int encrypted_ivlen; 16091614c73SFiona Trahe uint8_t encrypted_iv[BPI_MAX_ENCR_IV_LEN]; 16191614c73SFiona Trahe uint8_t *encr = encrypted_iv; 16291614c73SFiona Trahe 16391614c73SFiona Trahe /* ECB method: encrypt the IV, then XOR this with plaintext */ 16491614c73SFiona Trahe if (EVP_EncryptUpdate(ctx, encrypted_iv, &encrypted_ivlen, iv, ivlen) 16591614c73SFiona Trahe <= 0) 16691614c73SFiona Trahe goto cipher_encrypt_err; 16791614c73SFiona Trahe 16891614c73SFiona Trahe for (; srclen != 0; --srclen, ++dst, ++src, ++encr) 16991614c73SFiona Trahe *dst = *src ^ *encr; 17091614c73SFiona Trahe 17191614c73SFiona Trahe return 0; 17291614c73SFiona Trahe 17391614c73SFiona Trahe cipher_encrypt_err: 174ab8a58feSTomasz Jozwiak QAT_DP_LOG(ERR, "libcrypto ECB cipher encrypt failed"); 17591614c73SFiona Trahe return -EINVAL; 17691614c73SFiona Trahe } 17762126a92SCiara Power #else 178ca0ba0e4SBrian Dooley static __rte_always_inline void 179ca0ba0e4SBrian Dooley bpi_cipher_ipsec(uint8_t *src, uint8_t *dst, uint8_t *iv, int srclen, 180ca0ba0e4SBrian Dooley uint64_t *expkey, IMB_MGR *m, uint8_t docsis_key_len) 181ca0ba0e4SBrian Dooley { 182ca0ba0e4SBrian Dooley if (docsis_key_len == ICP_QAT_HW_AES_128_KEY_SZ) 183ca0ba0e4SBrian Dooley IMB_AES128_CFB_ONE(m, dst, src, (uint64_t *)iv, expkey, srclen); 184ca0ba0e4SBrian Dooley else if (docsis_key_len == ICP_QAT_HW_AES_256_KEY_SZ) 185ca0ba0e4SBrian Dooley IMB_AES256_CFB_ONE(m, dst, src, (uint64_t *)iv, expkey, srclen); 186ca0ba0e4SBrian Dooley else if (docsis_key_len == ICP_QAT_HW_DES_KEY_SZ) 187ca0ba0e4SBrian Dooley des_cfb_one(dst, src, (uint64_t *)iv, expkey, srclen); 188ca0ba0e4SBrian Dooley } 189ca0ba0e4SBrian Dooley #endif 190ca0ba0e4SBrian Dooley 19191614c73SFiona Trahe static inline uint32_t 19291614c73SFiona Trahe qat_bpicipher_postprocess(struct qat_sym_session *ctx, 19391614c73SFiona Trahe struct rte_crypto_op *op) 19491614c73SFiona Trahe { 19591614c73SFiona Trahe int block_len = qat_cipher_get_block_size(ctx->qat_cipher_alg); 19691614c73SFiona Trahe struct rte_crypto_sym_op *sym_op = op->sym; 19791614c73SFiona Trahe uint8_t last_block_len = block_len > 0 ? 19891614c73SFiona Trahe sym_op->cipher.data.length % block_len : 0; 19991614c73SFiona Trahe 20091614c73SFiona Trahe if (last_block_len > 0 && 20191614c73SFiona Trahe ctx->qat_dir == ICP_QAT_HW_CIPHER_ENCRYPT) { 20291614c73SFiona Trahe 20391614c73SFiona Trahe /* Encrypt last block */ 20491614c73SFiona Trahe uint8_t *last_block, *dst, *iv; 20591614c73SFiona Trahe uint32_t last_block_offset; 20691614c73SFiona Trahe 20791614c73SFiona Trahe last_block_offset = sym_op->cipher.data.offset + 20891614c73SFiona Trahe sym_op->cipher.data.length - last_block_len; 209e931ffa7SStephen Hemminger last_block = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *, 210e931ffa7SStephen Hemminger last_block_offset); 21191614c73SFiona Trahe 21291614c73SFiona Trahe if (unlikely(sym_op->m_dst != NULL)) 21391614c73SFiona Trahe /* out-of-place operation (OOP) */ 214e931ffa7SStephen Hemminger dst = rte_pktmbuf_mtod_offset(sym_op->m_dst, 215e931ffa7SStephen Hemminger uint8_t *, 216e931ffa7SStephen Hemminger last_block_offset); 21791614c73SFiona Trahe else 21891614c73SFiona Trahe dst = last_block; 21991614c73SFiona Trahe 22091614c73SFiona Trahe if (last_block_len < sym_op->cipher.data.length) 22191614c73SFiona Trahe /* use previous block ciphertext as IV */ 22291614c73SFiona Trahe iv = dst - block_len; 22391614c73SFiona Trahe else 22491614c73SFiona Trahe /* runt block, i.e. less than one full block */ 22591614c73SFiona Trahe iv = rte_crypto_op_ctod_offset(op, uint8_t *, 22691614c73SFiona Trahe ctx->cipher_iv.offset); 22791614c73SFiona Trahe 228ab8a58feSTomasz Jozwiak #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG 229ab8a58feSTomasz Jozwiak QAT_DP_HEXDUMP_LOG(DEBUG, "BPI: src before post-process:", 230ab8a58feSTomasz Jozwiak last_block, last_block_len); 23191614c73SFiona Trahe if (sym_op->m_dst != NULL) 232ab8a58feSTomasz Jozwiak QAT_DP_HEXDUMP_LOG(DEBUG, 233ab8a58feSTomasz Jozwiak "BPI: dst before post-process:", 23491614c73SFiona Trahe dst, last_block_len); 23591614c73SFiona Trahe #endif 236ca0ba0e4SBrian Dooley #ifdef RTE_QAT_OPENSSL 23791614c73SFiona Trahe bpi_cipher_encrypt(last_block, dst, iv, block_len, 23891614c73SFiona Trahe last_block_len, ctx->bpi_ctx); 239ca0ba0e4SBrian Dooley #else 240ca0ba0e4SBrian Dooley bpi_cipher_ipsec(last_block, dst, iv, last_block_len, ctx->expkey, 241ca0ba0e4SBrian Dooley ctx->mb_mgr, ctx->docsis_key_len); 242ca0ba0e4SBrian Dooley #endif 243ab8a58feSTomasz Jozwiak #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG 244ab8a58feSTomasz Jozwiak QAT_DP_HEXDUMP_LOG(DEBUG, "BPI: src after post-process:", 245ab8a58feSTomasz Jozwiak last_block, last_block_len); 24691614c73SFiona Trahe if (sym_op->m_dst != NULL) 247ab8a58feSTomasz Jozwiak QAT_DP_HEXDUMP_LOG(DEBUG, 248ab8a58feSTomasz Jozwiak "BPI: dst after post-process:", 249ab8a58feSTomasz Jozwiak dst, last_block_len); 25091614c73SFiona Trahe #endif 25191614c73SFiona Trahe } 25291614c73SFiona Trahe return sym_op->cipher.data.length - last_block_len; 25391614c73SFiona Trahe } 25491614c73SFiona Trahe 2556f0ef237SDavid Coyle static inline void 2566f0ef237SDavid Coyle qat_crc_verify(struct qat_sym_session *ctx, struct rte_crypto_op *op) 2576f0ef237SDavid Coyle { 2586f0ef237SDavid Coyle struct rte_crypto_sym_op *sym_op = op->sym; 259979b07d8SDavid Coyle uint32_t crc_data_ofs, crc_data_len, crc; 2606f0ef237SDavid Coyle uint8_t *crc_data; 2616f0ef237SDavid Coyle 2626f0ef237SDavid Coyle if (ctx->qat_dir == ICP_QAT_HW_CIPHER_DECRYPT && 2636f0ef237SDavid Coyle sym_op->auth.data.length != 0) { 2646f0ef237SDavid Coyle 265979b07d8SDavid Coyle crc_data_ofs = sym_op->auth.data.offset; 266979b07d8SDavid Coyle crc_data_len = sym_op->auth.data.length; 2676f0ef237SDavid Coyle crc_data = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *, 268979b07d8SDavid Coyle crc_data_ofs); 2696f0ef237SDavid Coyle 270979b07d8SDavid Coyle crc = rte_net_crc_calc(crc_data, crc_data_len, 271979b07d8SDavid Coyle RTE_NET_CRC32_ETH); 2726f0ef237SDavid Coyle 273979b07d8SDavid Coyle if (crc != *(uint32_t *)(crc_data + crc_data_len)) 2746f0ef237SDavid Coyle op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 2756f0ef237SDavid Coyle } 2766f0ef237SDavid Coyle } 277012affe1SDavid Coyle 278012affe1SDavid Coyle static inline void 279012affe1SDavid Coyle qat_crc_generate(struct qat_sym_session *ctx, 280012affe1SDavid Coyle struct rte_crypto_op *op) 281012affe1SDavid Coyle { 282012affe1SDavid Coyle struct rte_crypto_sym_op *sym_op = op->sym; 283012affe1SDavid Coyle uint32_t *crc, crc_data_len; 284012affe1SDavid Coyle uint8_t *crc_data; 285012affe1SDavid Coyle 286012affe1SDavid Coyle if (ctx->qat_dir == ICP_QAT_HW_CIPHER_ENCRYPT && 287012affe1SDavid Coyle sym_op->auth.data.length != 0 && 288012affe1SDavid Coyle sym_op->m_src->nb_segs == 1) { 289012affe1SDavid Coyle 290012affe1SDavid Coyle crc_data_len = sym_op->auth.data.length; 291012affe1SDavid Coyle crc_data = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *, 292012affe1SDavid Coyle sym_op->auth.data.offset); 293012affe1SDavid Coyle crc = (uint32_t *)(crc_data + crc_data_len); 294012affe1SDavid Coyle *crc = rte_net_crc_calc(crc_data, crc_data_len, 295012affe1SDavid Coyle RTE_NET_CRC32_ETH); 296012affe1SDavid Coyle } 297012affe1SDavid Coyle } 298012affe1SDavid Coyle 299012affe1SDavid Coyle static inline void 300012affe1SDavid Coyle qat_sym_preprocess_requests(void **ops, uint16_t nb_ops) 301012affe1SDavid Coyle { 302012affe1SDavid Coyle struct rte_crypto_op *op; 303012affe1SDavid Coyle struct qat_sym_session *ctx; 304012affe1SDavid Coyle uint16_t i; 305012affe1SDavid Coyle 306012affe1SDavid Coyle for (i = 0; i < nb_ops; i++) { 307012affe1SDavid Coyle op = (struct rte_crypto_op *)ops[i]; 308012affe1SDavid Coyle 309012affe1SDavid Coyle if (op->sess_type == RTE_CRYPTO_OP_SECURITY_SESSION) { 3102973dbf9SAkhil Goyal ctx = SECURITY_GET_SESS_PRIV(op->sym->session); 311012affe1SDavid Coyle 312ca0ba0e4SBrian Dooley #ifdef RTE_QAT_OPENSSL 313012affe1SDavid Coyle if (ctx == NULL || ctx->bpi_ctx == NULL) 314ca0ba0e4SBrian Dooley #else 315ca0ba0e4SBrian Dooley if (ctx == NULL || ctx->mb_mgr == NULL) 316ca0ba0e4SBrian Dooley #endif 317012affe1SDavid Coyle continue; 318012affe1SDavid Coyle 319ce7a737cSKevin O'Sullivan if (ctx->qat_cmd != ICP_QAT_FW_LA_CMD_CIPHER_CRC) 320012affe1SDavid Coyle qat_crc_generate(ctx, op); 321012affe1SDavid Coyle } 322012affe1SDavid Coyle } 323012affe1SDavid Coyle } 3246f0ef237SDavid Coyle 325e0a67610SKai Ji static __rte_always_inline int 326e0a67610SKai Ji qat_sym_process_response(void **op, uint8_t *resp, void *op_cookie, 327e0a67610SKai Ji uint64_t *dequeue_err_count __rte_unused) 32891614c73SFiona Trahe { 32991614c73SFiona Trahe struct icp_qat_fw_comn_resp *resp_msg = 33091614c73SFiona Trahe (struct icp_qat_fw_comn_resp *)resp; 33191614c73SFiona Trahe struct rte_crypto_op *rx_op = (struct rte_crypto_op *)(uintptr_t) 33291614c73SFiona Trahe (resp_msg->opaque_data); 3336f0ef237SDavid Coyle struct qat_sym_session *sess; 33445fe9ea9SAdam Dybkowski uint8_t is_docsis_sec; 3350fda888bSSivaramakrishnan Venkat struct qat_sym_op_cookie *cookie = NULL; 33691614c73SFiona Trahe 337ab8a58feSTomasz Jozwiak #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG 338ab8a58feSTomasz Jozwiak QAT_DP_HEXDUMP_LOG(DEBUG, "qat_response:", (uint8_t *)resp_msg, 33991614c73SFiona Trahe sizeof(struct icp_qat_fw_comn_resp)); 34091614c73SFiona Trahe #endif 34191614c73SFiona Trahe 3426f0ef237SDavid Coyle if (rx_op->sess_type == RTE_CRYPTO_OP_SECURITY_SESSION) { 3436f0ef237SDavid Coyle /* 3446f0ef237SDavid Coyle * Assuming at this point that if it's a security 3456f0ef237SDavid Coyle * op, that this is for DOCSIS 3466f0ef237SDavid Coyle */ 3472973dbf9SAkhil Goyal sess = SECURITY_GET_SESS_PRIV(rx_op->sym->session); 3486f0ef237SDavid Coyle is_docsis_sec = 1; 34966a9d8d0SMaxime Coquelin } else { 3502a440d6aSAkhil Goyal sess = CRYPTODEV_GET_SYM_SESS_PRIV(rx_op->sym->session); 35145fe9ea9SAdam Dybkowski is_docsis_sec = 0; 3526f0ef237SDavid Coyle } 35391614c73SFiona Trahe 35445fe9ea9SAdam Dybkowski if (ICP_QAT_FW_COMN_STATUS_FLAG_OK != 35545fe9ea9SAdam Dybkowski ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET( 35645fe9ea9SAdam Dybkowski resp_msg->comn_hdr.comn_status)) { 35745fe9ea9SAdam Dybkowski 35845fe9ea9SAdam Dybkowski rx_op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 35945fe9ea9SAdam Dybkowski } else { 36091614c73SFiona Trahe rx_op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 3616f0ef237SDavid Coyle 362ca0ba0e4SBrian Dooley #ifdef RTE_QAT_OPENSSL 3636f0ef237SDavid Coyle if (sess->bpi_ctx) { 364ca0ba0e4SBrian Dooley #else 365ca0ba0e4SBrian Dooley if (sess->mb_mgr) { 366ca0ba0e4SBrian Dooley #endif 3676f0ef237SDavid Coyle qat_bpicipher_postprocess(sess, rx_op); 368ce7a737cSKevin O'Sullivan if (is_docsis_sec && sess->qat_cmd != 369ce7a737cSKevin O'Sullivan ICP_QAT_FW_LA_CMD_CIPHER_CRC) 3706f0ef237SDavid Coyle qat_crc_verify(sess, rx_op); 3716f0ef237SDavid Coyle } 37291614c73SFiona Trahe } 37345fe9ea9SAdam Dybkowski 37445fe9ea9SAdam Dybkowski if (sess->is_single_pass_gmac) { 37545fe9ea9SAdam Dybkowski struct qat_sym_op_cookie *cookie = 37645fe9ea9SAdam Dybkowski (struct qat_sym_op_cookie *) op_cookie; 37745fe9ea9SAdam Dybkowski memset(cookie->opt.spc_gmac.cd_cipher.key, 0, 37845fe9ea9SAdam Dybkowski sess->auth_key_length); 37945fe9ea9SAdam Dybkowski } 38045fe9ea9SAdam Dybkowski 3810fda888bSSivaramakrishnan Venkat cookie = (struct qat_sym_op_cookie *) op_cookie; 3820fda888bSSivaramakrishnan Venkat if (cookie->status == RTE_CRYPTO_OP_STATUS_INVALID_ARGS) { 3830fda888bSSivaramakrishnan Venkat rx_op->status = cookie->status; 3840fda888bSSivaramakrishnan Venkat cookie->status = 0; 3850fda888bSSivaramakrishnan Venkat } 3860fda888bSSivaramakrishnan Venkat 38791614c73SFiona Trahe *op = (void *)rx_op; 388e0a67610SKai Ji 389e0a67610SKai Ji /* 390e0a67610SKai Ji * return 1 as dequeue op only move on to the next op 391e0a67610SKai Ji * if one was ready to return to API 392e0a67610SKai Ji */ 393e0a67610SKai Ji return 1; 39491614c73SFiona Trahe } 395728c76b0SFan Zhang 396e2c11053SNishikant Nayak static __rte_always_inline int 397e2c11053SNishikant Nayak qat_sym_process_response_gen_lce(void **op, uint8_t *resp, void *op_cookie __rte_unused, 398e2c11053SNishikant Nayak uint64_t *dequeue_err_count __rte_unused) 399e2c11053SNishikant Nayak { 400e2c11053SNishikant Nayak struct icp_qat_fw_comn_resp *resp_msg = (struct icp_qat_fw_comn_resp *)resp; 401e2c11053SNishikant Nayak struct rte_crypto_op *rx_op = (struct rte_crypto_op *)(uintptr_t) (resp_msg->opaque_data); 402e2c11053SNishikant Nayak struct qat_sym_session *sess; 403e2c11053SNishikant Nayak 404e2c11053SNishikant Nayak #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG 405e2c11053SNishikant Nayak QAT_DP_HEXDUMP_LOG(DEBUG, "qat_response:", (uint8_t *)resp_msg, 406e2c11053SNishikant Nayak sizeof(struct icp_qat_fw_comn_resp)); 407e2c11053SNishikant Nayak #endif 408e2c11053SNishikant Nayak 409e2c11053SNishikant Nayak sess = CRYPTODEV_GET_SYM_SESS_PRIV(rx_op->sym->session); 410e2c11053SNishikant Nayak 411e2c11053SNishikant Nayak rx_op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 412e2c11053SNishikant Nayak 413e2c11053SNishikant Nayak if (ICP_QAT_FW_COMN_STATUS_FLAG_OK != ICP_QAT_FW_COMN_RESP_UNSUPPORTED_REQUEST_STAT_GET( 414e2c11053SNishikant Nayak resp_msg->comn_hdr.comn_status)) 415e2c11053SNishikant Nayak rx_op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 416e2c11053SNishikant Nayak 417e2c11053SNishikant Nayak else if (ICP_QAT_FW_COMN_STATUS_FLAG_OK != ICP_QAT_FW_COMN_RESP_INVALID_PARAM_STAT_GET( 418e2c11053SNishikant Nayak resp_msg->comn_hdr.comn_status)) 419e2c11053SNishikant Nayak rx_op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; 420e2c11053SNishikant Nayak 421e2c11053SNishikant Nayak if (sess->qat_dir == ICP_QAT_HW_CIPHER_DECRYPT) { 422e2c11053SNishikant Nayak if (ICP_QAT_FW_LA_VER_STATUS_FAIL == ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET( 423e2c11053SNishikant Nayak resp_msg->comn_hdr.comn_status)) 424e2c11053SNishikant Nayak rx_op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 425e2c11053SNishikant Nayak } 426e2c11053SNishikant Nayak 427e2c11053SNishikant Nayak *op = (void *)rx_op; 428e2c11053SNishikant Nayak 429e2c11053SNishikant Nayak /* 430e2c11053SNishikant Nayak * return 1 as dequeue op only move on to the next op 431e2c11053SNishikant Nayak * if one was ready to return to API 432e2c11053SNishikant Nayak */ 433e2c11053SNishikant Nayak return 1; 434e2c11053SNishikant Nayak } 435e2c11053SNishikant Nayak 436728c76b0SFan Zhang int 437728c76b0SFan Zhang qat_sym_configure_dp_ctx(struct rte_cryptodev *dev, uint16_t qp_id, 438728c76b0SFan Zhang struct rte_crypto_raw_dp_ctx *raw_dp_ctx, 439728c76b0SFan Zhang enum rte_crypto_op_sess_type sess_type, 440728c76b0SFan Zhang union rte_cryptodev_session_ctx session_ctx, uint8_t is_update); 441728c76b0SFan Zhang 442728c76b0SFan Zhang int 443728c76b0SFan Zhang qat_sym_get_dp_ctx_size(struct rte_cryptodev *dev); 444728c76b0SFan Zhang 445e0a67610SKai Ji void 446e0a67610SKai Ji qat_sym_init_op_cookie(void *cookie); 447e0a67610SKai Ji 448e0a67610SKai Ji #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG 449e0a67610SKai Ji static __rte_always_inline void 450e0a67610SKai Ji qat_sym_debug_log_dump(struct icp_qat_fw_la_bulk_req *qat_req, 451e0a67610SKai Ji struct qat_sym_session *ctx, 452e0a67610SKai Ji struct rte_crypto_vec *vec, uint32_t vec_len, 453e0a67610SKai Ji struct rte_crypto_va_iova_ptr *cipher_iv, 454e0a67610SKai Ji struct rte_crypto_va_iova_ptr *auth_iv, 455e0a67610SKai Ji struct rte_crypto_va_iova_ptr *aad, 456e0a67610SKai Ji struct rte_crypto_va_iova_ptr *digest) 457e0a67610SKai Ji { 458e0a67610SKai Ji uint32_t i; 459e0a67610SKai Ji 460e0a67610SKai Ji QAT_DP_HEXDUMP_LOG(DEBUG, "qat_req:", qat_req, 461e0a67610SKai Ji sizeof(struct icp_qat_fw_la_bulk_req)); 462e0a67610SKai Ji for (i = 0; i < vec_len; i++) 463e0a67610SKai Ji QAT_DP_HEXDUMP_LOG(DEBUG, "src_data:", vec[i].base, vec[i].len); 464e0a67610SKai Ji if (cipher_iv && ctx->cipher_iv.length > 0) 465e0a67610SKai Ji QAT_DP_HEXDUMP_LOG(DEBUG, "cipher iv:", cipher_iv->va, 466e0a67610SKai Ji ctx->cipher_iv.length); 467e0a67610SKai Ji if (auth_iv && ctx->auth_iv.length > 0) 468e0a67610SKai Ji QAT_DP_HEXDUMP_LOG(DEBUG, "auth iv:", auth_iv->va, 469e0a67610SKai Ji ctx->auth_iv.length); 470e0a67610SKai Ji if (aad && ctx->aad_len > 0) 471e0a67610SKai Ji QAT_DP_HEXDUMP_LOG(DEBUG, "aad:", aad->va, 472e0a67610SKai Ji ctx->aad_len); 473e0a67610SKai Ji if (digest && ctx->digest_length > 0) 474e0a67610SKai Ji QAT_DP_HEXDUMP_LOG(DEBUG, "digest:", digest->va, 475e0a67610SKai Ji ctx->digest_length); 476e0a67610SKai Ji } 477e0a67610SKai Ji #else 478e0a67610SKai Ji static __rte_always_inline void 479e0a67610SKai Ji qat_sym_debug_log_dump(struct icp_qat_fw_la_bulk_req *qat_req __rte_unused, 480e0a67610SKai Ji struct qat_sym_session *ctx __rte_unused, 481e0a67610SKai Ji struct rte_crypto_vec *vec __rte_unused, 482e0a67610SKai Ji uint32_t vec_len __rte_unused, 483e0a67610SKai Ji struct rte_crypto_va_iova_ptr *cipher_iv __rte_unused, 484e0a67610SKai Ji struct rte_crypto_va_iova_ptr *auth_iv __rte_unused, 485e0a67610SKai Ji struct rte_crypto_va_iova_ptr *aad __rte_unused, 486e0a67610SKai Ji struct rte_crypto_va_iova_ptr *digest __rte_unused) 487e0a67610SKai Ji { 488e0a67610SKai Ji } 489e0a67610SKai Ji #endif 490e0a67610SKai Ji 49198c4a35cSTomasz Jozwiak #else 4924a147730STomasz Jozwiak 49398c4a35cSTomasz Jozwiak static inline void 494012affe1SDavid Coyle qat_sym_preprocess_requests(void **ops __rte_unused, 495012affe1SDavid Coyle uint16_t nb_ops __rte_unused) 496012affe1SDavid Coyle { 497012affe1SDavid Coyle } 498012affe1SDavid Coyle 499012affe1SDavid Coyle static inline void 50045fe9ea9SAdam Dybkowski qat_sym_process_response(void **op __rte_unused, uint8_t *resp __rte_unused, 501e2c11053SNishikant Nayak void *op_cookie __rte_unused, uint64_t *dequeue_err_count __rte_unused) 502e2c11053SNishikant Nayak { 503e2c11053SNishikant Nayak } 504e2c11053SNishikant Nayak 505e2c11053SNishikant Nayak static inline void 506e2c11053SNishikant Nayak qat_sym_process_response_gen_lce(void **op __rte_unused, uint8_t *resp __rte_unused, 507e2c11053SNishikant Nayak void *op_cookie __rte_unused, uint64_t *dequeue_err_count __rte_unused) 50898c4a35cSTomasz Jozwiak { 50998c4a35cSTomasz Jozwiak } 510728c76b0SFan Zhang 511e0a67610SKai Ji #endif /* BUILD_QAT_SYM */ 512bba31cffSFiona Trahe #endif /* _QAT_SYM_H_ */ 513