1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015-2016 Intel Corporation
5 #ifndef _RTE_AESNI_MB_PMD_PRIVATE_H_
6 #define _RTE_AESNI_MB_PMD_PRIVATE_H_
8 #include "aesni_mb_ops.h"
10 #define CRYPTODEV_NAME_AESNI_MB_PMD crypto_aesni_mb
11 /**< AES-NI Multi buffer PMD device name */
13 /** AESNI_MB PMD LOGTYPE DRIVER */
14 int aesni_mb_logtype_driver;
16 #define AESNI_MB_LOG(level, fmt, ...) \
17 rte_log(RTE_LOG_ ## level, aesni_mb_logtype_driver, \
18 "%s() line %u: " fmt "\n", __func__, __LINE__, \
22 #define HMAC_IPAD_VALUE (0x36)
23 #define HMAC_OPAD_VALUE (0x5C)
25 /* Maximum length for digest */
26 #define DIGEST_LENGTH_MAX 64
27 static const unsigned auth_blocksize[] = {
39 * Get the blocksize in bytes for a specified authentication algorithm
41 * @Note: this function will not return a valid value for a non-valid
42 * authentication algorithm
44 static inline unsigned
45 get_auth_algo_blocksize(JOB_HASH_ALG algo)
47 return auth_blocksize[algo];
50 static const unsigned auth_truncated_digest_byte_lengths[] = {
64 * Get the IPsec specified truncated length in bytes of the HMAC digest for a
65 * specified authentication algorithm
67 * @Note: this function will not return a valid value for a non-valid
68 * authentication algorithm
70 static inline unsigned
71 get_truncated_digest_byte_length(JOB_HASH_ALG algo)
73 return auth_truncated_digest_byte_lengths[algo];
76 static const unsigned auth_digest_byte_lengths[] = {
90 * Get the full digest size in bytes for a specified authentication algorithm
91 * (if available in the Multi-buffer library)
93 * @Note: this function will not return a valid value for a non-valid
94 * authentication algorithm
96 static inline unsigned
97 get_digest_byte_length(JOB_HASH_ALG algo)
99 return auth_digest_byte_lengths[algo];
102 enum aesni_mb_operation {
103 AESNI_MB_OP_HASH_CIPHER,
104 AESNI_MB_OP_CIPHER_HASH,
105 AESNI_MB_OP_HASH_ONLY,
106 AESNI_MB_OP_CIPHER_ONLY,
107 AESNI_MB_OP_AEAD_HASH_CIPHER,
108 AESNI_MB_OP_AEAD_CIPHER_HASH,
109 AESNI_MB_OP_NOT_SUPPORTED
112 /** private data structure for each virtual AESNI device */
113 struct aesni_mb_private {
114 enum aesni_mb_vector_mode vector_mode;
115 /**< CPU vector instruction set mode */
116 unsigned max_nb_queue_pairs;
117 /**< Max number of queue pairs supported by device */
120 /** AESNI Multi buffer queue pair */
123 /**< Queue Pair Identifier */
124 char name[RTE_CRYPTODEV_NAME_MAX_LEN];
125 /**< Unique Queue Pair Name */
126 const struct aesni_mb_op_fns *op_fns;
127 /**< Vector mode dependent pointer table of the multi-buffer APIs */
129 /**< Multi-buffer instance */
130 struct rte_ring *ingress_queue;
131 /**< Ring for placing operations ready for processing */
132 struct rte_mempool *sess_mp;
133 /**< Session Mempool */
134 struct rte_cryptodev_stats stats;
135 /**< Queue pair statistics */
137 /**< Index of the next slot to be used in temp_digests,
138 * to store the digest for a given operation
140 uint8_t temp_digests[MAX_JOBS][DIGEST_LENGTH_MAX];
141 /**< Buffers used to store the digest generated
142 * by the driver when verifying a digest provided
143 * by the user (using authentication verify operation)
145 } __rte_cache_aligned;
147 /** AES-NI multi-buffer private session structure */
148 struct aesni_mb_session {
149 JOB_CHAIN_ORDER chain_order;
154 /**< IV parameters */
156 /** Cipher Parameters */
158 /** Cipher direction - encrypt / decrypt */
159 JOB_CIPHER_DIRECTION direction;
160 /** Cipher mode - CBC / Counter */
161 JOB_CIPHER_MODE mode;
163 uint64_t key_length_in_bytes;
167 uint32_t encode[60] __rte_aligned(16);
169 uint32_t decode[60] __rte_aligned(16);
173 const void *ks_ptr[3];
177 struct gcm_key_data gcm_key;
179 /**< Expanded AES keys - Allocating space to
180 * contain the maximum expanded key size which
181 * is 240 bytes for 256 bit AES, calculate by:
182 * ((key size (bytes)) *
183 * ((number of rounds) + 1))
187 /** Authentication Parameters */
189 JOB_HASH_ALG algo; /**< Authentication Algorithm */
190 enum rte_crypto_auth_operation operation;
191 /**< auth operation generate or verify */
194 uint8_t inner[128] __rte_aligned(16);
196 uint8_t outer[128] __rte_aligned(16);
199 /**< HMAC Authentication pads -
200 * allocating space for the maximum pad
201 * size supported which is 128 bytes for
206 uint32_t k1_expanded[44] __rte_aligned(16);
207 /**< k1 (expanded key). */
208 uint8_t k2[16] __rte_aligned(16);
210 uint8_t k3[16] __rte_aligned(16);
215 uint32_t expkey[60] __rte_aligned(16);
216 /**< k1 (expanded key). */
217 uint32_t skey1[4] __rte_aligned(16);
219 uint32_t skey2[4] __rte_aligned(16);
222 /**< Expanded XCBC authentication keys */
224 /** Generated digest size by the Multi-buffer library */
225 uint16_t gen_digest_len;
226 /** Requested digest size from Cryptodev */
227 uint16_t req_digest_len;
231 /** AAD data length */
234 } __rte_cache_aligned;
241 aesni_mb_set_session_parameters(const struct aesni_mb_op_fns *mb_ops,
242 struct aesni_mb_session *sess,
243 const struct rte_crypto_sym_xform *xform);
246 /** device specific operations function pointer structure */
247 extern struct rte_cryptodev_ops *rte_aesni_mb_pmd_ops;
251 #endif /* _RTE_AESNI_MB_PMD_PRIVATE_H_ */