xref: /dpdk/drivers/crypto/ipsec_mb/pmd_aesni_gcm_priv.h (revision e578789d9886d2688c03db5ee9df926599248abd)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2016-2021 Intel Corporation
3  */
4 
5 #ifndef _PMD_AESNI_GCM_PRIV_H_
6 #define _PMD_AESNI_GCM_PRIV_H_
7 
8 #include "ipsec_mb_private.h"
9 
10 #define AESNI_GCM_IV_LENGTH 12
11 
12 static const struct rte_cryptodev_capabilities aesni_gcm_capabilities[] = {
13 	{	/* AES GMAC (AUTH) */
14 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
15 		{.sym = {
16 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
17 			{.auth = {
18 				.algo = RTE_CRYPTO_AUTH_AES_GMAC,
19 				.block_size = 16,
20 				.key_size = {
21 					.min = 16,
22 					.max = 32,
23 					.increment = 8
24 				},
25 				.digest_size = {
26 					.min = 1,
27 					.max = 16,
28 					.increment = 1
29 				},
30 				.iv_size = {
31 					.min = AESNI_GCM_IV_LENGTH,
32 					.max = AESNI_GCM_IV_LENGTH,
33 					.increment = 0
34 				}
35 			}, }
36 		}, }
37 	},
38 	{	/* AES GCM */
39 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
40 		{.sym = {
41 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
42 			{.aead = {
43 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
44 				.block_size = 16,
45 				.key_size = {
46 					.min = 16,
47 					.max = 32,
48 					.increment = 8
49 				},
50 				.digest_size = {
51 					.min = 1,
52 					.max = 16,
53 					.increment = 1
54 				},
55 				.aad_size = {
56 					.min = 0,
57 					.max = 65535,
58 					.increment = 1
59 				},
60 				.iv_size = {
61 					.min = AESNI_GCM_IV_LENGTH,
62 					.max = AESNI_GCM_IV_LENGTH,
63 					.increment = 0
64 				}
65 			}, }
66 		}, }
67 	},
68 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
69 };
70 
71 uint8_t pmd_driver_id_aesni_gcm;
72 
73 enum aesni_gcm_key_length {
74 	GCM_KEY_128 = 0,
75 	GCM_KEY_192,
76 	GCM_KEY_256,
77 	GCM_NUM_KEY_TYPES
78 };
79 
80 typedef void (*aesni_gcm_t)(const struct gcm_key_data *gcm_key_data,
81 			    struct gcm_context_data *gcm_ctx_data,
82 			    uint8_t *out, const uint8_t *in,
83 			    uint64_t plaintext_len, const uint8_t *iv,
84 			    const uint8_t *aad, uint64_t aad_len,
85 			    uint8_t *auth_tag, uint64_t auth_tag_len);
86 
87 typedef void (*aesni_gcm_pre_t)(const void *key,
88 				struct gcm_key_data *gcm_data);
89 
90 typedef void (*aesni_gcm_init_t)(const struct gcm_key_data *gcm_key_data,
91 				 struct gcm_context_data *gcm_ctx_data,
92 				 const uint8_t *iv, uint8_t const *aad,
93 				 uint64_t aad_len);
94 
95 typedef void (*aesni_gcm_update_t)(const struct gcm_key_data *gcm_key_data,
96 				   struct gcm_context_data *gcm_ctx_data,
97 				   uint8_t *out, const uint8_t *in,
98 				   uint64_t plaintext_len);
99 
100 typedef void (*aesni_gcm_finalize_t)(const struct gcm_key_data *gcm_key_data,
101 				     struct gcm_context_data *gcm_ctx_data,
102 				     uint8_t *auth_tag, uint64_t auth_tag_len);
103 
104 typedef void (*aesni_gmac_init_t)(const struct gcm_key_data *gcm_key_data,
105 				  struct gcm_context_data *gcm_ctx_data,
106 				  const uint8_t *iv, const uint64_t iv_len);
107 
108 typedef void (*aesni_gmac_update_t)(const struct gcm_key_data *gcm_key_data,
109 				    struct gcm_context_data *gcm_ctx_data,
110 				    const uint8_t *in,
111 				    const uint64_t plaintext_len);
112 
113 typedef void (*aesni_gmac_finalize_t)(const struct gcm_key_data *gcm_key_data,
114 				      struct gcm_context_data *gcm_ctx_data,
115 				      uint8_t *auth_tag,
116 				      const uint64_t auth_tag_len);
117 
118 /** GCM operation handlers */
119 struct aesni_gcm_ops {
120 	aesni_gcm_t enc;
121 	aesni_gcm_t dec;
122 	aesni_gcm_pre_t pre;
123 	aesni_gcm_init_t init;
124 	aesni_gcm_update_t update_enc;
125 	aesni_gcm_update_t update_dec;
126 	aesni_gcm_finalize_t finalize_enc;
127 	aesni_gcm_finalize_t finalize_dec;
128 	aesni_gmac_init_t gmac_init;
129 	aesni_gmac_update_t gmac_update;
130 	aesni_gmac_finalize_t gmac_finalize;
131 };
132 
133 RTE_DEFINE_PER_LCORE(struct aesni_gcm_ops, gcm_ops[GCM_NUM_KEY_TYPES]);
134 
135 struct aesni_gcm_qp_data {
136 	struct gcm_context_data gcm_ctx_data;
137 	uint8_t temp_digest[DIGEST_LENGTH_MAX];
138 	/* *< Buffers used to store the digest generated
139 	 * by the driver when verifying a digest provided
140 	 * by the user (using authentication verify operation)
141 	 */
142 	struct aesni_gcm_ops ops[GCM_NUM_KEY_TYPES];
143 	/**< Operation Handlers */
144 };
145 
146 /** AESNI GCM private session structure */
147 struct aesni_gcm_session {
148 	struct {
149 		uint16_t length;
150 		uint16_t offset;
151 	} iv;
152 	/**< IV parameters */
153 	uint16_t aad_length;
154 	/**< AAD length */
155 	uint16_t req_digest_length;
156 	/**< Requested digest length */
157 	uint16_t gen_digest_length;
158 	/**< Generated digest length */
159 	enum ipsec_mb_operation op;
160 	/**< GCM operation type */
161 	struct gcm_key_data gdata_key;
162 	/**< GCM parameters */
163 	enum aesni_gcm_key_length key_length;
164 	/** Key Length */
165 };
166 
167 #endif /* _PMD_AESNI_GCM_PRIV_H_ */
168