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