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