xref: /dpdk/drivers/crypto/armv8/armv8_pmd_private.h (revision 2b843cac232eb3f2fa79e4254e21766817e2019f)
1b28f28aeSDharmik Thakkar /* SPDX-License-Identifier: BSD-3-Clause
2b28f28aeSDharmik Thakkar  * Copyright(c) 2017 Cavium, Inc
3b28f28aeSDharmik Thakkar  */
4b28f28aeSDharmik Thakkar 
5b28f28aeSDharmik Thakkar #ifndef _ARMV8_PMD_PRIVATE_H_
6b28f28aeSDharmik Thakkar #define _ARMV8_PMD_PRIVATE_H_
7b28f28aeSDharmik Thakkar 
8bde43e8aSRuifeng Wang #include "AArch64cryptolib.h"
9bde43e8aSRuifeng Wang 
10b28f28aeSDharmik Thakkar #define CRYPTODEV_NAME_ARMV8_PMD	crypto_armv8
11b28f28aeSDharmik Thakkar /**< ARMv8 Crypto PMD device name */
12b28f28aeSDharmik Thakkar 
1328b05145SRuifeng Wang extern int crypto_armv8_log_type;
14*2b843cacSDavid Marchand #define RTE_LOGTYPE_CRYPTO_ARMV8 crypto_armv8_log_type
1528b05145SRuifeng Wang 
16*2b843cacSDavid Marchand #define ARMV8_CRYPTO_LOG_ERR(...) \
17*2b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(ERR, CRYPTO_ARMV8, "%s() line %u: ", \
18*2b843cacSDavid Marchand 		__func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
19b28f28aeSDharmik Thakkar 
20*2b843cacSDavid Marchand #define ARMV8_CRYPTO_LOG_INFO(...) \
21*2b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(INFO, CRYPTO_ARMV8, "%s() line %u: ", \
22*2b843cacSDavid Marchand 		__func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
23b28f28aeSDharmik Thakkar 
24*2b843cacSDavid Marchand #define ARMV8_CRYPTO_LOG_DBG(...) \
25*2b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(DEBUG, CRYPTO_ARMV8, "%s() line %u: ", \
26*2b843cacSDavid Marchand 		__func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
27b28f28aeSDharmik Thakkar 
28b28f28aeSDharmik Thakkar #define NBBY		8		/* Number of bits in a byte */
29b28f28aeSDharmik Thakkar #define BYTE_LENGTH(x)	((x) / NBBY)	/* Number of bytes in x (round down) */
30b28f28aeSDharmik Thakkar 
31b28f28aeSDharmik Thakkar /* Maximum length for digest (SHA-256 needs 32 bytes) */
32b28f28aeSDharmik Thakkar #define DIGEST_LENGTH_MAX 32
33b28f28aeSDharmik Thakkar 
34b28f28aeSDharmik Thakkar /** ARMv8 operation order mode enumerator */
35b28f28aeSDharmik Thakkar enum armv8_crypto_chain_order {
36b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CHAIN_CIPHER_AUTH,
37b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CHAIN_AUTH_CIPHER,
38b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CHAIN_NOT_SUPPORTED,
39b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CHAIN_LIST_END = ARMV8_CRYPTO_CHAIN_NOT_SUPPORTED
40b28f28aeSDharmik Thakkar };
41b28f28aeSDharmik Thakkar 
42b28f28aeSDharmik Thakkar /** ARMv8 cipher operation enumerator */
43b28f28aeSDharmik Thakkar enum armv8_crypto_cipher_operation {
44b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CIPHER_OP_ENCRYPT = RTE_CRYPTO_CIPHER_OP_ENCRYPT,
45b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CIPHER_OP_DECRYPT = RTE_CRYPTO_CIPHER_OP_DECRYPT,
46b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CIPHER_OP_NOT_SUPPORTED,
47b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CIPHER_OP_LIST_END = ARMV8_CRYPTO_CIPHER_OP_NOT_SUPPORTED
48b28f28aeSDharmik Thakkar };
49b28f28aeSDharmik Thakkar 
50b28f28aeSDharmik Thakkar enum armv8_crypto_cipher_keylen {
51b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CIPHER_KEYLEN_128,
52b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CIPHER_KEYLEN_192,
53b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CIPHER_KEYLEN_256,
54b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CIPHER_KEYLEN_NOT_SUPPORTED,
55b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_CIPHER_KEYLEN_LIST_END =
56b28f28aeSDharmik Thakkar 		ARMV8_CRYPTO_CIPHER_KEYLEN_NOT_SUPPORTED
57b28f28aeSDharmik Thakkar };
58b28f28aeSDharmik Thakkar 
59b28f28aeSDharmik Thakkar /** ARMv8 auth mode enumerator */
60b28f28aeSDharmik Thakkar enum armv8_crypto_auth_mode {
61b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_AUTH_AS_AUTH,
62b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_AUTH_AS_HMAC,
63b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_AUTH_AS_CIPHER,
64b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_AUTH_NOT_SUPPORTED,
65b28f28aeSDharmik Thakkar 	ARMV8_CRYPTO_AUTH_LIST_END = ARMV8_CRYPTO_AUTH_NOT_SUPPORTED
66b28f28aeSDharmik Thakkar };
67b28f28aeSDharmik Thakkar 
68b28f28aeSDharmik Thakkar #define CRYPTO_CIPHER_KEYLEN_MAX	ARMV8_CRYPTO_CIPHER_KEYLEN_LIST_END
69087ed975SRuifeng Wang #define CRYPTO_CIPHER_MAX		(RTE_CRYPTO_CIPHER_AES_ECB + 1)
70087ed975SRuifeng Wang #define CRYPTO_AUTH_MAX			(RTE_CRYPTO_AUTH_SHA512_HMAC + 1)
71b28f28aeSDharmik Thakkar 
72b28f28aeSDharmik Thakkar #define HMAC_IPAD_VALUE			(0x36)
73b28f28aeSDharmik Thakkar #define HMAC_OPAD_VALUE			(0x5C)
74b28f28aeSDharmik Thakkar 
75b28f28aeSDharmik Thakkar #define SHA256_AUTH_KEY_LENGTH		(BYTE_LENGTH(256))
76b28f28aeSDharmik Thakkar #define SHA256_BLOCK_SIZE		(BYTE_LENGTH(512))
77b28f28aeSDharmik Thakkar 
78b28f28aeSDharmik Thakkar #define SHA1_AUTH_KEY_LENGTH		(BYTE_LENGTH(160))
79b28f28aeSDharmik Thakkar #define SHA1_BLOCK_SIZE			(BYTE_LENGTH(512))
80b28f28aeSDharmik Thakkar 
81b28f28aeSDharmik Thakkar #define SHA_AUTH_KEY_MAX		SHA256_AUTH_KEY_LENGTH
82b28f28aeSDharmik Thakkar #define SHA_BLOCK_MAX			SHA256_BLOCK_SIZE
83b28f28aeSDharmik Thakkar 
84b28f28aeSDharmik Thakkar typedef int (*crypto_func_t)(uint8_t *, uint8_t *, uint64_t,
85b28f28aeSDharmik Thakkar 				uint8_t *, uint8_t *, uint64_t,
86bde43e8aSRuifeng Wang 				armv8_cipher_digest_t *);
87b28f28aeSDharmik Thakkar 
88b28f28aeSDharmik Thakkar typedef void (*crypto_key_sched_t)(uint8_t *, const uint8_t *);
89b28f28aeSDharmik Thakkar 
90b28f28aeSDharmik Thakkar /** private data structure for each ARMv8 crypto device */
91b28f28aeSDharmik Thakkar struct armv8_crypto_private {
92b28f28aeSDharmik Thakkar 	unsigned int max_nb_qpairs;
93b28f28aeSDharmik Thakkar 	/**< Max number of queue pairs */
94b28f28aeSDharmik Thakkar };
95b28f28aeSDharmik Thakkar 
96b28f28aeSDharmik Thakkar /** ARMv8 crypto queue pair */
9727595cd8STyler Retzlaff struct __rte_cache_aligned armv8_crypto_qp {
98b28f28aeSDharmik Thakkar 	uint16_t id;
99b28f28aeSDharmik Thakkar 	/**< Queue Pair Identifier */
100b28f28aeSDharmik Thakkar 	struct rte_ring *processed_ops;
101b28f28aeSDharmik Thakkar 	/**< Ring for placing process packets */
102b28f28aeSDharmik Thakkar 	struct rte_mempool *sess_mp;
103b28f28aeSDharmik Thakkar 	/**< Session Mempool */
104b28f28aeSDharmik Thakkar 	struct rte_cryptodev_stats stats;
105b28f28aeSDharmik Thakkar 	/**< Queue pair statistics */
106b28f28aeSDharmik Thakkar 	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
107b28f28aeSDharmik Thakkar 	/**< Unique Queue Pair Name */
108b28f28aeSDharmik Thakkar 	uint8_t temp_digest[DIGEST_LENGTH_MAX];
109b28f28aeSDharmik Thakkar 	/**< Buffer used to store the digest generated
110b28f28aeSDharmik Thakkar 	 * by the driver when verifying a digest provided
111b28f28aeSDharmik Thakkar 	 * by the user (using authentication verify operation)
112b28f28aeSDharmik Thakkar 	 */
11327595cd8STyler Retzlaff };
114b28f28aeSDharmik Thakkar 
115b28f28aeSDharmik Thakkar /** ARMv8 crypto private session structure */
11627595cd8STyler Retzlaff struct __rte_cache_aligned armv8_crypto_session {
117b28f28aeSDharmik Thakkar 	enum armv8_crypto_chain_order chain_order;
118b28f28aeSDharmik Thakkar 	/**< chain order mode */
119b28f28aeSDharmik Thakkar 	crypto_func_t crypto_func;
120b28f28aeSDharmik Thakkar 	/**< cryptographic function to use for this session */
121b28f28aeSDharmik Thakkar 
122b28f28aeSDharmik Thakkar 	/** Cipher Parameters */
123b28f28aeSDharmik Thakkar 	struct {
124b28f28aeSDharmik Thakkar 		enum rte_crypto_cipher_operation direction;
125b28f28aeSDharmik Thakkar 		/**< cipher operation direction */
126b28f28aeSDharmik Thakkar 		enum rte_crypto_cipher_algorithm algo;
127b28f28aeSDharmik Thakkar 		/**< cipher algorithm */
128b28f28aeSDharmik Thakkar 		struct {
129b28f28aeSDharmik Thakkar 			uint16_t length;
130b28f28aeSDharmik Thakkar 			uint16_t offset;
131b28f28aeSDharmik Thakkar 		} iv;
132b28f28aeSDharmik Thakkar 		/**< IV parameters */
133b28f28aeSDharmik Thakkar 
134b28f28aeSDharmik Thakkar 		struct {
135b28f28aeSDharmik Thakkar 			uint8_t data[256];
136b28f28aeSDharmik Thakkar 			/**< key data */
137b28f28aeSDharmik Thakkar 			size_t length;
138b28f28aeSDharmik Thakkar 			/**< key length in bytes */
139b28f28aeSDharmik Thakkar 		} key;
140b28f28aeSDharmik Thakkar 
141b28f28aeSDharmik Thakkar 		crypto_key_sched_t key_sched;
142b28f28aeSDharmik Thakkar 		/**< Key schedule function */
143b28f28aeSDharmik Thakkar 	} cipher;
144b28f28aeSDharmik Thakkar 
145b28f28aeSDharmik Thakkar 	/** Authentication Parameters */
146b28f28aeSDharmik Thakkar 	struct {
147b28f28aeSDharmik Thakkar 		enum rte_crypto_auth_operation operation;
148b28f28aeSDharmik Thakkar 		/**< auth operation generate or verify */
149b28f28aeSDharmik Thakkar 		enum armv8_crypto_auth_mode mode;
150b28f28aeSDharmik Thakkar 		/**< auth operation mode */
151b28f28aeSDharmik Thakkar 
152b28f28aeSDharmik Thakkar 		union {
153b28f28aeSDharmik Thakkar 			struct {
154b28f28aeSDharmik Thakkar 				/* Add data if needed */
155b28f28aeSDharmik Thakkar 			} auth;
156b28f28aeSDharmik Thakkar 
157b28f28aeSDharmik Thakkar 			struct {
15827595cd8STyler Retzlaff 				alignas(RTE_CACHE_LINE_SIZE) uint8_t i_key_pad[SHA_BLOCK_MAX];
159b28f28aeSDharmik Thakkar 				/**< inner pad (max supported block length) */
16027595cd8STyler Retzlaff 				alignas(RTE_CACHE_LINE_SIZE) uint8_t o_key_pad[SHA_BLOCK_MAX];
161b28f28aeSDharmik Thakkar 				/**< outer pad (max supported block length) */
162b28f28aeSDharmik Thakkar 				uint8_t key[SHA_BLOCK_MAX];
163b28f28aeSDharmik Thakkar 				/**< HMAC key (max supported block length)*/
164b28f28aeSDharmik Thakkar 			} hmac;
165b28f28aeSDharmik Thakkar 		};
166b28f28aeSDharmik Thakkar 		uint16_t digest_length;
167b28f28aeSDharmik Thakkar 		/* Digest length */
168b28f28aeSDharmik Thakkar 	} auth;
169b28f28aeSDharmik Thakkar 
17027595cd8STyler Retzlaff };
171b28f28aeSDharmik Thakkar 
172b28f28aeSDharmik Thakkar /** Set and validate ARMv8 crypto session parameters */
173b28f28aeSDharmik Thakkar extern int armv8_crypto_set_session_parameters(
174b28f28aeSDharmik Thakkar 		struct armv8_crypto_session *sess,
175b28f28aeSDharmik Thakkar 		const struct rte_crypto_sym_xform *xform);
176b28f28aeSDharmik Thakkar 
177b28f28aeSDharmik Thakkar /** device specific operations function pointer structure */
178b28f28aeSDharmik Thakkar extern struct rte_cryptodev_ops *rte_armv8_crypto_pmd_ops;
179b28f28aeSDharmik Thakkar 
180b28f28aeSDharmik Thakkar #endif /* _ARMV8_PMD_PRIVATE_H_ */
181