198f06089SFiona Trahe /* SPDX-License-Identifier: BSD-3-Clause 2c3352e72SKai Ji * Copyright(c) 2015-2022 Intel Corporation 398f06089SFiona Trahe */ 498f06089SFiona Trahe #ifndef _QAT_SYM_SESSION_H_ 598f06089SFiona Trahe #define _QAT_SYM_SESSION_H_ 698f06089SFiona Trahe 798f06089SFiona Trahe #include <rte_crypto.h> 8af668035SAkhil Goyal #include <cryptodev_pmd.h> 96f0ef237SDavid Coyle #include <rte_security.h> 1098f06089SFiona Trahe 1198f06089SFiona Trahe #include "qat_common.h" 1298f06089SFiona Trahe #include "icp_qat_hw.h" 1398f06089SFiona Trahe #include "icp_qat_fw.h" 1498f06089SFiona Trahe #include "icp_qat_fw_la.h" 1598f06089SFiona Trahe 16ca0ba0e4SBrian Dooley #ifndef RTE_QAT_OPENSSL 17ca0ba0e4SBrian Dooley #ifndef RTE_ARCH_ARM 18ca0ba0e4SBrian Dooley #include <intel-ipsec-mb.h> 19ca0ba0e4SBrian Dooley #endif 20ca0ba0e4SBrian Dooley #endif 21ca0ba0e4SBrian Dooley 2298f06089SFiona Trahe /* 2398f06089SFiona Trahe * Key Modifier (KM) value used in KASUMI algorithm in F9 mode to XOR 2498f06089SFiona Trahe * Integrity Key (IK) 2598f06089SFiona Trahe */ 2698f06089SFiona Trahe #define KASUMI_F9_KEY_MODIFIER_4_BYTES 0xAAAAAAAA 2798f06089SFiona Trahe 2898f06089SFiona Trahe #define KASUMI_F8_KEY_MODIFIER_4_BYTES 0x55555555 2998f06089SFiona Trahe 302165e2e9SArek Kusztal /* 312165e2e9SArek Kusztal * AES-GCM J0 length 322165e2e9SArek Kusztal */ 332165e2e9SArek Kusztal #define AES_GCM_J0_LEN 16 342165e2e9SArek Kusztal 3598f06089SFiona Trahe /* 3DES key sizes */ 3698f06089SFiona Trahe #define QAT_3DES_KEY_SZ_OPT1 24 /* Keys are independent */ 3798f06089SFiona Trahe #define QAT_3DES_KEY_SZ_OPT2 16 /* K3=K1 */ 38e3d99884SFiona Trahe #define QAT_3DES_KEY_SZ_OPT3 8 /* K1=K2=K3 */ 39e3d99884SFiona Trahe 40aa983f03SAdam Dybkowski /* 96-bit case of IV for CCP/GCM single pass algorithm */ 41aa983f03SAdam Dybkowski #define QAT_AES_GCM_SPC_IV_SIZE 12 42aa983f03SAdam Dybkowski 4398f06089SFiona Trahe #define QAT_AES_HW_CONFIG_CBC_ENC(alg) \ 4498f06089SFiona Trahe ICP_QAT_HW_CIPHER_CONFIG_BUILD(ICP_QAT_HW_CIPHER_CBC_MODE, alg, \ 4598f06089SFiona Trahe ICP_QAT_HW_CIPHER_NO_CONVERT, \ 4698f06089SFiona Trahe ICP_QAT_HW_CIPHER_ENCRYPT) 4798f06089SFiona Trahe 4898f06089SFiona Trahe #define QAT_AES_HW_CONFIG_CBC_DEC(alg) \ 4998f06089SFiona Trahe ICP_QAT_HW_CIPHER_CONFIG_BUILD(ICP_QAT_HW_CIPHER_CBC_MODE, alg, \ 5098f06089SFiona Trahe ICP_QAT_HW_CIPHER_KEY_CONVERT, \ 5198f06089SFiona Trahe ICP_QAT_HW_CIPHER_DECRYPT) 5298f06089SFiona Trahe 53ce7a737cSKevin O'Sullivan #define ICP_QAT_HW_GEN3_CRC_FLAGS_BUILD(ref_in, ref_out) \ 54ce7a737cSKevin O'Sullivan (((ref_in & QAT_GEN3_COMP_REFLECT_IN_MASK) << \ 55ce7a737cSKevin O'Sullivan QAT_GEN3_COMP_REFLECT_IN_BITPOS) | \ 56ce7a737cSKevin O'Sullivan ((ref_out & QAT_GEN3_COMP_REFLECT_OUT_MASK) << \ 57ce7a737cSKevin O'Sullivan QAT_GEN3_COMP_REFLECT_OUT_BITPOS)) 58ce7a737cSKevin O'Sullivan 5991c1daa4STomasz Cel #define QAT_AES_CMAC_CONST_RB 0x87 6091c1daa4STomasz Cel 616618d3b5SArek Kusztal #define QAT_CRYPTO_SLICE_SPC 1 626618d3b5SArek Kusztal #define QAT_CRYPTO_SLICE_UCS 2 636618d3b5SArek Kusztal #define QAT_CRYPTO_SLICE_WCP 4 646618d3b5SArek Kusztal 65171c655bSArkadiusz Kusztal #define QAT_PREFIX_SIZE 64 66171c655bSArkadiusz Kusztal #define QAT_PREFIX_TBL_SIZE ((QAT_PREFIX_SIZE) * 2) 67171c655bSArkadiusz Kusztal 686618d3b5SArek Kusztal #define QAT_SESSION_IS_SLICE_SET(flags, flag) \ 696618d3b5SArek Kusztal (!!((flags) & (flag))) 706618d3b5SArek Kusztal 71171c655bSArkadiusz Kusztal #define QAT_SM3_BLOCK_SIZE 64 7262126a92SCiara Power #define QAT_SHA_CBLOCK 64 7362126a92SCiara Power #define QAT_SHA512_CBLOCK 128 7462126a92SCiara Power #define QAT_MD5_CBLOCK 64 75171c655bSArkadiusz Kusztal 766132b718SFiona Trahe enum qat_sym_proto_flag { 7798f06089SFiona Trahe QAT_CRYPTO_PROTO_FLAG_NONE = 0, 7898f06089SFiona Trahe QAT_CRYPTO_PROTO_FLAG_CCM = 1, 7998f06089SFiona Trahe QAT_CRYPTO_PROTO_FLAG_GCM = 2, 8098f06089SFiona Trahe QAT_CRYPTO_PROTO_FLAG_SNOW3G = 3, 8198f06089SFiona Trahe QAT_CRYPTO_PROTO_FLAG_ZUC = 4 8298f06089SFiona Trahe }; 8398f06089SFiona Trahe 84c3352e72SKai Ji struct qat_sym_session; 85c3352e72SKai Ji 86c3352e72SKai Ji /* 87c3352e72SKai Ji * typedef qat_op_build_request_t function pointer, passed in as argument 88c3352e72SKai Ji * in enqueue op burst, where a build request assigned base on the type of 89c3352e72SKai Ji * crypto op. 90c3352e72SKai Ji */ 91c3352e72SKai Ji typedef int (*qat_sym_build_request_t)(void *in_op, struct qat_sym_session *ctx, 92c3352e72SKai Ji uint8_t *out_msg, void *op_cookie); 93c3352e72SKai Ji 9498f06089SFiona Trahe /* Common content descriptor */ 95*e7750639SAndre Muezerie struct __rte_cache_aligned __rte_packed_begin qat_sym_cd { 9698f06089SFiona Trahe struct icp_qat_hw_cipher_algo_blk cipher; 97ce7a737cSKevin O'Sullivan union { 9898f06089SFiona Trahe struct icp_qat_hw_auth_algo_blk hash; 99ce7a737cSKevin O'Sullivan struct icp_qat_hw_gen2_crc_cd crc_gen2; 100ce7a737cSKevin O'Sullivan struct icp_qat_hw_gen3_crc_cd crc_gen3; 101ce7a737cSKevin O'Sullivan struct icp_qat_hw_gen4_crc_cd crc_gen4; 102ce7a737cSKevin O'Sullivan }; 103*e7750639SAndre Muezerie } __rte_packed_end; 10498f06089SFiona Trahe 1056132b718SFiona Trahe struct qat_sym_session { 10698f06089SFiona Trahe enum icp_qat_fw_la_cmd_id qat_cmd; 10798f06089SFiona Trahe enum icp_qat_hw_cipher_algo qat_cipher_alg; 10898f06089SFiona Trahe enum icp_qat_hw_cipher_dir qat_dir; 10998f06089SFiona Trahe enum icp_qat_hw_cipher_mode qat_mode; 11098f06089SFiona Trahe enum icp_qat_hw_auth_algo qat_hash_alg; 11198f06089SFiona Trahe enum icp_qat_hw_auth_op auth_op; 1126e21c1a5SAdam Dybkowski enum icp_qat_hw_auth_mode auth_mode; 11398f06089SFiona Trahe void *bpi_ctx; 114e2c11053SNishikant Nayak union { 1156132b718SFiona Trahe struct qat_sym_cd cd; 116e2c11053SNishikant Nayak uint8_t key_array[32]; 117e2c11053SNishikant Nayak }; 11827595cd8STyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) uint8_t prefix_state[QAT_PREFIX_TBL_SIZE]; 11998f06089SFiona Trahe uint8_t *cd_cur_ptr; 120e2c11053SNishikant Nayak union { 12198f06089SFiona Trahe phys_addr_t cd_paddr; 122e2c11053SNishikant Nayak phys_addr_t key_paddr; 123e2c11053SNishikant Nayak }; 124171c655bSArkadiusz Kusztal phys_addr_t prefix_paddr; 12598f06089SFiona Trahe struct icp_qat_fw_la_bulk_req fw_req; 12698f06089SFiona Trahe uint8_t aad_len; 12798f06089SFiona Trahe struct qat_crypto_instance *inst; 12898f06089SFiona Trahe struct { 12998f06089SFiona Trahe uint16_t offset; 13098f06089SFiona Trahe uint16_t length; 13198f06089SFiona Trahe } cipher_iv; 13298f06089SFiona Trahe struct { 13398f06089SFiona Trahe uint16_t offset; 13498f06089SFiona Trahe uint16_t length; 13598f06089SFiona Trahe } auth_iv; 13645fe9ea9SAdam Dybkowski uint16_t auth_key_length; 13798f06089SFiona Trahe uint16_t digest_length; 13898f06089SFiona Trahe rte_spinlock_t lock; /* protects this struct */ 139254558c8SKai Ji uint16_t dev_id; 14091c1daa4STomasz Cel uint8_t aes_cmac; 141aa983f03SAdam Dybkowski uint8_t is_single_pass; 14245fe9ea9SAdam Dybkowski uint8_t is_single_pass_gmac; 143d0549291SArek Kusztal uint8_t is_ucs; 1446618d3b5SArek Kusztal uint8_t is_iv12B; 1456618d3b5SArek Kusztal uint8_t is_gmac; 1466618d3b5SArek Kusztal uint8_t is_auth; 147e4beb311SArek Kusztal uint8_t is_cnt_zero; 148e4beb311SArek Kusztal /* Some generations need different setup of counter */ 1496c868d6eSCiara Power uint8_t is_zuc256; 1506c868d6eSCiara Power uint8_t is_wireless; 1516618d3b5SArek Kusztal uint32_t slice_types; 1526618d3b5SArek Kusztal enum qat_sym_proto_flag qat_proto_flag; 153c3352e72SKai Ji qat_sym_build_request_t build_request[2]; 154ca0ba0e4SBrian Dooley #ifndef RTE_QAT_OPENSSL 155ca0ba0e4SBrian Dooley IMB_MGR *mb_mgr; 15627595cd8STyler Retzlaff alignas(16) uint64_t expkey[4 * 15]; 15727595cd8STyler Retzlaff alignas(16) uint32_t dust[4 * 15]; 158ca0ba0e4SBrian Dooley uint8_t docsis_key_len; 1595570f95cSBrian Dooley #endif 16098f06089SFiona Trahe }; 16198f06089SFiona Trahe 16298f06089SFiona Trahe int 163bba31cffSFiona Trahe qat_sym_session_configure(struct rte_cryptodev *dev, 16498f06089SFiona Trahe struct rte_crypto_sym_xform *xform, 165bdce2564SAkhil Goyal struct rte_cryptodev_sym_session *sess); 16698f06089SFiona Trahe 16798f06089SFiona Trahe int 168bba31cffSFiona Trahe qat_sym_session_set_parameters(struct rte_cryptodev *dev, 169bdce2564SAkhil Goyal struct rte_crypto_sym_xform *xform, void *session_private, 170bdce2564SAkhil Goyal rte_iova_t session_private_iova); 17198f06089SFiona Trahe 17298f06089SFiona Trahe int 173aa983f03SAdam Dybkowski qat_sym_session_configure_aead(struct rte_cryptodev *dev, 174aa983f03SAdam Dybkowski struct rte_crypto_sym_xform *xform, 1756132b718SFiona Trahe struct qat_sym_session *session); 17698f06089SFiona Trahe 17798f06089SFiona Trahe int 178bba31cffSFiona Trahe qat_sym_session_configure_cipher(struct rte_cryptodev *dev, 17998f06089SFiona Trahe struct rte_crypto_sym_xform *xform, 1806132b718SFiona Trahe struct qat_sym_session *session); 18198f06089SFiona Trahe 18298f06089SFiona Trahe int 183bba31cffSFiona Trahe qat_sym_session_configure_auth(struct rte_cryptodev *dev, 18498f06089SFiona Trahe struct rte_crypto_sym_xform *xform, 1856132b718SFiona Trahe struct qat_sym_session *session); 18698f06089SFiona Trahe 18798f06089SFiona Trahe void 188bba31cffSFiona Trahe qat_sym_session_clear(struct rte_cryptodev *dev, 18998f06089SFiona Trahe struct rte_cryptodev_sym_session *session); 19098f06089SFiona Trahe 19198f06089SFiona Trahe unsigned int 192bba31cffSFiona Trahe qat_sym_session_get_private_size(struct rte_cryptodev *dev); 19398f06089SFiona Trahe 194ce7a737cSKevin O'Sullivan int 195ce7a737cSKevin O'Sullivan qat_cipher_crc_cap_msg_sess_prepare(struct qat_sym_session *session, 196ce7a737cSKevin O'Sullivan rte_iova_t session_paddr, 197ce7a737cSKevin O'Sullivan const uint8_t *cipherkey, 198ce7a737cSKevin O'Sullivan uint32_t cipherkeylen, 199ce7a737cSKevin O'Sullivan enum qat_device_gen qat_dev_gen); 200ce7a737cSKevin O'Sullivan 201bba31cffSFiona Trahe void 2026599d093SArek Kusztal qat_sym_sesssion_init_common_hdr(struct qat_sym_session *session, 2036599d093SArek Kusztal struct icp_qat_fw_comn_req_hdr *header, 2046132b718SFiona Trahe enum qat_sym_proto_flag proto_flags); 205ce7a737cSKevin O'Sullivan 206bba31cffSFiona Trahe int 207bba31cffSFiona Trahe qat_sym_validate_aes_key(int key_len, enum icp_qat_hw_cipher_algo *alg); 208bba31cffSFiona Trahe int 209bba31cffSFiona Trahe qat_sym_validate_aes_docsisbpi_key(int key_len, 21098f06089SFiona Trahe enum icp_qat_hw_cipher_algo *alg); 211bba31cffSFiona Trahe int 212bba31cffSFiona Trahe qat_sym_validate_snow3g_key(int key_len, enum icp_qat_hw_cipher_algo *alg); 213bba31cffSFiona Trahe int 214bba31cffSFiona Trahe qat_sym_validate_kasumi_key(int key_len, enum icp_qat_hw_cipher_algo *alg); 215bba31cffSFiona Trahe int 216bba31cffSFiona Trahe qat_sym_validate_3des_key(int key_len, enum icp_qat_hw_cipher_algo *alg); 217bba31cffSFiona Trahe int 218bba31cffSFiona Trahe qat_sym_validate_des_key(int key_len, enum icp_qat_hw_cipher_algo *alg); 219bba31cffSFiona Trahe int 220bba31cffSFiona Trahe qat_cipher_get_block_size(enum icp_qat_hw_cipher_algo qat_cipher_alg); 221bba31cffSFiona Trahe int 222bba31cffSFiona Trahe qat_sym_validate_zuc_key(int key_len, enum icp_qat_hw_cipher_algo *alg); 22398f06089SFiona Trahe 2246f0ef237SDavid Coyle int 2256f0ef237SDavid Coyle qat_security_session_create(void *dev, struct rte_security_session_conf *conf, 2263f3fc330SAkhil Goyal struct rte_security_session *sess); 2276f0ef237SDavid Coyle int 2286f0ef237SDavid Coyle qat_security_session_destroy(void *dev, struct rte_security_session *sess); 22966837861SAkhil Goyal unsigned int 23066837861SAkhil Goyal qat_security_session_get_size(void *dev __rte_unused); 2316f0ef237SDavid Coyle 23298f06089SFiona Trahe #endif /* _QAT_SYM_SESSION_H_ */ 233