xref: /dpdk/drivers/crypto/ipsec_mb/pmd_aesni_gcm_priv.h (revision e578789d9886d2688c03db5ee9df926599248abd)
1746825e5SPiotr Bronowski /* SPDX-License-Identifier: BSD-3-Clause
2746825e5SPiotr Bronowski  * Copyright(c) 2016-2021 Intel Corporation
3746825e5SPiotr Bronowski  */
4746825e5SPiotr Bronowski 
5746825e5SPiotr Bronowski #ifndef _PMD_AESNI_GCM_PRIV_H_
6746825e5SPiotr Bronowski #define _PMD_AESNI_GCM_PRIV_H_
7746825e5SPiotr Bronowski 
8746825e5SPiotr Bronowski #include "ipsec_mb_private.h"
9746825e5SPiotr Bronowski 
10746825e5SPiotr Bronowski #define AESNI_GCM_IV_LENGTH 12
11746825e5SPiotr Bronowski 
12746825e5SPiotr Bronowski static const struct rte_cryptodev_capabilities aesni_gcm_capabilities[] = {
13746825e5SPiotr Bronowski 	{	/* AES GMAC (AUTH) */
14746825e5SPiotr Bronowski 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
15746825e5SPiotr Bronowski 		{.sym = {
16746825e5SPiotr Bronowski 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
17746825e5SPiotr Bronowski 			{.auth = {
18746825e5SPiotr Bronowski 				.algo = RTE_CRYPTO_AUTH_AES_GMAC,
19746825e5SPiotr Bronowski 				.block_size = 16,
20746825e5SPiotr Bronowski 				.key_size = {
21746825e5SPiotr Bronowski 					.min = 16,
22746825e5SPiotr Bronowski 					.max = 32,
23746825e5SPiotr Bronowski 					.increment = 8
24746825e5SPiotr Bronowski 				},
25746825e5SPiotr Bronowski 				.digest_size = {
26746825e5SPiotr Bronowski 					.min = 1,
27746825e5SPiotr Bronowski 					.max = 16,
28746825e5SPiotr Bronowski 					.increment = 1
29746825e5SPiotr Bronowski 				},
30746825e5SPiotr Bronowski 				.iv_size = {
31746825e5SPiotr Bronowski 					.min = AESNI_GCM_IV_LENGTH,
32746825e5SPiotr Bronowski 					.max = AESNI_GCM_IV_LENGTH,
33746825e5SPiotr Bronowski 					.increment = 0
34746825e5SPiotr Bronowski 				}
35746825e5SPiotr Bronowski 			}, }
36746825e5SPiotr Bronowski 		}, }
37746825e5SPiotr Bronowski 	},
38746825e5SPiotr Bronowski 	{	/* AES GCM */
39746825e5SPiotr Bronowski 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
40746825e5SPiotr Bronowski 		{.sym = {
41746825e5SPiotr Bronowski 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
42746825e5SPiotr Bronowski 			{.aead = {
43746825e5SPiotr Bronowski 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
44746825e5SPiotr Bronowski 				.block_size = 16,
45746825e5SPiotr Bronowski 				.key_size = {
46746825e5SPiotr Bronowski 					.min = 16,
47746825e5SPiotr Bronowski 					.max = 32,
48746825e5SPiotr Bronowski 					.increment = 8
49746825e5SPiotr Bronowski 				},
50746825e5SPiotr Bronowski 				.digest_size = {
51746825e5SPiotr Bronowski 					.min = 1,
52746825e5SPiotr Bronowski 					.max = 16,
53746825e5SPiotr Bronowski 					.increment = 1
54746825e5SPiotr Bronowski 				},
55746825e5SPiotr Bronowski 				.aad_size = {
56746825e5SPiotr Bronowski 					.min = 0,
57746825e5SPiotr Bronowski 					.max = 65535,
58746825e5SPiotr Bronowski 					.increment = 1
59746825e5SPiotr Bronowski 				},
60746825e5SPiotr Bronowski 				.iv_size = {
61746825e5SPiotr Bronowski 					.min = AESNI_GCM_IV_LENGTH,
62746825e5SPiotr Bronowski 					.max = AESNI_GCM_IV_LENGTH,
63746825e5SPiotr Bronowski 					.increment = 0
64746825e5SPiotr Bronowski 				}
65746825e5SPiotr Bronowski 			}, }
66746825e5SPiotr Bronowski 		}, }
67746825e5SPiotr Bronowski 	},
68746825e5SPiotr Bronowski 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
69746825e5SPiotr Bronowski };
70746825e5SPiotr Bronowski 
71746825e5SPiotr Bronowski uint8_t pmd_driver_id_aesni_gcm;
72746825e5SPiotr Bronowski 
73746825e5SPiotr Bronowski enum aesni_gcm_key_length {
74746825e5SPiotr Bronowski 	GCM_KEY_128 = 0,
75746825e5SPiotr Bronowski 	GCM_KEY_192,
76746825e5SPiotr Bronowski 	GCM_KEY_256,
77746825e5SPiotr Bronowski 	GCM_NUM_KEY_TYPES
78746825e5SPiotr Bronowski };
79746825e5SPiotr Bronowski 
80746825e5SPiotr Bronowski typedef void (*aesni_gcm_t)(const struct gcm_key_data *gcm_key_data,
81746825e5SPiotr Bronowski 			    struct gcm_context_data *gcm_ctx_data,
82746825e5SPiotr Bronowski 			    uint8_t *out, const uint8_t *in,
83746825e5SPiotr Bronowski 			    uint64_t plaintext_len, const uint8_t *iv,
84746825e5SPiotr Bronowski 			    const uint8_t *aad, uint64_t aad_len,
85746825e5SPiotr Bronowski 			    uint8_t *auth_tag, uint64_t auth_tag_len);
86746825e5SPiotr Bronowski 
87746825e5SPiotr Bronowski typedef void (*aesni_gcm_pre_t)(const void *key,
88746825e5SPiotr Bronowski 				struct gcm_key_data *gcm_data);
89746825e5SPiotr Bronowski 
90746825e5SPiotr Bronowski typedef void (*aesni_gcm_init_t)(const struct gcm_key_data *gcm_key_data,
91746825e5SPiotr Bronowski 				 struct gcm_context_data *gcm_ctx_data,
92746825e5SPiotr Bronowski 				 const uint8_t *iv, uint8_t const *aad,
93746825e5SPiotr Bronowski 				 uint64_t aad_len);
94746825e5SPiotr Bronowski 
95746825e5SPiotr Bronowski typedef void (*aesni_gcm_update_t)(const struct gcm_key_data *gcm_key_data,
96746825e5SPiotr Bronowski 				   struct gcm_context_data *gcm_ctx_data,
97746825e5SPiotr Bronowski 				   uint8_t *out, const uint8_t *in,
98746825e5SPiotr Bronowski 				   uint64_t plaintext_len);
99746825e5SPiotr Bronowski 
100746825e5SPiotr Bronowski typedef void (*aesni_gcm_finalize_t)(const struct gcm_key_data *gcm_key_data,
101746825e5SPiotr Bronowski 				     struct gcm_context_data *gcm_ctx_data,
102746825e5SPiotr Bronowski 				     uint8_t *auth_tag, uint64_t auth_tag_len);
103746825e5SPiotr Bronowski 
104746825e5SPiotr Bronowski typedef void (*aesni_gmac_init_t)(const struct gcm_key_data *gcm_key_data,
105746825e5SPiotr Bronowski 				  struct gcm_context_data *gcm_ctx_data,
106746825e5SPiotr Bronowski 				  const uint8_t *iv, const uint64_t iv_len);
107746825e5SPiotr Bronowski 
108746825e5SPiotr Bronowski typedef void (*aesni_gmac_update_t)(const struct gcm_key_data *gcm_key_data,
109746825e5SPiotr Bronowski 				    struct gcm_context_data *gcm_ctx_data,
110746825e5SPiotr Bronowski 				    const uint8_t *in,
111746825e5SPiotr Bronowski 				    const uint64_t plaintext_len);
112746825e5SPiotr Bronowski 
113746825e5SPiotr Bronowski typedef void (*aesni_gmac_finalize_t)(const struct gcm_key_data *gcm_key_data,
114746825e5SPiotr Bronowski 				      struct gcm_context_data *gcm_ctx_data,
115746825e5SPiotr Bronowski 				      uint8_t *auth_tag,
116746825e5SPiotr Bronowski 				      const uint64_t auth_tag_len);
117746825e5SPiotr Bronowski 
118746825e5SPiotr Bronowski /** GCM operation handlers */
119746825e5SPiotr Bronowski struct aesni_gcm_ops {
120746825e5SPiotr Bronowski 	aesni_gcm_t enc;
121746825e5SPiotr Bronowski 	aesni_gcm_t dec;
122746825e5SPiotr Bronowski 	aesni_gcm_pre_t pre;
123746825e5SPiotr Bronowski 	aesni_gcm_init_t init;
124746825e5SPiotr Bronowski 	aesni_gcm_update_t update_enc;
125746825e5SPiotr Bronowski 	aesni_gcm_update_t update_dec;
126746825e5SPiotr Bronowski 	aesni_gcm_finalize_t finalize_enc;
127746825e5SPiotr Bronowski 	aesni_gcm_finalize_t finalize_dec;
128746825e5SPiotr Bronowski 	aesni_gmac_init_t gmac_init;
129746825e5SPiotr Bronowski 	aesni_gmac_update_t gmac_update;
130746825e5SPiotr Bronowski 	aesni_gmac_finalize_t gmac_finalize;
131746825e5SPiotr Bronowski };
132746825e5SPiotr Bronowski 
133*e578789dSTyler Retzlaff RTE_DEFINE_PER_LCORE(struct aesni_gcm_ops, gcm_ops[GCM_NUM_KEY_TYPES]);
134746825e5SPiotr Bronowski 
135746825e5SPiotr Bronowski struct aesni_gcm_qp_data {
136746825e5SPiotr Bronowski 	struct gcm_context_data gcm_ctx_data;
137746825e5SPiotr Bronowski 	uint8_t temp_digest[DIGEST_LENGTH_MAX];
138746825e5SPiotr Bronowski 	/* *< Buffers used to store the digest generated
139746825e5SPiotr Bronowski 	 * by the driver when verifying a digest provided
140746825e5SPiotr Bronowski 	 * by the user (using authentication verify operation)
141746825e5SPiotr Bronowski 	 */
142746825e5SPiotr Bronowski 	struct aesni_gcm_ops ops[GCM_NUM_KEY_TYPES];
143746825e5SPiotr Bronowski 	/**< Operation Handlers */
144746825e5SPiotr Bronowski };
145746825e5SPiotr Bronowski 
146746825e5SPiotr Bronowski /** AESNI GCM private session structure */
147746825e5SPiotr Bronowski struct aesni_gcm_session {
148746825e5SPiotr Bronowski 	struct {
149746825e5SPiotr Bronowski 		uint16_t length;
150746825e5SPiotr Bronowski 		uint16_t offset;
151746825e5SPiotr Bronowski 	} iv;
152746825e5SPiotr Bronowski 	/**< IV parameters */
153746825e5SPiotr Bronowski 	uint16_t aad_length;
154746825e5SPiotr Bronowski 	/**< AAD length */
155746825e5SPiotr Bronowski 	uint16_t req_digest_length;
156746825e5SPiotr Bronowski 	/**< Requested digest length */
157746825e5SPiotr Bronowski 	uint16_t gen_digest_length;
158746825e5SPiotr Bronowski 	/**< Generated digest length */
159746825e5SPiotr Bronowski 	enum ipsec_mb_operation op;
160746825e5SPiotr Bronowski 	/**< GCM operation type */
161746825e5SPiotr Bronowski 	struct gcm_key_data gdata_key;
162746825e5SPiotr Bronowski 	/**< GCM parameters */
163746825e5SPiotr Bronowski 	enum aesni_gcm_key_length key_length;
164746825e5SPiotr Bronowski 	/** Key Length */
165746825e5SPiotr Bronowski };
166746825e5SPiotr Bronowski 
167746825e5SPiotr Bronowski #endif /* _PMD_AESNI_GCM_PRIV_H_ */
168