xref: /dpdk/examples/fips_validation/fips_dev_self_test.c (revision 2a7bb4fdf61e9edfb7adbaecb50e728b82da9e23)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019 Intel Corporation
3  */
4 
5 #include <rte_cryptodev.h>
6 #include <rte_cryptodev_pmd.h>
7 
8 #include "fips_dev_self_test.h"
9 
10 #define IV_OFF (sizeof(struct rte_crypto_op) + sizeof(struct rte_crypto_sym_op))
11 
12 #define FIPS_DEV_TEST_DATA_MAX_SIZE	8096
13 
14 struct fips_dev_self_test_vector {
15 	const char *name;
16 	enum rte_crypto_sym_xform_type operation_type;
17 
18 	struct {
19 		uint8_t data[64];
20 		uint16_t len;
21 	} digest;
22 
23 	struct {
24 		uint8_t data[256];
25 		uint16_t len;
26 	} key;
27 
28 	struct {
29 		uint8_t data[16];
30 		uint8_t len;
31 	} iv;
32 
33 	union {
34 		struct {
35 			enum rte_crypto_cipher_algorithm algo;
36 		} cipher;
37 
38 		struct {
39 			enum rte_crypto_aead_algorithm algo;
40 			struct {
41 				uint8_t data[FIPS_DEV_TEST_DATA_MAX_SIZE];
42 				uint16_t len;
43 			} aad;
44 		} aead;
45 
46 		struct {
47 			enum rte_crypto_auth_algorithm algo;
48 		} auth;
49 	};
50 
51 	struct {
52 		const uint8_t data[FIPS_DEV_TEST_DATA_MAX_SIZE];
53 		uint16_t len;
54 	} input;
55 
56 	struct {
57 		uint8_t data[FIPS_DEV_TEST_DATA_MAX_SIZE];
58 		uint16_t len;
59 	} output;
60 };
61 
62 #define GET_MBUF_DATA(data, len, m)			\
63 do {							\
64 	len = rte_pktmbuf_pkt_len(m);			\
65 	data = rte_pktmbuf_mtod(m, uint8_t *);		\
66 } while (0)
67 
68 
69 /* <-- SHA-x HMAC --> */
70 static struct fips_dev_self_test_vector
71 SELF_TEST_SHA1_HMAC_test_vector = {
72 		.name = "SELF_TEST_SHA1_HMAC_test_vector",
73 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
74 
75 		.auth = {
76 			.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
77 		},
78 		.input = {
79 			.data = {
80 				0xed, 0xb2, 0xba, 0x09, 0x99, 0x61, 0xd3, 0x8f,
81 				0xd0, 0xa0, 0xa6, 0xa2, 0x35, 0xd6, 0x12, 0x71,
82 				0xcb, 0x4d, 0x49, 0x3b, 0x64, 0xd9, 0xde, 0x13,
83 				0x5c, 0xbb, 0x1f, 0xe0, 0x86, 0xc4, 0xa4, 0xa7,
84 				0x67, 0xbe, 0x28, 0x0d, 0xa2, 0x07, 0x98, 0x17,
85 				0xb4, 0x7f, 0x6a, 0x35, 0xe1, 0xa4, 0x30, 0x7f,
86 				0x6e, 0xfc, 0x6d, 0x3e, 0x11, 0xb4, 0xa7, 0xae,
87 				0xa6, 0x86, 0xbd, 0x02, 0x23, 0xe0, 0x7b, 0xa9,
88 				0xce, 0x42, 0x6c, 0xd0, 0xae, 0xe7, 0xef, 0x28,
89 				0x3f, 0xa9, 0x8d, 0xe9, 0x6a, 0x1f, 0x8a, 0x17,
90 				0xb3, 0x08, 0xba, 0x04, 0xb5, 0xec, 0x96, 0x16,
91 				0xcb, 0x00, 0x8f, 0xca, 0x11, 0x4b, 0xa3, 0xf9,
92 				0x8b, 0x07, 0x2d, 0x5a, 0xa3, 0x4a, 0x01, 0x49,
93 				0xd9, 0xe5, 0xb8, 0xc6, 0xb6, 0x8c, 0x49, 0xc1,
94 				0x01, 0x38, 0xda, 0x95, 0x36, 0xca, 0xd5, 0xd2,
95 				0x34, 0xf1, 0x3d, 0x3f, 0x36, 0x4d, 0x43, 0x1f
96 			},
97 			.len = 128,
98 		},
99 		.key = {
100 			.data = {
101 				0x8d, 0x8d, 0x15, 0xd8, 0xa9, 0x57, 0x9a, 0xdb,
102 				0x2d, 0x62
103 			},
104 			.len = 10,
105 		},
106 		.digest = {
107 			.data = {
108 				0x0c, 0x66, 0x2e, 0x47, 0x93, 0x93, 0x8c, 0xc3,
109 				0x7f, 0x3d, 0x51, 0xd2, 0xb4, 0x05, 0x48, 0xec,
110 				0x55, 0x91, 0x4f, 0x0d
111 			},
112 			.len = 20,
113 		},
114 };
115 
116 static struct fips_dev_self_test_vector
117 SELF_TEST_SHA224_HMAC_test_vector = {
118 		.name = "SELF_TEST_SHA224_HMAC_test_vector",
119 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
120 		.auth = {
121 			.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
122 		},
123 		.input = {
124 			.data = {
125 				0x41, 0x18, 0x43, 0xa2, 0x13, 0x87, 0x84, 0x6f,
126 				0x3b, 0x9e, 0xd5, 0xfc, 0x54, 0x5a, 0xca, 0xdf,
127 				0xa5, 0xb7, 0x03, 0x86, 0xf6, 0x2d, 0xa4, 0xd9,
128 				0xa2, 0x7b, 0x04, 0x1b, 0xee, 0xa3, 0xaa, 0x11,
129 				0x99, 0x36, 0x75, 0x67, 0xb4, 0xd1, 0x1a, 0x4f,
130 				0xb4, 0xe8, 0xd4, 0x6b, 0xc6, 0xc2, 0x56, 0xed,
131 				0x62, 0xc5, 0x05, 0xfd, 0x23, 0xf4, 0x64, 0x5b,
132 				0xd6, 0xb6, 0xcf, 0x45, 0xd1, 0xd9, 0x6d, 0x9b,
133 				0x86, 0xd6, 0x60, 0x41, 0x57, 0x57, 0x3e, 0xc5,
134 				0xac, 0xf6, 0xc5, 0x41, 0x43, 0x48, 0xca, 0x83,
135 				0xc8, 0x1a, 0x73, 0x6c, 0xa6, 0xfa, 0xa6, 0x96,
136 				0x1c, 0xfa, 0xc1, 0x39, 0x93, 0xb0, 0x8c, 0x50,
137 				0x2f, 0x81, 0x6c, 0xf7, 0xa4, 0x20, 0xd9, 0x18,
138 				0x4b, 0x51, 0x11, 0x46, 0x75, 0xf3, 0x0e, 0xe9,
139 				0xff, 0x3d, 0xb6, 0x9c, 0x26, 0x48, 0x53, 0xd3,
140 				0x9d, 0xcd, 0x42, 0xc1, 0xdd, 0x31, 0xef, 0x79
141 
142 			},
143 			.len = 128,
144 		},
145 		.key = {
146 			.data = {
147 				0x37, 0x14, 0x70, 0x78, 0x39, 0xda, 0xf7, 0x91,
148 				0x22, 0xc7, 0x82, 0x41, 0x63, 0x51, 0x38, 0x5e,
149 				0x88, 0xa8, 0x1d, 0x31, 0xc9, 0xf6, 0x41, 0xd8,
150 				0xdc, 0xe5, 0x38, 0xe9, 0x0e, 0x63, 0xc9, 0x58,
151 				0x92, 0xa2, 0xea, 0x9b, 0x19, 0x62, 0xed, 0x0b,
152 				0xa3, 0x72, 0xf4, 0x8e, 0x94, 0x74, 0xaa, 0x73,
153 				0x0a, 0xe2
154 			},
155 			.len = 50,
156 		},
157 		.digest = {
158 			.data = {
159 				0x33, 0xf1, 0x7a, 0xc8, 0xa5, 0xc6, 0xb5, 0x25,
160 				0xdb, 0x8b, 0x86, 0x44, 0xb6, 0xab
161 
162 			},
163 			.len = 14,
164 		},
165 };
166 
167 
168 static struct fips_dev_self_test_vector
169 SELF_TEST_SHA256_HMAC_test_vector = {
170 		.name = "SELF_TEST_SHA256_HMAC_test_vector",
171 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
172 		.auth = {
173 			.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
174 		},
175 		.input = {
176 			.data = {
177 				0x1c, 0x43, 0x96, 0xf7, 0xb7, 0xf9, 0x22, 0x8e,
178 				0x83, 0x2a, 0x13, 0x69, 0x20, 0x02, 0xba, 0x2a,
179 				0xff, 0x43, 0x9d, 0xcb, 0x7f, 0xdd, 0xbf, 0xd4,
180 				0x56, 0xc0, 0x22, 0xd1, 0x33, 0xee, 0x89, 0x03,
181 				0xa2, 0xd4, 0x82, 0x56, 0x2f, 0xda, 0xa4, 0x93,
182 				0xce, 0x39, 0x16, 0xd7, 0x7a, 0x0c, 0x51, 0x44,
183 				0x1d, 0xab, 0x26, 0xf6, 0xb0, 0x34, 0x02, 0x38,
184 				0xa3, 0x6a, 0x71, 0xf8, 0x7f, 0xc3, 0xe1, 0x79,
185 				0xca, 0xbc, 0xa9, 0x48, 0x2b, 0x70, 0x49, 0x71,
186 				0xce, 0x69, 0xf3, 0xf2, 0x0a, 0xb6, 0x4b, 0x70,
187 				0x41, 0x3d, 0x6c, 0x29, 0x08, 0x53, 0x2b, 0x2a,
188 				0x88, 0x8a, 0x9f, 0xc2, 0x24, 0xca, 0xe1, 0x36,
189 				0x5d, 0xa4, 0x10, 0xb6, 0xf2, 0xe2, 0x98, 0x90,
190 				0x4b, 0x63, 0xb4, 0xa4, 0x17, 0x26, 0x32, 0x18,
191 				0x35, 0xa4, 0x77, 0x4d, 0xd0, 0x63, 0xc2, 0x11,
192 				0xcf, 0xc8, 0xb5, 0x16, 0x6c, 0x2d, 0x11, 0xa2
193 			},
194 			.len = 128,
195 		},
196 		.key = {
197 			.data = {
198 				0x54, 0x48, 0x99, 0x8f, 0x9d, 0x8f, 0x98, 0x53,
199 				0x4a, 0xdd, 0xf0, 0xc8, 0xba, 0x63, 0x1c, 0x49,
200 				0x6b, 0xf8, 0xa8, 0x00, 0x6c, 0xbb, 0x46, 0xad,
201 				0x15, 0xfa, 0x1f, 0xa2, 0xf5, 0x53, 0x67, 0x12,
202 				0x0c, 0x19, 0x34, 0x8c, 0x3a, 0xfa, 0x90, 0xc3
203 			},
204 			.len = 40,
205 		},
206 		.digest = {
207 			.data = {
208 				0x7e, 0x8c, 0xba, 0x9d, 0xd9, 0xf0, 0x6e, 0xbd,
209 				0xd7, 0xf9, 0x2e, 0x0f, 0x1a, 0x67, 0xc7, 0xf4,
210 				0xdf, 0x52, 0x69, 0x3c, 0x21, 0x2b, 0xdd, 0x84,
211 				0xf6, 0x73, 0x70, 0xb3, 0x51, 0x53, 0x3c, 0x6c
212 			},
213 			.len = 32,
214 		},
215 };
216 
217 /* HMAC count=34 L=48 SHA384 GENERATE*/
218 static struct fips_dev_self_test_vector
219 SELF_TEST_SHA384_HMAC_test_vector = {
220 		.name = "SELF_TEST_SHA384_HMAC_test_vector",
221 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
222 		.auth = {
223 			.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
224 		},
225 		.input = {
226 			.data = {
227 				0xf5, 0x10, 0x86, 0xfe, 0x78, 0x15, 0x0f, 0xe4,
228 				0x8b, 0xd1, 0x41, 0x5a, 0x47, 0x85, 0xac, 0xc0,
229 				0x5a, 0xb8, 0x0e, 0xf0, 0x0b, 0x29, 0x75, 0xce,
230 				0x78, 0x07, 0xa4, 0x21, 0x22, 0x64, 0xb8, 0xa1,
231 				0xac, 0xe8, 0x0b, 0x50, 0xe0, 0xc2, 0x59, 0x0e,
232 				0xf3, 0xe4, 0x21, 0x68, 0x0a, 0x70, 0x4e, 0xb2,
233 				0xfc, 0x6d, 0x17, 0x55, 0x5a, 0xbf, 0x24, 0x69,
234 				0xad, 0x56, 0xf2, 0x87, 0xfe, 0xa5, 0x78, 0xd8,
235 				0x9c, 0x56, 0x0b, 0x72, 0x19, 0x3c, 0x7f, 0xe5,
236 				0x96, 0x89, 0x8f, 0x10, 0x40, 0x41, 0x7e, 0x3a,
237 				0x1b, 0xee, 0xff, 0x5e, 0xff, 0x96, 0x53, 0xc5,
238 				0xe0, 0xea, 0xb1, 0xda, 0x52, 0xc0, 0xea, 0x3b,
239 				0x4b, 0xc3, 0x4d, 0x0c, 0x2b, 0x69, 0xc8, 0x90,
240 				0xfb, 0x26, 0x51, 0xfa, 0xf2, 0xe0, 0x84, 0x80,
241 				0x3e, 0xa2, 0x8e, 0xb2, 0x01, 0x94, 0x49, 0x0a,
242 				0x99, 0x2b, 0xa8, 0xc4, 0x24, 0x9d, 0x56, 0xef
243 			},
244 			.len = 128,
245 		},
246 		.key = {
247 			.data = {
248 				0x91, 0x7a, 0x69, 0x8c, 0x82, 0xf4, 0x4f, 0x19,
249 				0x57, 0x3b, 0x64, 0x5c, 0x48, 0x79, 0xb8, 0x73,
250 				0x0b, 0x58, 0xdf, 0xf4, 0xed, 0xc6, 0xa0, 0xd3,
251 				0x21, 0xf5, 0xf1, 0x86, 0x58, 0xa5, 0x24, 0x66,
252 				0x92, 0xa5, 0x5b, 0x59, 0x33, 0x97, 0x41, 0xae,
253 				0x59, 0xf5, 0xfc, 0x48, 0x6d, 0x51, 0x5d, 0xff,
254 				0xf8, 0xe1
255 			},
256 			.len = 50,
257 		},
258 		.digest = {
259 			.data = {
260 				0x77, 0xbf, 0x56, 0x15, 0xec, 0x52, 0xf7, 0x06,
261 				0xca, 0x74, 0x64, 0x01, 0xe9, 0xfd, 0xe4, 0x3f,
262 				0x15, 0x60, 0x52, 0x37, 0xe5, 0x50, 0xb9, 0x3a,
263 				0x84, 0x72, 0xfd, 0x14, 0x4f, 0xc3, 0x9e, 0x5e,
264 				0xca, 0x0f, 0xe8, 0x90, 0x83, 0x88, 0x28, 0xa0
265 			},
266 			.len = 40,
267 		},
268 };
269 
270 /* HMAC count=28 L=64 SHA512 GENERATE*/
271 static struct fips_dev_self_test_vector
272 SELF_TEST_SHA512_HMAC_test_vector = {
273 		.name = "SELF_TEST_SHA512_HMAC_test_vector",
274 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
275 		.auth = {
276 			.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
277 		},
278 		.input = {
279 			.data = {
280 				0x0a, 0x33, 0x1c, 0xe2, 0x00, 0x89, 0xb2, 0x9e,
281 				0x94, 0xb2, 0xc5, 0xf5, 0x18, 0xc8, 0xdb, 0xea,
282 				0xd4, 0x04, 0x17, 0xa2, 0xa8, 0xd5, 0x00, 0x18,
283 				0xf3, 0x2f, 0x85, 0x12, 0xb3, 0x26, 0x3d, 0x54,
284 				0xed, 0xbb, 0xf3, 0x13, 0x4f, 0xf6, 0x61, 0xac,
285 				0x14, 0x35, 0x3c, 0x96, 0x28, 0xc3, 0x71, 0x95,
286 				0x8c, 0xac, 0xaf, 0x31, 0xfd, 0xd0, 0x25, 0x67,
287 				0xd0, 0x37, 0x8d, 0x9e, 0x21, 0xa4, 0x69, 0xdd,
288 				0x2c, 0x6d, 0x8c, 0x3a, 0xfb, 0x89, 0xdd, 0x96,
289 				0x42, 0xeb, 0x58, 0x87, 0x87, 0x0e, 0x55, 0x96,
290 				0x85, 0xd2, 0x0d, 0xab, 0xd3, 0x86, 0x5a, 0xc5,
291 				0xc1, 0x46, 0xbe, 0xee, 0x83, 0x87, 0xa7, 0x6f,
292 				0x91, 0xf0, 0xf1, 0x40, 0x4d, 0x6c, 0xad, 0xc2,
293 				0xe6, 0x7d, 0x21, 0xb0, 0x7d, 0xd3, 0x0f, 0x53,
294 				0x87, 0x1d, 0x3b, 0xf6, 0x73, 0x1f, 0x27, 0x9a,
295 				0x8c, 0x04, 0x21, 0xeb, 0x20, 0xf6, 0x7f, 0x72
296 			},
297 			.len = 128,
298 		},
299 		.key = {
300 			.data = {
301 				0x39, 0xb8, 0x77, 0xb8, 0xe8, 0x2e, 0xcb, 0xd9,
302 				0x74, 0x03, 0x25, 0x82, 0x8f, 0xaf, 0x67, 0x21,
303 				0xc1, 0x29, 0x04, 0x6e, 0xb0, 0x13, 0x61, 0x44,
304 				0xa0, 0x31, 0x82, 0xb1, 0x36, 0x20, 0xe2, 0x49,
305 				0x81, 0x45, 0xa2, 0xbf, 0x3b, 0x03, 0xe6, 0xb6,
306 				0x4b, 0x31, 0x7d, 0xd4, 0x8f, 0xcb, 0xc0, 0x18,
307 				0xd9, 0xe7, 0xbc, 0x6e, 0x37, 0xeb, 0x93, 0x81,
308 				0x78, 0xfe, 0x1f, 0xd1, 0xeb, 0xbc, 0xd9, 0x05,
309 				0x6a, 0x2e, 0xf9, 0x82, 0x97, 0xf9, 0xdf, 0x3c,
310 				0x66, 0xd5, 0xb2, 0xcc, 0xdc, 0x41, 0x47, 0xc4,
311 				0x16, 0x76, 0x44, 0x3f, 0x8c, 0x99, 0x85, 0xbc,
312 				0x97, 0x34, 0xbe, 0x2c, 0x31, 0xe7, 0x62, 0x49,
313 				0xfc, 0x5b, 0xc4, 0x2a
314 			},
315 			.len = 100,
316 		},
317 		.digest = {
318 			.data = {
319 				0x97, 0x16, 0x8f, 0x55, 0x13, 0xc2, 0xe9, 0xbc,
320 				0x4b, 0xc5, 0x25, 0xce, 0x27, 0x03, 0x74, 0x0b,
321 				0xce, 0x1a, 0x06, 0xec, 0xfe, 0x99, 0xa5, 0x70,
322 				0xac, 0x66, 0xc8, 0x3e, 0xde, 0x96, 0x67, 0xcc,
323 				0x07, 0xed, 0xf6, 0x64, 0x61, 0x7c, 0xe5, 0x3c
324 			},
325 			.len = 40,
326 		},
327 };
328 
329 /* <-- AES CMAC --> */
330 static struct fips_dev_self_test_vector
331 SELF_TEST_AES_CMAC_test_vector = {
332 		.name = "SELF_TEST_AES_CMAC_test_vector",
333 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
334 		.auth = {
335 			.algo = RTE_CRYPTO_AUTH_AES_CMAC,
336 		},
337 		.input = {
338 			.data = {
339 				0x57, 0x88, 0xf6, 0x1e, 0x02, 0x30, 0x47, 0x91,
340 				0xb5, 0x2f, 0x40, 0x05, 0x7a, 0xbb, 0x4e, 0x04,
341 				0x46, 0x40, 0x3e, 0xf3, 0x74, 0x02, 0x53, 0xdf,
342 				0x72, 0x05, 0x96, 0x79, 0xbb, 0x2a, 0x6e, 0x5e,
343 				0x05, 0x9a, 0x70, 0x9c, 0xbb
344 			},
345 			.len = 37,
346 		},
347 		.key = {
348 			.data = {
349 				0x18, 0x42, 0x15, 0x14, 0x5d, 0xa4, 0x9d, 0xb4,
350 				0x17, 0xe8, 0xbd, 0xd5, 0x73, 0xd6, 0x28, 0x2d
351 			},
352 			.len = 16,
353 		},
354 		.digest = {
355 			.data = {
356 				0x8d, 0xa8, 0xcc, 0xa9, 0xb3, 0x6f, 0x68, 0x57,
357 				0x1c, 0x6c, 0x0e, 0x40, 0xa3, 0xf4, 0x10
358 			},
359 			.len = 15,
360 		},
361 };
362 
363 /* <-- AES CCM --> */
364 static struct fips_dev_self_test_vector
365 SELF_TEST_AES128_CCM_test_vector = {
366 		.name = "SELF_TEST_AES128_CCM_test_vector",
367 		.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,
368 		.iv = {
369 			.data = {
370 				0x00, 0x50, 0x30, 0xF1, 0x84, 0x44, 0x08, 0xB5,
371 				0x03, 0x97, 0x76, 0xE7, 0x0C
372 			},
373 			.len = 13,
374 		},
375 		.aead = {
376 			.algo = RTE_CRYPTO_AEAD_AES_CCM,
377 			.aad = {
378 				.data = {
379 					/* 18 bytes padding for AAD */
380 					0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 					0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 					0x00, 0x00,
383 					0x08, 0x40, 0x0F, 0xD2, 0xE1, 0x28, 0xA5, 0x7C,
384 					0x50, 0x30, 0xF1, 0x84, 0x44, 0x08, 0xAB, 0xAE,
385 					0xA5, 0xB8, 0xFC, 0xBA, 0x00, 0x00
386 				},
387 				.len = 22,
388 			},
389 		},
390 		.input = {
391 			.data = {
392 				0xF8, 0xBA, 0x1A, 0x55, 0xD0, 0x2F, 0x85, 0xAE,
393 				0x96, 0x7B, 0xB6, 0x2F, 0xB6, 0xCD, 0xA8, 0xEB,
394 				0x7E, 0x78, 0xA0, 0x50
395 			},
396 			.len = 20,
397 		},
398 		.key = {
399 			.data = {
400 				0xC9, 0x7C, 0x1F, 0x67, 0xCE, 0x37, 0x11, 0x85,
401 				0x51, 0x4A, 0x8A, 0x19, 0xF2, 0xBD, 0xD5, 0x2F
402 			},
403 			.len = 16,
404 		},
405 		.output = {
406 			.data = {
407 				0xF3, 0xD0, 0xA2, 0xFE, 0x9A, 0x3D, 0xBF, 0x23,
408 				0x42, 0xA6, 0x43, 0xE4, 0x32, 0x46, 0xE8, 0x0C,
409 				0x3C, 0x04, 0xD0, 0x19
410 			},
411 			.len = 20,
412 		},
413 		.digest = {
414 			.data = {
415 				0x78, 0x45, 0xCE, 0x0B, 0x16, 0xF9, 0x76, 0x23
416 			},
417 			.len = 8,
418 		},
419 };
420 
421 /* <-- AES CBC --> */
422 static struct fips_dev_self_test_vector
423 SELF_TEST_AES128_CBC_test_vector = {
424 		.name = "SELF_TEST_AES128_CBC_test_vector",
425 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
426 
427 		.iv = {
428 			.data = {
429 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
430 				0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
431 			},
432 			.len = 16,
433 		},
434 		.cipher = {
435 			.algo = RTE_CRYPTO_CIPHER_AES_CBC,
436 		},
437 		.input = {
438 			.data = {
439 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
440 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
441 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
442 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
443 			},
444 			.len = 32,
445 		},
446 		.key = {
447 			.data = {
448 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
449 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
450 			},
451 			.len = 16,
452 		},
453 		.output = {
454 			.data = {
455 				0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
456 				0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
457 				0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
458 				0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
459 			},
460 			.len = 32,
461 		},
462 };
463 
464 static struct fips_dev_self_test_vector
465 SELF_TEST_AES192_CBC_test_vector = {
466 		.name = "SELF_TEST_AES192_CBC_test_vector",
467 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
468 
469 		.iv = {
470 			.data = {
471 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
472 				0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
473 			},
474 			.len = 16,
475 		},
476 		.cipher = {
477 			.algo = RTE_CRYPTO_CIPHER_AES_CBC,
478 		},
479 		.input = {
480 			.data = {
481 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
482 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
483 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
484 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
485 			},
486 			.len = 32,
487 		},
488 		.key = {
489 			.data = {
490 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
491 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,
492 				0xD4, 0xC3, 0xA3, 0xAA, 0x33, 0x62, 0x61, 0xE0
493 			},
494 			.len = 24,
495 		},
496 		.output = {
497 			.data = {
498 				0x45, 0xEE, 0x9A, 0xEA, 0x3C, 0x03, 0xFC, 0x4C,
499 				0x84, 0x36, 0xB0, 0xDA, 0xB0, 0xDC, 0xF3, 0x5B,
500 				0x75, 0xA7, 0xBE, 0x0E, 0xC0, 0x8D, 0x6C, 0xF8,
501 				0xC1, 0x0F, 0xD0, 0x35, 0x1D, 0x82, 0xAE, 0x7C,
502 			},
503 			.len = 32,
504 		},
505 };
506 
507 /* AES-256 CBC ENCRYPT*/
508 static struct fips_dev_self_test_vector
509 SELF_TEST_AES256_CBC_test_vector = {
510 		.name = "SELF_TEST_AES256_CBC_test_vector",
511 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
512 
513 		.iv = {
514 			.data = {
515 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
516 				0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
517 			},
518 			.len = 16,
519 		},
520 		.cipher = {
521 			.algo = RTE_CRYPTO_CIPHER_AES_CBC,
522 		},
523 		.input = {
524 			.data = {
525 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
526 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
527 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
528 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
529 			},
530 			.len = 32,
531 		},
532 		.key = {
533 			.data = {
534 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
535 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,
536 				0xD4, 0xC3, 0xA3, 0xAA, 0x33, 0x62, 0x61, 0xE0,
537 				0x37, 0x07, 0xB8, 0x23, 0xA2, 0xA3, 0xB5, 0x8D
538 			},
539 			.len = 32,
540 		},
541 		.output = {
542 			.data = {
543 				0xF3, 0xDD, 0xF0, 0x0B, 0xFF, 0xA2, 0x6A, 0x04,
544 				0xBE, 0xDA, 0x52, 0xA6, 0xFE, 0x6B, 0xA6, 0xA7,
545 				0x48, 0x1D, 0x7D, 0x98, 0x65, 0xDB, 0xEF, 0x06,
546 				0x26, 0xB5, 0x8E, 0xEB, 0x05, 0x0E, 0x77, 0x98,
547 			},
548 			.len = 32,
549 		},
550 };
551 
552 /* DES-128 CBC ENCRYPT*/
553 static struct fips_dev_self_test_vector
554 SELF_TEST_3DES_2KEY_CBC_test_vector = {
555 		.name = "SELF_TEST_3DES_2KEY_CBC_test_vector",
556 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
557 		.iv = {
558 			.data = {
559 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
560 			},
561 			.len = 8,
562 		},
563 		.cipher = {
564 			.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
565 		},
566 		.input = {
567 			.data = {
568 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
569 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
570 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
571 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
572 			},
573 			.len = 32,
574 		},
575 		.key = {
576 			.data = {
577 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
578 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,
579 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2
580 			},
581 			.len = 24,
582 		},
583 		.output = {
584 			.data = {
585 				0x28, 0x2a, 0xff, 0x15, 0x5c, 0xdf, 0xd9, 0x6b,
586 				0x54, 0xbc, 0x7b, 0xfb, 0xc5, 0x64, 0x4d, 0xdd,
587 				0x3e, 0xf2, 0x9e, 0xb7, 0x53, 0x65, 0x37, 0x05,
588 				0xe0, 0xdf, 0xae, 0xf7, 0xc9, 0x27, 0xe4, 0xec,
589 			},
590 			.len = 32,
591 		},
592 };
593 
594 static struct fips_dev_self_test_vector
595 SELF_TEST_3DES_3KEY_CBC_test_vector = {
596 		.name = "SELF_TEST_3DES_3KEY_CBC_test_vector",
597 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
598 
599 		.iv = {
600 			.data = {
601 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
602 			},
603 			.len = 8,
604 		},
605 		.cipher = {
606 			.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
607 		},
608 		.input = {
609 			.data = {
610 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
611 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
612 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
613 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
614 			},
615 			.len = 32,
616 		},
617 		.key = {
618 			.data = {
619 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
620 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,
621 				0xD4, 0xC3, 0xA3, 0xAA, 0x33, 0x62, 0x61, 0xE0
622 			},
623 			.len = 24,
624 		},
625 		.output = {
626 			.data = {
627 				0xd0, 0xc9, 0xdc, 0x51, 0x29, 0x97, 0x03, 0x64,
628 				0xcd, 0x22, 0xba, 0x3d, 0x2b, 0xbc, 0x21, 0x37,
629 				0x7b, 0x1e, 0x29, 0x23, 0xeb, 0x51, 0x6e, 0xac,
630 				0xbe, 0x5b, 0xd3, 0x67, 0xe0, 0x3f, 0xc3, 0xb5,
631 			},
632 			.len = 32,
633 		},
634 };
635 
636 /* <-- AES GCM --> */
637 static struct fips_dev_self_test_vector
638 SELF_TEST_AES128_GCM_encrypt_test_vector = {
639 		.name = "SELF_TEST_AES128_GCM_encrypt_test_vector",
640 		.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,
641 
642 		.iv = {
643 			.data = {
644 				0x5a, 0xdb, 0x96, 0x09, 0xdb, 0xae, 0xb5, 0x8c,
645 				0xbd, 0x6e, 0x72, 0x75
646 			},
647 			.len = 12,
648 		},
649 		.aead = {
650 			.algo = RTE_CRYPTO_AEAD_AES_GCM,
651 			.aad = {
652 				.data = {
653 					0x88, 0x31, 0x9d, 0x6e, 0x1d, 0x3f, 0xfa, 0x5f,
654 					0x98, 0x71, 0x99, 0x16, 0x6c, 0x8a, 0x9b, 0x56,
655 					0xc2, 0xae, 0xba, 0x5a
656 				},
657 				.len = 20,
658 			},
659 		},
660 		.input = {
661 			.data = {
662 				0x7c, 0x0e, 0x88, 0xc8, 0x88, 0x99, 0xa7, 0x79,
663 				0x22, 0x84, 0x65, 0x07, 0x47, 0x97, 0xcd, 0x4c,
664 				0x2e, 0x14, 0x98, 0xd2, 0x59, 0xb5, 0x43, 0x90,
665 				0xb8, 0x5e, 0x3e, 0xef, 0x1c, 0x02, 0xdf, 0x60,
666 				0xe7, 0x43, 0xf1, 0xb8, 0x40, 0x38, 0x2c, 0x4b,
667 				0xcc, 0xaf, 0x3b, 0xaf, 0xb4, 0xca, 0x84, 0x29,
668 				0xbe, 0xa0, 0x63
669 			},
670 			.len = 51,
671 		},
672 		.key = {
673 			.data = {
674 				0xfe, 0x47, 0xfc, 0xce, 0x5f, 0xc3, 0x26, 0x65,
675 				0xd2, 0xae, 0x39, 0x9e, 0x4e, 0xec, 0x72, 0xba
676 			},
677 			.len = 16,
678 		},
679 		.output = {
680 			.data = {
681 				0x98, 0xf4, 0x82, 0x6f, 0x05, 0xa2, 0x65, 0xe6,
682 				0xdd, 0x2b, 0xe8, 0x2d, 0xb2, 0x41, 0xc0, 0xfb,
683 				0xbb, 0xf9, 0xff, 0xb1, 0xc1, 0x73, 0xaa, 0x83,
684 				0x96, 0x4b, 0x7c, 0xf5, 0x39, 0x30, 0x43, 0x73,
685 				0x63, 0x65, 0x25, 0x3d, 0xdb, 0xc5, 0xdb, 0x87,
686 				0x78, 0x37, 0x14, 0x95, 0xda, 0x76, 0xd2, 0x69,
687 				0xe5, 0xdb, 0x3e
688 			},
689 			.len = 51,
690 		},
691 		.digest = {
692 			.data = {
693 				0x29, 0x1e, 0xf1, 0x98, 0x2e, 0x4d, 0xef, 0xed,
694 				0xaa, 0x22, 0x49, 0xf8, 0x98, 0x55, 0x6b, 0x47
695 			},
696 			.len = 16,
697 		},
698 };
699 
700 static struct fips_dev_self_test_vector
701 SELF_TEST_AES192_GCM_encrypt_test_vector = {
702 		.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,
703 		.name = "SELF_TEST_AES192_GCM_encrypt_test_vector",
704 		.iv = {
705 			.data = {
706 				0x0b, 0xd4, 0x4f, 0xf4, 0xd2, 0x0c, 0x15, 0xd0,
707 				0x4f, 0xc6, 0x1e, 0xe7
708 			},
709 			.len = 12,
710 		},
711 		.aead = {
712 			.algo = RTE_CRYPTO_AEAD_AES_GCM,
713 			.aad = {
714 				.data = {
715 					0x9e, 0xa4, 0x2c, 0x50, 0xa7, 0xfd, 0xb8, 0x5e,
716 					0x14, 0x1a, 0xa0, 0x84, 0xb4, 0x6b, 0xde, 0x12
717 				},
718 				.len = 16,
719 			},
720 		},
721 		.input = {
722 			.data = {
723 				0x56, 0x7c, 0xcb, 0x3f, 0xa0, 0xdb, 0x89, 0x70,
724 				0x8a, 0xf3, 0xff, 0x2b, 0xb0, 0x29, 0xdd, 0xec,
725 				0x52, 0xc6, 0x69, 0x47, 0x58, 0x5d, 0x29, 0x1a,
726 				0x28, 0x56, 0x4b, 0xf5, 0x6d, 0xb7, 0x06, 0xf7
727 			},
728 			.len = 32,
729 		},
730 		.key = {
731 			.data = {
732 				0x0d, 0x4a, 0x90, 0x0d, 0x1b, 0x0b, 0xb5, 0xb7,
733 				0xbe, 0x24, 0x38, 0xc2, 0xba, 0x48, 0xfc, 0x45,
734 				0x13, 0x4c, 0xc1, 0x98, 0x10, 0x8c, 0xf8, 0x85
735 			},
736 			.len = 24,
737 		},
738 		.output = {
739 			.data = {
740 				0x2f, 0x8a, 0x42, 0xcd, 0x18, 0x3b, 0x03, 0x14,
741 				0xfd, 0x20, 0xa3, 0xd9, 0x7d, 0x9e, 0x0c, 0x52,
742 				0x17, 0xb0, 0xf0, 0x88, 0xd2, 0xca, 0x87, 0xa8,
743 				0x29, 0x0d, 0x4b, 0xae, 0x69, 0xad, 0x83, 0xf5
744 			},
745 			.len = 32,
746 		},
747 		.digest = {
748 			.data = {
749 				0xde, 0x41, 0x45, 0x92, 0xd7, 0x7f, 0x2f, 0x0b,
750 				0x50, 0xdf, 0x4a, 0xec, 0x71, 0x4f, 0xad, 0x43
751 			},
752 			.len = 16,
753 		},
754 };
755 
756 static struct fips_dev_self_test_vector
757 SELF_TEST_AES256_GCM_encrypt_test_vector = {
758 		.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,
759 		.name = "SELF_TEST_AES256_GCM_encrypt_test_vector",
760 		.iv = {
761 			.data = {
762 				0x5c, 0x1b, 0x21, 0xc8, 0x99, 0x8e, 0xd6, 0x29,
763 				0x90, 0x06, 0xd3, 0xf9
764 			},
765 			.len = 12,
766 		},
767 		.aead = {
768 			.algo = RTE_CRYPTO_AEAD_AES_GCM,
769 			.aad = {
770 				.data = {
771 					0x22, 0xed, 0x23, 0x59, 0x46, 0x23, 0x5a, 0x85,
772 					0xa4, 0x5b, 0xc5, 0xfa, 0xd7, 0x14, 0x0b, 0xfa
773 				},
774 				.len = 16,
775 			},
776 		},
777 		.input = {
778 			.data = {
779 				0xad, 0x42, 0x60, 0xe3, 0xcd, 0xc7, 0x6b, 0xcc,
780 				0x10, 0xc7, 0xb2, 0xc0, 0x6b, 0x80, 0xb3, 0xbe,
781 				0x94, 0x82, 0x58, 0xe5, 0xef, 0x20, 0xc5, 0x08,
782 				0xa8, 0x1f, 0x51, 0xe9, 0x6a, 0x51, 0x83, 0x88
783 			},
784 			.len = 32,
785 		},
786 		.key = {
787 			.data = {
788 				0x37, 0xcc, 0xdb, 0xa1, 0xd9, 0x29, 0xd6, 0x43,
789 				0x6c, 0x16, 0xbb, 0xa5, 0xb5, 0xff, 0x34, 0xde,
790 				0xec, 0x88, 0xed, 0x7d, 0xf3, 0xd1, 0x5d, 0x0f,
791 				0x4d, 0xdf, 0x80, 0xc0, 0xc7, 0x31, 0xee, 0x1f
792 			},
793 			.len = 32,
794 		},
795 		.output = {
796 			.data = {
797 				0x3b, 0x33, 0x5f, 0x8b, 0x08, 0xd3, 0x3c, 0xcd,
798 				0xca, 0xd2, 0x28, 0xa7, 0x47, 0x00, 0xf1, 0x00,
799 				0x75, 0x42, 0xa4, 0xd1, 0xe7, 0xfc, 0x1e, 0xbe,
800 				0x3f, 0x44, 0x7f, 0xe7, 0x1a, 0xf2, 0x98, 0x16
801 			},
802 			.len = 32,
803 		},
804 		.digest = {
805 			.data = {
806 				0x1f, 0xbf, 0x49, 0xcc, 0x46, 0xf4, 0x58, 0xbf,
807 				0x6e, 0x88, 0xf6, 0x37, 0x09, 0x75, 0xe6, 0xd4
808 			},
809 			.len = 16,
810 		},
811 };
812 
813 
814 /* <-- AES CTR --> */
815 static struct fips_dev_self_test_vector
816 SELF_TEST_AES128_CTR_test_vector = {
817 		.name = "SELF_TEST_AES128_CTR_test_vector",
818 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
819 
820 		.iv = {
821 			.data = {
822 				0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
823 				0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
824 			},
825 			.len = 16,
826 		},
827 		.cipher = {
828 			.algo = RTE_CRYPTO_CIPHER_AES_CTR,
829 		},
830 		.input = {
831 			.data = {
832 				0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
833 				0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
834 				0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
835 				0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
836 			},
837 			.len = 32,
838 		},
839 		.key = {
840 			.data = {
841 				0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
842 				0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
843 			},
844 			.len = 16,
845 		},
846 		.output = {
847 			.data = {
848 				0x87, 0x4D, 0x61, 0x91, 0xB6, 0x20, 0xE3, 0x26,
849 				0x1B, 0xEF, 0x68, 0x64, 0x99, 0x0D, 0xB6, 0xCE,
850 				0x98, 0x06, 0xF6, 0x6B, 0x79, 0x70, 0xFD, 0xFF,
851 				0x86, 0x17, 0x18, 0x7B, 0xB9, 0xFF, 0xFD, 0xFF,
852 			},
853 			.len = 32,
854 		},
855 };
856 
857 static struct fips_dev_self_test_vector
858 SELF_TEST_AES192_CTR_test_vector = {
859 		.name = "SELF_TEST_AES192_CTR_test_vector",
860 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
861 
862 		.iv = {
863 			.data = {
864 				0x3F, 0x69, 0xA8, 0xCD, 0xE8, 0xF0, 0xEF, 0x40,
865 				0xB8, 0x7A, 0x4B, 0xED, 0x2B, 0xAF, 0xBF, 0x57
866 			},
867 			.len = 16,
868 		},
869 		.cipher = {
870 			.algo = RTE_CRYPTO_CIPHER_AES_CTR,
871 		},
872 		.input = {
873 			.data = {
874 				0x01, 0x0F, 0x10, 0x1F, 0x20, 0x1C, 0x0E, 0xB8,
875 				0xFB, 0x5C, 0xCD, 0xCC, 0x1F, 0xF9, 0xAF, 0x0B,
876 				0x95, 0x03, 0x74, 0x99, 0x49, 0xE7, 0x62, 0x55,
877 				0xDA, 0xEA, 0x13, 0x20, 0x1D, 0xC6, 0xCC, 0xCC,
878 			},
879 			.len = 32,
880 		},
881 		.key = {
882 			.data = {
883 				0xCB, 0xC5, 0xED, 0x5B, 0xE7, 0x7C, 0xBD, 0x8C,
884 				0x50, 0xD9, 0x30, 0xF2, 0xB5, 0x6A, 0x0E, 0x5F,
885 				0xAA, 0xAE, 0xAD, 0xA2, 0x1F, 0x49, 0x52, 0xD4
886 			},
887 			.len = 24,
888 		},
889 		.output = {
890 			.data = {
891 				0x4A, 0x6C, 0xC8, 0xCC, 0x96, 0x2A, 0x13, 0x84,
892 				0x1C, 0x36, 0x88, 0xE9, 0xE5, 0x94, 0x70, 0xB2,
893 				0x14, 0x5B, 0x13, 0x80, 0xEA, 0xD8, 0x8D, 0x37,
894 				0xFD, 0x70, 0xA8, 0x83, 0xE8, 0x2B, 0x88, 0x1E,
895 			},
896 			.len = 32,
897 		},
898 };
899 
900 static struct fips_dev_self_test_vector
901 SELF_TEST_AES256_CTR_test_vector = {
902 		.name = "SELF_TEST_AES256_CTR_test_vector",
903 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
904 
905 		.iv = {
906 			.data = {
907 				0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
908 				0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
909 			},
910 			.len = 16,
911 		},
912 		.cipher = {
913 			.algo = RTE_CRYPTO_CIPHER_AES_CTR,
914 		},
915 		.input = {
916 			.data = {
917 				0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
918 				0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
919 				0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
920 				0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
921 			},
922 			.len = 32,
923 		},
924 		.key = {
925 			.data = {
926 				0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
927 				0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
928 				0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
929 				0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4
930 			},
931 			.len = 32,
932 		},
933 		.output = {
934 			.data = {
935 				0x60, 0x1E, 0xC3, 0x13, 0x77, 0x57, 0x89, 0xA5,
936 				0xB7, 0xA7, 0xF5, 0x04, 0xBB, 0xF3, 0xD2, 0x28,
937 				0xF4, 0x43, 0xE3, 0xCA, 0x4D, 0x62, 0xB5, 0x9A,
938 				0xCA, 0x84, 0xE9, 0x90, 0xCA, 0xCA, 0xF5, 0xC5,
939 			},
940 			.len = 32,
941 		},
942 };
943 
944 
945 struct fips_dev_self_test_vector
946 *self_test_vectors[] = {
947 		&SELF_TEST_AES128_CBC_test_vector,
948 		&SELF_TEST_AES192_CBC_test_vector,
949 		&SELF_TEST_AES256_CBC_test_vector,
950 		&SELF_TEST_3DES_2KEY_CBC_test_vector,
951 		&SELF_TEST_3DES_3KEY_CBC_test_vector,
952 		&SELF_TEST_AES128_CCM_test_vector,
953 		&SELF_TEST_SHA1_HMAC_test_vector,
954 		&SELF_TEST_SHA224_HMAC_test_vector,
955 		&SELF_TEST_SHA256_HMAC_test_vector,
956 		&SELF_TEST_SHA384_HMAC_test_vector,
957 		&SELF_TEST_SHA512_HMAC_test_vector,
958 		&SELF_TEST_AES_CMAC_test_vector,
959 		&SELF_TEST_AES128_GCM_encrypt_test_vector,
960 		&SELF_TEST_AES192_GCM_encrypt_test_vector,
961 		&SELF_TEST_AES256_GCM_encrypt_test_vector,
962 		&SELF_TEST_AES128_CTR_test_vector,
963 		&SELF_TEST_AES192_CTR_test_vector,
964 		&SELF_TEST_AES256_CTR_test_vector,
965 };
966 
967 struct fips_dev_auto_test_env {
968 	struct rte_mempool *mpool;
969 	struct rte_mempool *op_pool;
970 	struct rte_mempool *sess_pool;
971 	struct rte_mempool *sess_priv_pool;
972 	struct rte_mbuf *mbuf;
973 	struct rte_crypto_op *op;
974 };
975 
976 typedef int (*fips_dev_self_test_prepare_xform_t)(uint8_t,
977 		struct rte_crypto_sym_xform *,
978 		struct fips_dev_self_test_vector *,
979 		uint32_t, uint8_t *,
980 		uint32_t);
981 
982 typedef int (*fips_dev_self_test_prepare_op_t)(struct rte_crypto_op *,
983 		struct rte_mbuf *, struct rte_cryptodev_sym_session *,
984 		uint32_t, struct fips_dev_self_test_vector *);
985 
986 typedef int (*fips_dev_self_test_check_result_t)(struct rte_crypto_op *,
987 		struct fips_dev_self_test_vector *, uint32_t);
988 
989 struct fips_dev_self_test_ops {
990 	enum rte_crypto_sym_xform_type last_operation_type;
991 	fips_dev_self_test_prepare_xform_t prepare_xform;
992 	fips_dev_self_test_prepare_op_t prepare_op;
993 	fips_dev_self_test_check_result_t check_result;
994 };
995 
996 static int
997 prepare_cipher_xform(uint8_t dev_id,
998 		struct rte_crypto_sym_xform *xform,
999 		struct fips_dev_self_test_vector *vec,
1000 		uint32_t dir,
1001 		uint8_t *key,
1002 		uint32_t neg_test)
1003 {
1004 	const struct rte_cryptodev_symmetric_capability *cap;
1005 	struct rte_cryptodev_sym_capability_idx cap_idx;
1006 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1007 
1008 	memset(xform, 0, sizeof(*xform));
1009 
1010 	/** negative test, key is xored */
1011 	if (neg_test) {
1012 		uint32_t i;
1013 
1014 		for (i = 0; i < vec->key.len; i++)
1015 			key[i] ^= vec->key.data[i];
1016 	} else
1017 		memcpy(key, vec->key.data, vec->key.len);
1018 
1019 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1020 
1021 	cipher_xform->algo = vec->cipher.algo;
1022 	cipher_xform->op = (dir == self_test_dir_enc_auth_gen) ?
1023 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1024 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1025 	cipher_xform->key.data = key;
1026 	cipher_xform->key.length = vec->key.len;
1027 	cipher_xform->iv.length = vec->iv.len;
1028 	cipher_xform->iv.offset = IV_OFF;
1029 
1030 	cap_idx.algo.cipher = cipher_xform->algo;
1031 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1032 
1033 	cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
1034 	if (!cap) {
1035 		RTE_LOG(ERR, PMD, "Failed to get capability for cdev %u\n",
1036 				dev_id);
1037 		return -EACCES;
1038 	}
1039 
1040 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1041 			cipher_xform->key.length,
1042 			cipher_xform->iv.length) != 0) {
1043 		RTE_LOG(ERR, PMD, "PMD %s key length %u IV length %u\n",
1044 				rte_cryptodev_name_get(dev_id),
1045 				cipher_xform->key.length,
1046 				cipher_xform->iv.length);
1047 		return -EACCES;
1048 	}
1049 
1050 	return 0;
1051 }
1052 
1053 static int
1054 prepare_auth_xform(uint8_t dev_id,
1055 		struct rte_crypto_sym_xform *xform,
1056 		struct fips_dev_self_test_vector *vec,
1057 		uint32_t dir,
1058 		uint8_t *key,
1059 		uint32_t neg_test)
1060 {
1061 	const struct rte_cryptodev_symmetric_capability *cap;
1062 	struct rte_cryptodev_sym_capability_idx cap_idx;
1063 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1064 
1065 	memset(xform, 0, sizeof(*xform));
1066 
1067 	/** negative test, key is xored */
1068 	if (neg_test) {
1069 		uint32_t i;
1070 
1071 		for (i = 0; i < vec->key.len; i++)
1072 			key[i] ^= vec->key.data[i];
1073 	} else
1074 		memcpy(key, vec->key.data, vec->key.len);
1075 
1076 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1077 
1078 	auth_xform->algo = vec->auth.algo;
1079 	auth_xform->op = (dir == self_test_dir_enc_auth_gen) ?
1080 			RTE_CRYPTO_AUTH_OP_GENERATE :
1081 			RTE_CRYPTO_AUTH_OP_VERIFY;
1082 	auth_xform->digest_length = vec->digest.len;
1083 	auth_xform->key.data = key;
1084 	auth_xform->key.length = vec->key.len;
1085 
1086 	cap_idx.algo.auth = auth_xform->algo;
1087 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1088 
1089 	cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
1090 	if (!cap) {
1091 		RTE_LOG(ERR, PMD, "Failed to get capability for cdev %u\n",
1092 				dev_id);
1093 		return -EACCES;
1094 	}
1095 
1096 	if (rte_cryptodev_sym_capability_check_auth(cap,
1097 			auth_xform->key.length,
1098 			auth_xform->digest_length, 0) != 0) {
1099 		RTE_LOG(ERR, PMD, "PMD %s key length %u Digest length %u\n",
1100 				rte_cryptodev_name_get(dev_id),
1101 				auth_xform->key.length,
1102 				auth_xform->digest_length);
1103 		return -EACCES;
1104 	}
1105 
1106 	return 0;
1107 }
1108 
1109 static int
1110 prepare_aead_xform(uint8_t dev_id,
1111 		struct rte_crypto_sym_xform *xform,
1112 		struct fips_dev_self_test_vector *vec,
1113 		uint32_t dir,
1114 		uint8_t *key,
1115 		uint32_t neg_test)
1116 {
1117 	const struct rte_cryptodev_symmetric_capability *cap;
1118 	struct rte_cryptodev_sym_capability_idx cap_idx;
1119 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
1120 
1121 	memset(xform, 0, sizeof(*xform));
1122 
1123 	/** negative test, key is xored */
1124 	if (neg_test) {
1125 		uint32_t i;
1126 
1127 		for (i = 0; i < vec->key.len; i++)
1128 			key[i] ^= vec->key.data[i];
1129 	} else
1130 		memcpy(key, vec->key.data, vec->key.len);
1131 
1132 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
1133 
1134 	aead_xform->algo = vec->aead.algo;
1135 	aead_xform->op = (dir == self_test_dir_enc_auth_gen) ?
1136 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
1137 			RTE_CRYPTO_AEAD_OP_DECRYPT;
1138 	aead_xform->aad_length = vec->aead.aad.len;
1139 	aead_xform->digest_length = vec->digest.len;
1140 	aead_xform->iv.offset = IV_OFF;
1141 	aead_xform->iv.length = vec->iv.len;
1142 	aead_xform->key.data = key;
1143 	aead_xform->key.length = vec->key.len;
1144 
1145 	cap_idx.algo.aead = aead_xform->algo;
1146 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
1147 
1148 	cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
1149 	if (!cap) {
1150 		RTE_LOG(ERR, PMD, "Failed to get capability for cdev %u\n",
1151 				dev_id);
1152 		return -EACCES;
1153 	}
1154 
1155 	if (rte_cryptodev_sym_capability_check_aead(cap,
1156 			aead_xform->key.length,
1157 			aead_xform->digest_length, aead_xform->aad_length,
1158 			aead_xform->iv.length) != 0) {
1159 		RTE_LOG(ERR, PMD,
1160 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
1161 				rte_cryptodev_name_get(dev_id),
1162 				aead_xform->key.length,
1163 				aead_xform->digest_length,
1164 				aead_xform->aad_length,
1165 				aead_xform->iv.length);
1166 		return -EACCES;
1167 	}
1168 
1169 	return 0;
1170 }
1171 
1172 static int
1173 prepare_cipher_op(struct rte_crypto_op *op,
1174 		struct rte_mbuf *mbuf,
1175 		struct rte_cryptodev_sym_session *session,
1176 		uint32_t dir,
1177 		struct fips_dev_self_test_vector *vec)
1178 {
1179 	struct rte_crypto_sym_op *sym = op->sym;
1180 	uint8_t *iv = rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFF);
1181 	uint8_t *dst;
1182 	const uint8_t *src;
1183 	uint32_t len;
1184 
1185 	if (dir == self_test_dir_enc_auth_gen) {
1186 		src = vec->input.data;
1187 		len = vec->input.len;
1188 	} else {
1189 		src = vec->output.data;
1190 		len = vec->output.len;
1191 	}
1192 
1193 	sym->cipher.data.offset = 0;
1194 	memcpy(iv, vec->iv.data, vec->iv.len);
1195 
1196 	dst = (uint8_t *)rte_pktmbuf_append(mbuf, len);
1197 	if (!dst) {
1198 		RTE_LOG(ERR, PMD, "Error %i: MBUF too small\n", -ENOMEM);
1199 		return -ENOMEM;
1200 	}
1201 
1202 	memcpy(dst, src, len);
1203 
1204 	sym->cipher.data.length = len;
1205 
1206 	rte_crypto_op_attach_sym_session(op, session);
1207 
1208 	return 0;
1209 }
1210 
1211 static int
1212 prepare_auth_op(struct rte_crypto_op *op,
1213 		struct rte_mbuf *mbuf,
1214 		struct rte_cryptodev_sym_session *session,
1215 		uint32_t dir,
1216 		struct fips_dev_self_test_vector *vec)
1217 {
1218 	struct rte_crypto_sym_op *sym = op->sym;
1219 	uint8_t *dst;
1220 
1221 	if (vec->input.len + vec->digest.len > RTE_MBUF_MAX_NB_SEGS) {
1222 		RTE_LOG(ERR, PMD, "Error %i: Test data too long (%u).\n",
1223 				-ENOMEM, vec->input.len + vec->digest.len);
1224 		return -ENOMEM;
1225 	}
1226 
1227 	sym->auth.data.offset = 0;
1228 
1229 	dst = (uint8_t *)rte_pktmbuf_append(mbuf, vec->input.len +
1230 			vec->digest.len);
1231 	if (!dst) {
1232 		RTE_LOG(ERR, PMD, "Error %i: MBUF too small\n", -ENOMEM);
1233 		return -ENOMEM;
1234 	}
1235 
1236 	memcpy(dst, vec->input.data, vec->input.len);
1237 	sym->auth.data.length = vec->input.len;
1238 	sym->auth.digest.data = dst + vec->input.len;
1239 
1240 	if (dir == self_test_dir_dec_auth_verify)
1241 		memcpy(dst + vec->input.len, vec->digest.data, vec->digest.len);
1242 
1243 	rte_crypto_op_attach_sym_session(op, session);
1244 
1245 	return 0;
1246 }
1247 
1248 static int
1249 prepare_aead_op(struct rte_crypto_op *op,
1250 		struct rte_mbuf *mbuf,
1251 		struct rte_cryptodev_sym_session *session,
1252 		uint32_t dir,
1253 		struct fips_dev_self_test_vector *vec)
1254 {
1255 	struct rte_crypto_sym_op *sym = op->sym;
1256 	uint8_t *iv = rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFF);
1257 	uint8_t *dst;
1258 	const uint8_t *src;
1259 	uint32_t len;
1260 
1261 	if (dir == self_test_dir_enc_auth_gen) {
1262 		len = vec->input.len;
1263 		src = vec->input.data;
1264 	} else {
1265 		len = vec->output.len;
1266 		src = vec->output.data;
1267 	}
1268 
1269 	if (vec->aead.algo == RTE_CRYPTO_AEAD_AES_CCM)
1270 		memcpy(iv + 1, vec->iv.data, vec->iv.len);
1271 	else
1272 		memcpy(iv, vec->iv.data, vec->iv.len);
1273 
1274 	if (len + vec->digest.len > RTE_MBUF_MAX_NB_SEGS) {
1275 		RTE_LOG(ERR, PMD, "Error %i: Test data too long (%u).\n",
1276 				-ENOMEM, len + vec->digest.len);
1277 		return -ENOMEM;
1278 	}
1279 
1280 	dst = (uint8_t *)rte_pktmbuf_append(mbuf, len + vec->digest.len);
1281 	if (!dst) {
1282 		RTE_LOG(ERR, PMD, "Error %i: MBUF too small\n", -ENOMEM);
1283 		return -ENOMEM;
1284 	}
1285 
1286 	sym->m_src = mbuf;
1287 	sym->aead.data.length = len;
1288 	sym->aead.data.offset = 0;
1289 	sym->aead.aad.data = vec->aead.aad.data;
1290 	sym->aead.digest.data = dst + vec->input.len;
1291 	memcpy(dst, src, len);
1292 
1293 	if (dir == self_test_dir_dec_auth_verify)
1294 		memcpy(sym->aead.digest.data, vec->digest.data, vec->digest.len);
1295 
1296 	rte_crypto_op_attach_sym_session(op, session);
1297 
1298 	return 0;
1299 }
1300 
1301 static int
1302 check_cipher_result(struct rte_crypto_op *op,
1303 		struct fips_dev_self_test_vector *vec,
1304 		uint32_t dir)
1305 {
1306 	struct rte_mbuf *mbuf = op->sym->m_src;
1307 	uint8_t *data;
1308 	const uint8_t *src;
1309 	uint32_t len, src_len;
1310 	int ret;
1311 
1312 	if (dir == self_test_dir_enc_auth_gen) {
1313 		src = vec->output.data;
1314 		src_len = vec->output.len;
1315 	} else {
1316 		src = vec->input.data;
1317 		src_len = vec->input.len;
1318 	}
1319 
1320 	GET_MBUF_DATA(data, len, mbuf);
1321 	if (len != src_len)
1322 		return -1;
1323 
1324 	ret = memcmp(data, src, src_len);
1325 	if (ret != 0)
1326 		return -1;
1327 
1328 	return 0;
1329 }
1330 
1331 static int
1332 check_auth_result(struct rte_crypto_op *op,
1333 		struct fips_dev_self_test_vector *vec,
1334 		uint32_t dir)
1335 {
1336 	struct rte_mbuf *mbuf = op->sym->m_src;
1337 	uint8_t *data;
1338 	uint32_t len;
1339 	int ret;
1340 
1341 	GET_MBUF_DATA(data, len, mbuf);
1342 	if (len != vec->input.len + vec->digest.len)
1343 		return -1;
1344 
1345 	if (dir == self_test_dir_enc_auth_gen) {
1346 		data += vec->input.len;
1347 		ret = memcmp(data, vec->digest.data, vec->digest.len);
1348 		if (ret != 0)
1349 			return -1;
1350 	}
1351 
1352 	return 0;
1353 }
1354 
1355 static int
1356 check_aead_result(struct rte_crypto_op *op,
1357 		struct fips_dev_self_test_vector *vec,
1358 		uint32_t dir)
1359 {
1360 	struct rte_mbuf *mbuf = op->sym->m_src;
1361 	uint8_t *data;
1362 	const uint8_t *src;
1363 	uint32_t len, src_len;
1364 	int ret;
1365 
1366 	if (dir == self_test_dir_enc_auth_gen) {
1367 		src = vec->output.data;
1368 		src_len = vec->output.len;
1369 	} else {
1370 		src = vec->input.data;
1371 		src_len = vec->input.len;
1372 	}
1373 
1374 	GET_MBUF_DATA(data, len, mbuf);
1375 	if (len != src_len + vec->digest.len)
1376 		return -1;
1377 
1378 	ret = memcmp(data, src, src_len);
1379 	if (ret != 0)
1380 		return -1;
1381 
1382 	if (dir == self_test_dir_enc_auth_gen) {
1383 		data += src_len;
1384 		ret = memcmp(data, vec->digest.data, vec->digest.len);
1385 		if (ret != 0)
1386 			return -1;
1387 	}
1388 
1389 	return 0;
1390 }
1391 
1392 static void
1393 init_test_op(struct fips_dev_self_test_ops *test_ops,
1394 		struct fips_dev_self_test_vector *vec)
1395 {
1396 	if (test_ops->last_operation_type == vec->operation_type)
1397 		return;
1398 
1399 	switch (vec->operation_type) {
1400 	case RTE_CRYPTO_SYM_XFORM_CIPHER:
1401 		test_ops->prepare_xform = prepare_cipher_xform;
1402 		test_ops->prepare_op = prepare_cipher_op;
1403 		test_ops->check_result = check_cipher_result;
1404 		break;
1405 	case RTE_CRYPTO_SYM_XFORM_AUTH:
1406 		test_ops->prepare_xform = prepare_auth_xform;
1407 		test_ops->prepare_op = prepare_auth_op;
1408 		test_ops->check_result = check_auth_result;
1409 		break;
1410 	case RTE_CRYPTO_SYM_XFORM_AEAD:
1411 		test_ops->prepare_xform = prepare_aead_xform;
1412 		test_ops->prepare_op = prepare_aead_op;
1413 		test_ops->check_result = check_aead_result;
1414 		break;
1415 	default:
1416 		break;
1417 	}
1418 
1419 	test_ops->last_operation_type = vec->operation_type;
1420 }
1421 
1422 static int
1423 run_single_test(uint8_t dev_id,
1424 		struct fips_dev_self_test_vector *vec,
1425 		const struct fips_dev_self_test_ops *test_ops,
1426 		struct fips_dev_auto_test_env *env,
1427 		uint32_t dir,
1428 		uint32_t negative_test)
1429 {
1430 	struct rte_crypto_sym_xform xform;
1431 	struct rte_cryptodev_sym_session *sess;
1432 	uint16_t n_deqd;
1433 	uint8_t key[256];
1434 	int ret;
1435 
1436 	__rte_crypto_op_reset(env->op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1437 	rte_pktmbuf_reset(env->mbuf);
1438 	env->op->sym->m_src = env->mbuf;
1439 
1440 	ret = test_ops->prepare_xform(dev_id, &xform, vec, dir, key,
1441 			negative_test);
1442 	if (ret < 0) {
1443 		RTE_LOG(ERR, PMD, "Error %i: Prepare Xform\n", ret);
1444 		return ret;
1445 	}
1446 
1447 	sess = rte_cryptodev_sym_session_create(env->sess_pool);
1448 	if (!sess)
1449 		return -ENOMEM;
1450 
1451 	ret = rte_cryptodev_sym_session_init(dev_id,
1452 			sess, &xform, env->sess_priv_pool);
1453 	if (ret < 0) {
1454 		RTE_LOG(ERR, PMD, "Error %i: Init session\n", ret);
1455 		return ret;
1456 	}
1457 
1458 	ret = test_ops->prepare_op(env->op, env->mbuf, sess, dir, vec);
1459 	if (ret < 0) {
1460 		RTE_LOG(ERR, PMD, "Error %i: Prepare op\n", ret);
1461 		return ret;
1462 	}
1463 
1464 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &env->op, 1) < 1) {
1465 		RTE_LOG(ERR, PMD, "Error: Failed enqueue\n");
1466 		return ret;
1467 	}
1468 
1469 	do {
1470 		struct rte_crypto_op *deqd_op;
1471 
1472 		n_deqd = rte_cryptodev_dequeue_burst(dev_id, 0, &deqd_op,
1473 				1);
1474 	} while (n_deqd == 0);
1475 
1476 	rte_cryptodev_sym_session_clear(dev_id, sess);
1477 	rte_cryptodev_sym_session_free(sess);
1478 
1479 	if (env->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
1480 		return -1;
1481 
1482 	return test_ops->check_result(env->op, vec, dir);
1483 }
1484 
1485 
1486 static void
1487 fips_dev_auto_test_uninit(uint8_t dev_id,
1488 		struct fips_dev_auto_test_env *env)
1489 {
1490 	struct rte_cryptodev *dev = rte_cryptodev_pmd_get_dev(dev_id);
1491 	uint32_t i;
1492 
1493 	if (!dev)
1494 		return;
1495 
1496 	if (env->mbuf)
1497 		rte_pktmbuf_free(env->mbuf);
1498 	if (env->op)
1499 		rte_crypto_op_free(env->op);
1500 	if (env->mpool)
1501 		rte_mempool_free(env->mpool);
1502 	if (env->op_pool)
1503 		rte_mempool_free(env->op_pool);
1504 	if (env->sess_pool)
1505 		rte_mempool_free(env->sess_pool);
1506 	if (env->sess_priv_pool)
1507 		rte_mempool_free(env->sess_priv_pool);
1508 
1509 	if (dev->data->dev_started)
1510 		rte_cryptodev_stop(dev_id);
1511 
1512 	if (dev->data->nb_queue_pairs) {
1513 		for (i = 0; i < dev->data->nb_queue_pairs; i++)
1514 			(*dev->dev_ops->queue_pair_release)(dev, i);
1515 		dev->data->nb_queue_pairs = 0;
1516 		rte_free(dev->data->queue_pairs);
1517 		dev->data->queue_pairs = NULL;
1518 	}
1519 }
1520 
1521 static int
1522 fips_dev_auto_test_init(uint8_t dev_id, struct fips_dev_auto_test_env *env)
1523 {
1524 	struct rte_cryptodev_config conf = {rte_cryptodev_socket_id(dev_id), 1};
1525 	struct rte_cryptodev_qp_conf qp_conf = {128, NULL, NULL};
1526 	uint32_t sess_sz = rte_cryptodev_sym_get_private_session_size(dev_id);
1527 	char name[128];
1528 	int ret;
1529 
1530 	ret = rte_cryptodev_configure(dev_id, &conf);
1531 	if (ret < 0)
1532 		return ret;
1533 
1534 	memset(name, 0, 128);
1535 	snprintf(name, 128, "%s%u", "SELF_TEST_MEMPOOL", dev_id);
1536 
1537 	memset(env, 0, sizeof(*env));
1538 
1539 	env->mpool = rte_pktmbuf_pool_create(name, 128, 0, 0,
1540 			UINT16_MAX, rte_cryptodev_socket_id(dev_id));
1541 	if (!env->mpool) {
1542 		ret = -ENOMEM;
1543 		goto error_exit;
1544 	}
1545 
1546 	memset(name, 0, 128);
1547 	snprintf(name, 128, "%s%u", "SELF_TEST_OP_POOL", dev_id);
1548 
1549 	env->op_pool = rte_crypto_op_pool_create(
1550 			name,
1551 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1552 			16, 0,
1553 			16,
1554 			rte_socket_id());
1555 	if (!env->op_pool) {
1556 		ret = -ENOMEM;
1557 		goto error_exit;
1558 	}
1559 
1560 	memset(name, 0, 128);
1561 	snprintf(name, 128, "%s%u", "SELF_TEST_SESS_POOL", dev_id);
1562 
1563 	env->sess_pool = rte_cryptodev_sym_session_pool_create(name,
1564 			128, 0, 0, 0, rte_cryptodev_socket_id(dev_id));
1565 	if (!env->sess_pool) {
1566 		ret = -ENOMEM;
1567 		goto error_exit;
1568 	}
1569 
1570 	memset(name, 0, 128);
1571 	snprintf(name, 128, "%s%u", "SELF_TEST_SESS_PRIV_POOL", dev_id);
1572 
1573 	env->sess_priv_pool = rte_mempool_create(name,
1574 			128, sess_sz, 0, 0, NULL, NULL, NULL,
1575 			NULL, rte_cryptodev_socket_id(dev_id), 0);
1576 	if (!env->sess_priv_pool) {
1577 		ret = -ENOMEM;
1578 		goto error_exit;
1579 	}
1580 
1581 	qp_conf.mp_session = env->sess_pool;
1582 	qp_conf.mp_session_private = env->sess_priv_pool;
1583 
1584 	ret = rte_cryptodev_queue_pair_setup(dev_id, 0, &qp_conf,
1585 			rte_cryptodev_socket_id(dev_id));
1586 	if (ret < 0)
1587 		goto error_exit;
1588 
1589 	env->mbuf = rte_pktmbuf_alloc(env->mpool);
1590 	if (!env->mbuf) {
1591 		ret = -ENOMEM;
1592 		goto error_exit;
1593 	}
1594 
1595 	env->op = rte_crypto_op_alloc(env->op_pool,
1596 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1597 	if (!env->op) {
1598 		ret = -ENOMEM;
1599 		goto error_exit;
1600 	}
1601 
1602 	ret = rte_cryptodev_start(dev_id);
1603 	if (ret < 0)
1604 		goto error_exit;
1605 
1606 
1607 	return 0;
1608 
1609 error_exit:
1610 
1611 	fips_dev_auto_test_uninit(dev_id, env);
1612 
1613 	return ret;
1614 }
1615 
1616 int
1617 fips_dev_self_test(uint8_t dev_id,
1618 		struct fips_dev_broken_test_config *config)
1619 {
1620 	struct fips_dev_self_test_ops test_ops = {0};
1621 	struct fips_dev_auto_test_env env;
1622 	uint32_t i, j, negative_test;
1623 	int ret;
1624 
1625 	ret = fips_dev_auto_test_init(dev_id, &env);
1626 	if (ret < 0) {
1627 		RTE_LOG(ERR, PMD, "Failed to init self-test for PMD %u\n",
1628 				dev_id);
1629 		return ret;
1630 	}
1631 
1632 	for (i = 0; i < RTE_DIM(self_test_vectors); i++) {
1633 		struct fips_dev_self_test_vector *vec =
1634 				self_test_vectors[i];
1635 
1636 		init_test_op(&test_ops, vec);
1637 
1638 		for (j = 0; j < self_test_dir_max; j++) {
1639 			if (!config)
1640 				negative_test = 0;
1641 			else {
1642 				if ((config->expect_fail_test_idx == i) &&
1643 						(config->expect_fail_dir == j))
1644 					negative_test = 1;
1645 				else
1646 					negative_test = 0;
1647 			}
1648 
1649 			RTE_LOG(INFO, PMD, "Testing (ID %u) %s %s%s...\n",
1650 					i,
1651 					vec->name,
1652 					j == self_test_dir_enc_auth_gen ?
1653 							"Encrypt" : "Decrypt",
1654 					negative_test ? " (Expect Fail)" : "");
1655 
1656 			ret = run_single_test(dev_id, vec, &test_ops,
1657 						&env, j, negative_test);
1658 			switch (ret) {
1659 			case 0:
1660 				if (!negative_test)
1661 					break;
1662 				ret = -1;
1663 				RTE_LOG(ERR, PMD, "PMD %u Failed test %s %s\n",
1664 					dev_id, vec->name,
1665 					j == self_test_dir_enc_auth_gen ?
1666 					"Encrypt" : "Decrypt");
1667 				goto error_exit;
1668 			case -EACCES:
1669 				RTE_LOG(ERR, PMD, "Not supported by %s. Skip\n",
1670 					rte_cryptodev_name_get(dev_id));
1671 				ret = 0;
1672 				break;
1673 			default:
1674 				RTE_LOG(ERR, PMD, "PMD %u Failed test %s %s\n",
1675 					dev_id, vec->name,
1676 					j == self_test_dir_enc_auth_gen ?
1677 					"Encrypt" : "Decrypt");
1678 				goto error_exit;
1679 			}
1680 		}
1681 	}
1682 
1683 error_exit:
1684 	fips_dev_auto_test_uninit(dev_id, &env);
1685 
1686 	if (ret == 0) {
1687 		RTE_LOG(INFO, PMD, "PMD %u finished self-test successfully\n",
1688 				dev_id);
1689 	}
1690 
1691 	return ret;
1692 }
1693