xref: /dpdk/drivers/crypto/qat/qat_sym_session.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
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