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