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