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