xref: /dpdk/examples/fips_validation/fips_dev_self_test.c (revision 74645f64ad6ff9142fa42a2fbf1f5f7a2cc1942d)
141d561cbSFan Zhang /* SPDX-License-Identifier: BSD-3-Clause
241d561cbSFan Zhang  * Copyright(c) 2019 Intel Corporation
341d561cbSFan Zhang  */
441d561cbSFan Zhang 
541d561cbSFan Zhang #include <rte_cryptodev.h>
6*74645f64SAkhil Goyal #include <rte_malloc.h>
741d561cbSFan Zhang 
841d561cbSFan Zhang #include "fips_dev_self_test.h"
941d561cbSFan Zhang 
1041d561cbSFan Zhang #define IV_OFF (sizeof(struct rte_crypto_op) + sizeof(struct rte_crypto_sym_op))
1141d561cbSFan Zhang 
1241d561cbSFan Zhang #define FIPS_DEV_TEST_DATA_MAX_SIZE	8096
1326e28801SFan Zhang #define AES_CCM_AAD_PAD_SIZE		18
1441d561cbSFan Zhang 
1541d561cbSFan Zhang struct fips_dev_self_test_vector {
1641d561cbSFan Zhang 	const char *name;
1741d561cbSFan Zhang 	enum rte_crypto_sym_xform_type operation_type;
1841d561cbSFan Zhang 
1941d561cbSFan Zhang 	struct {
2041d561cbSFan Zhang 		uint8_t data[64];
2141d561cbSFan Zhang 		uint16_t len;
2241d561cbSFan Zhang 	} digest;
2341d561cbSFan Zhang 
2441d561cbSFan Zhang 	struct {
2541d561cbSFan Zhang 		uint8_t data[256];
2641d561cbSFan Zhang 		uint16_t len;
2741d561cbSFan Zhang 	} key;
2841d561cbSFan Zhang 
2941d561cbSFan Zhang 	struct {
3041d561cbSFan Zhang 		uint8_t data[16];
3141d561cbSFan Zhang 		uint8_t len;
3241d561cbSFan Zhang 	} iv;
3341d561cbSFan Zhang 
3441d561cbSFan Zhang 	union {
3541d561cbSFan Zhang 		struct {
3641d561cbSFan Zhang 			enum rte_crypto_cipher_algorithm algo;
3741d561cbSFan Zhang 		} cipher;
3841d561cbSFan Zhang 
3941d561cbSFan Zhang 		struct {
4041d561cbSFan Zhang 			enum rte_crypto_aead_algorithm algo;
4141d561cbSFan Zhang 			struct {
4241d561cbSFan Zhang 				uint8_t data[FIPS_DEV_TEST_DATA_MAX_SIZE];
4341d561cbSFan Zhang 				uint16_t len;
4441d561cbSFan Zhang 			} aad;
4541d561cbSFan Zhang 		} aead;
4641d561cbSFan Zhang 
4741d561cbSFan Zhang 		struct {
4841d561cbSFan Zhang 			enum rte_crypto_auth_algorithm algo;
4941d561cbSFan Zhang 		} auth;
5041d561cbSFan Zhang 	};
5141d561cbSFan Zhang 
5241d561cbSFan Zhang 	struct {
5341d561cbSFan Zhang 		const uint8_t data[FIPS_DEV_TEST_DATA_MAX_SIZE];
5441d561cbSFan Zhang 		uint16_t len;
5541d561cbSFan Zhang 	} input;
5641d561cbSFan Zhang 
5741d561cbSFan Zhang 	struct {
5841d561cbSFan Zhang 		uint8_t data[FIPS_DEV_TEST_DATA_MAX_SIZE];
5941d561cbSFan Zhang 		uint16_t len;
6041d561cbSFan Zhang 	} output;
6141d561cbSFan Zhang };
6241d561cbSFan Zhang 
6341d561cbSFan Zhang #define GET_MBUF_DATA(data, len, m)			\
6441d561cbSFan Zhang do {							\
6541d561cbSFan Zhang 	len = rte_pktmbuf_pkt_len(m);			\
6641d561cbSFan Zhang 	data = rte_pktmbuf_mtod(m, uint8_t *);		\
6741d561cbSFan Zhang } while (0)
6841d561cbSFan Zhang 
6941d561cbSFan Zhang 
7041d561cbSFan Zhang /* <-- SHA-x HMAC --> */
7141d561cbSFan Zhang static struct fips_dev_self_test_vector
7241d561cbSFan Zhang SELF_TEST_SHA1_HMAC_test_vector = {
7341d561cbSFan Zhang 		.name = "SELF_TEST_SHA1_HMAC_test_vector",
7441d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
7541d561cbSFan Zhang 
7641d561cbSFan Zhang 		.auth = {
7741d561cbSFan Zhang 			.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
7841d561cbSFan Zhang 		},
7941d561cbSFan Zhang 		.input = {
8041d561cbSFan Zhang 			.data = {
8141d561cbSFan Zhang 				0xed, 0xb2, 0xba, 0x09, 0x99, 0x61, 0xd3, 0x8f,
8241d561cbSFan Zhang 				0xd0, 0xa0, 0xa6, 0xa2, 0x35, 0xd6, 0x12, 0x71,
8341d561cbSFan Zhang 				0xcb, 0x4d, 0x49, 0x3b, 0x64, 0xd9, 0xde, 0x13,
8441d561cbSFan Zhang 				0x5c, 0xbb, 0x1f, 0xe0, 0x86, 0xc4, 0xa4, 0xa7,
8541d561cbSFan Zhang 				0x67, 0xbe, 0x28, 0x0d, 0xa2, 0x07, 0x98, 0x17,
8641d561cbSFan Zhang 				0xb4, 0x7f, 0x6a, 0x35, 0xe1, 0xa4, 0x30, 0x7f,
8741d561cbSFan Zhang 				0x6e, 0xfc, 0x6d, 0x3e, 0x11, 0xb4, 0xa7, 0xae,
8841d561cbSFan Zhang 				0xa6, 0x86, 0xbd, 0x02, 0x23, 0xe0, 0x7b, 0xa9,
8941d561cbSFan Zhang 				0xce, 0x42, 0x6c, 0xd0, 0xae, 0xe7, 0xef, 0x28,
9041d561cbSFan Zhang 				0x3f, 0xa9, 0x8d, 0xe9, 0x6a, 0x1f, 0x8a, 0x17,
9141d561cbSFan Zhang 				0xb3, 0x08, 0xba, 0x04, 0xb5, 0xec, 0x96, 0x16,
9241d561cbSFan Zhang 				0xcb, 0x00, 0x8f, 0xca, 0x11, 0x4b, 0xa3, 0xf9,
9341d561cbSFan Zhang 				0x8b, 0x07, 0x2d, 0x5a, 0xa3, 0x4a, 0x01, 0x49,
9441d561cbSFan Zhang 				0xd9, 0xe5, 0xb8, 0xc6, 0xb6, 0x8c, 0x49, 0xc1,
9541d561cbSFan Zhang 				0x01, 0x38, 0xda, 0x95, 0x36, 0xca, 0xd5, 0xd2,
9641d561cbSFan Zhang 				0x34, 0xf1, 0x3d, 0x3f, 0x36, 0x4d, 0x43, 0x1f
9741d561cbSFan Zhang 			},
9841d561cbSFan Zhang 			.len = 128,
9941d561cbSFan Zhang 		},
10041d561cbSFan Zhang 		.key = {
10141d561cbSFan Zhang 			.data = {
10241d561cbSFan Zhang 				0x8d, 0x8d, 0x15, 0xd8, 0xa9, 0x57, 0x9a, 0xdb,
10341d561cbSFan Zhang 				0x2d, 0x62
10441d561cbSFan Zhang 			},
10541d561cbSFan Zhang 			.len = 10,
10641d561cbSFan Zhang 		},
10741d561cbSFan Zhang 		.digest = {
10841d561cbSFan Zhang 			.data = {
10941d561cbSFan Zhang 				0x0c, 0x66, 0x2e, 0x47, 0x93, 0x93, 0x8c, 0xc3,
11041d561cbSFan Zhang 				0x7f, 0x3d, 0x51, 0xd2, 0xb4, 0x05, 0x48, 0xec,
11141d561cbSFan Zhang 				0x55, 0x91, 0x4f, 0x0d
11241d561cbSFan Zhang 			},
11341d561cbSFan Zhang 			.len = 20,
11441d561cbSFan Zhang 		},
11541d561cbSFan Zhang };
11641d561cbSFan Zhang 
11741d561cbSFan Zhang static struct fips_dev_self_test_vector
11841d561cbSFan Zhang SELF_TEST_SHA224_HMAC_test_vector = {
11941d561cbSFan Zhang 		.name = "SELF_TEST_SHA224_HMAC_test_vector",
12041d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
12141d561cbSFan Zhang 		.auth = {
12241d561cbSFan Zhang 			.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
12341d561cbSFan Zhang 		},
12441d561cbSFan Zhang 		.input = {
12541d561cbSFan Zhang 			.data = {
12641d561cbSFan Zhang 				0x41, 0x18, 0x43, 0xa2, 0x13, 0x87, 0x84, 0x6f,
12741d561cbSFan Zhang 				0x3b, 0x9e, 0xd5, 0xfc, 0x54, 0x5a, 0xca, 0xdf,
12841d561cbSFan Zhang 				0xa5, 0xb7, 0x03, 0x86, 0xf6, 0x2d, 0xa4, 0xd9,
12941d561cbSFan Zhang 				0xa2, 0x7b, 0x04, 0x1b, 0xee, 0xa3, 0xaa, 0x11,
13041d561cbSFan Zhang 				0x99, 0x36, 0x75, 0x67, 0xb4, 0xd1, 0x1a, 0x4f,
13141d561cbSFan Zhang 				0xb4, 0xe8, 0xd4, 0x6b, 0xc6, 0xc2, 0x56, 0xed,
13241d561cbSFan Zhang 				0x62, 0xc5, 0x05, 0xfd, 0x23, 0xf4, 0x64, 0x5b,
13341d561cbSFan Zhang 				0xd6, 0xb6, 0xcf, 0x45, 0xd1, 0xd9, 0x6d, 0x9b,
13441d561cbSFan Zhang 				0x86, 0xd6, 0x60, 0x41, 0x57, 0x57, 0x3e, 0xc5,
13541d561cbSFan Zhang 				0xac, 0xf6, 0xc5, 0x41, 0x43, 0x48, 0xca, 0x83,
13641d561cbSFan Zhang 				0xc8, 0x1a, 0x73, 0x6c, 0xa6, 0xfa, 0xa6, 0x96,
13741d561cbSFan Zhang 				0x1c, 0xfa, 0xc1, 0x39, 0x93, 0xb0, 0x8c, 0x50,
13841d561cbSFan Zhang 				0x2f, 0x81, 0x6c, 0xf7, 0xa4, 0x20, 0xd9, 0x18,
13941d561cbSFan Zhang 				0x4b, 0x51, 0x11, 0x46, 0x75, 0xf3, 0x0e, 0xe9,
14041d561cbSFan Zhang 				0xff, 0x3d, 0xb6, 0x9c, 0x26, 0x48, 0x53, 0xd3,
14141d561cbSFan Zhang 				0x9d, 0xcd, 0x42, 0xc1, 0xdd, 0x31, 0xef, 0x79
14241d561cbSFan Zhang 
14341d561cbSFan Zhang 			},
14441d561cbSFan Zhang 			.len = 128,
14541d561cbSFan Zhang 		},
14641d561cbSFan Zhang 		.key = {
14741d561cbSFan Zhang 			.data = {
14841d561cbSFan Zhang 				0x37, 0x14, 0x70, 0x78, 0x39, 0xda, 0xf7, 0x91,
14941d561cbSFan Zhang 				0x22, 0xc7, 0x82, 0x41, 0x63, 0x51, 0x38, 0x5e,
15041d561cbSFan Zhang 				0x88, 0xa8, 0x1d, 0x31, 0xc9, 0xf6, 0x41, 0xd8,
15141d561cbSFan Zhang 				0xdc, 0xe5, 0x38, 0xe9, 0x0e, 0x63, 0xc9, 0x58,
15241d561cbSFan Zhang 				0x92, 0xa2, 0xea, 0x9b, 0x19, 0x62, 0xed, 0x0b,
15341d561cbSFan Zhang 				0xa3, 0x72, 0xf4, 0x8e, 0x94, 0x74, 0xaa, 0x73,
15441d561cbSFan Zhang 				0x0a, 0xe2
15541d561cbSFan Zhang 			},
15641d561cbSFan Zhang 			.len = 50,
15741d561cbSFan Zhang 		},
15841d561cbSFan Zhang 		.digest = {
15941d561cbSFan Zhang 			.data = {
16041d561cbSFan Zhang 				0x33, 0xf1, 0x7a, 0xc8, 0xa5, 0xc6, 0xb5, 0x25,
16141d561cbSFan Zhang 				0xdb, 0x8b, 0x86, 0x44, 0xb6, 0xab
16241d561cbSFan Zhang 
16341d561cbSFan Zhang 			},
16441d561cbSFan Zhang 			.len = 14,
16541d561cbSFan Zhang 		},
16641d561cbSFan Zhang };
16741d561cbSFan Zhang 
16841d561cbSFan Zhang 
16941d561cbSFan Zhang static struct fips_dev_self_test_vector
17041d561cbSFan Zhang SELF_TEST_SHA256_HMAC_test_vector = {
17141d561cbSFan Zhang 		.name = "SELF_TEST_SHA256_HMAC_test_vector",
17241d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
17341d561cbSFan Zhang 		.auth = {
17441d561cbSFan Zhang 			.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
17541d561cbSFan Zhang 		},
17641d561cbSFan Zhang 		.input = {
17741d561cbSFan Zhang 			.data = {
17841d561cbSFan Zhang 				0x1c, 0x43, 0x96, 0xf7, 0xb7, 0xf9, 0x22, 0x8e,
17941d561cbSFan Zhang 				0x83, 0x2a, 0x13, 0x69, 0x20, 0x02, 0xba, 0x2a,
18041d561cbSFan Zhang 				0xff, 0x43, 0x9d, 0xcb, 0x7f, 0xdd, 0xbf, 0xd4,
18141d561cbSFan Zhang 				0x56, 0xc0, 0x22, 0xd1, 0x33, 0xee, 0x89, 0x03,
18241d561cbSFan Zhang 				0xa2, 0xd4, 0x82, 0x56, 0x2f, 0xda, 0xa4, 0x93,
18341d561cbSFan Zhang 				0xce, 0x39, 0x16, 0xd7, 0x7a, 0x0c, 0x51, 0x44,
18441d561cbSFan Zhang 				0x1d, 0xab, 0x26, 0xf6, 0xb0, 0x34, 0x02, 0x38,
18541d561cbSFan Zhang 				0xa3, 0x6a, 0x71, 0xf8, 0x7f, 0xc3, 0xe1, 0x79,
18641d561cbSFan Zhang 				0xca, 0xbc, 0xa9, 0x48, 0x2b, 0x70, 0x49, 0x71,
18741d561cbSFan Zhang 				0xce, 0x69, 0xf3, 0xf2, 0x0a, 0xb6, 0x4b, 0x70,
18841d561cbSFan Zhang 				0x41, 0x3d, 0x6c, 0x29, 0x08, 0x53, 0x2b, 0x2a,
18941d561cbSFan Zhang 				0x88, 0x8a, 0x9f, 0xc2, 0x24, 0xca, 0xe1, 0x36,
19041d561cbSFan Zhang 				0x5d, 0xa4, 0x10, 0xb6, 0xf2, 0xe2, 0x98, 0x90,
19141d561cbSFan Zhang 				0x4b, 0x63, 0xb4, 0xa4, 0x17, 0x26, 0x32, 0x18,
19241d561cbSFan Zhang 				0x35, 0xa4, 0x77, 0x4d, 0xd0, 0x63, 0xc2, 0x11,
19341d561cbSFan Zhang 				0xcf, 0xc8, 0xb5, 0x16, 0x6c, 0x2d, 0x11, 0xa2
19441d561cbSFan Zhang 			},
19541d561cbSFan Zhang 			.len = 128,
19641d561cbSFan Zhang 		},
19741d561cbSFan Zhang 		.key = {
19841d561cbSFan Zhang 			.data = {
19941d561cbSFan Zhang 				0x54, 0x48, 0x99, 0x8f, 0x9d, 0x8f, 0x98, 0x53,
20041d561cbSFan Zhang 				0x4a, 0xdd, 0xf0, 0xc8, 0xba, 0x63, 0x1c, 0x49,
20141d561cbSFan Zhang 				0x6b, 0xf8, 0xa8, 0x00, 0x6c, 0xbb, 0x46, 0xad,
20241d561cbSFan Zhang 				0x15, 0xfa, 0x1f, 0xa2, 0xf5, 0x53, 0x67, 0x12,
20341d561cbSFan Zhang 				0x0c, 0x19, 0x34, 0x8c, 0x3a, 0xfa, 0x90, 0xc3
20441d561cbSFan Zhang 			},
20541d561cbSFan Zhang 			.len = 40,
20641d561cbSFan Zhang 		},
20741d561cbSFan Zhang 		.digest = {
20841d561cbSFan Zhang 			.data = {
20941d561cbSFan Zhang 				0x7e, 0x8c, 0xba, 0x9d, 0xd9, 0xf0, 0x6e, 0xbd,
21041d561cbSFan Zhang 				0xd7, 0xf9, 0x2e, 0x0f, 0x1a, 0x67, 0xc7, 0xf4,
21141d561cbSFan Zhang 				0xdf, 0x52, 0x69, 0x3c, 0x21, 0x2b, 0xdd, 0x84,
21241d561cbSFan Zhang 				0xf6, 0x73, 0x70, 0xb3, 0x51, 0x53, 0x3c, 0x6c
21341d561cbSFan Zhang 			},
21441d561cbSFan Zhang 			.len = 32,
21541d561cbSFan Zhang 		},
21641d561cbSFan Zhang };
21741d561cbSFan Zhang 
21841d561cbSFan Zhang /* HMAC count=34 L=48 SHA384 GENERATE*/
21941d561cbSFan Zhang static struct fips_dev_self_test_vector
22041d561cbSFan Zhang SELF_TEST_SHA384_HMAC_test_vector = {
22141d561cbSFan Zhang 		.name = "SELF_TEST_SHA384_HMAC_test_vector",
22241d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
22341d561cbSFan Zhang 		.auth = {
22441d561cbSFan Zhang 			.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
22541d561cbSFan Zhang 		},
22641d561cbSFan Zhang 		.input = {
22741d561cbSFan Zhang 			.data = {
22841d561cbSFan Zhang 				0xf5, 0x10, 0x86, 0xfe, 0x78, 0x15, 0x0f, 0xe4,
22941d561cbSFan Zhang 				0x8b, 0xd1, 0x41, 0x5a, 0x47, 0x85, 0xac, 0xc0,
23041d561cbSFan Zhang 				0x5a, 0xb8, 0x0e, 0xf0, 0x0b, 0x29, 0x75, 0xce,
23141d561cbSFan Zhang 				0x78, 0x07, 0xa4, 0x21, 0x22, 0x64, 0xb8, 0xa1,
23241d561cbSFan Zhang 				0xac, 0xe8, 0x0b, 0x50, 0xe0, 0xc2, 0x59, 0x0e,
23341d561cbSFan Zhang 				0xf3, 0xe4, 0x21, 0x68, 0x0a, 0x70, 0x4e, 0xb2,
23441d561cbSFan Zhang 				0xfc, 0x6d, 0x17, 0x55, 0x5a, 0xbf, 0x24, 0x69,
23541d561cbSFan Zhang 				0xad, 0x56, 0xf2, 0x87, 0xfe, 0xa5, 0x78, 0xd8,
23641d561cbSFan Zhang 				0x9c, 0x56, 0x0b, 0x72, 0x19, 0x3c, 0x7f, 0xe5,
23741d561cbSFan Zhang 				0x96, 0x89, 0x8f, 0x10, 0x40, 0x41, 0x7e, 0x3a,
23841d561cbSFan Zhang 				0x1b, 0xee, 0xff, 0x5e, 0xff, 0x96, 0x53, 0xc5,
23941d561cbSFan Zhang 				0xe0, 0xea, 0xb1, 0xda, 0x52, 0xc0, 0xea, 0x3b,
24041d561cbSFan Zhang 				0x4b, 0xc3, 0x4d, 0x0c, 0x2b, 0x69, 0xc8, 0x90,
24141d561cbSFan Zhang 				0xfb, 0x26, 0x51, 0xfa, 0xf2, 0xe0, 0x84, 0x80,
24241d561cbSFan Zhang 				0x3e, 0xa2, 0x8e, 0xb2, 0x01, 0x94, 0x49, 0x0a,
24341d561cbSFan Zhang 				0x99, 0x2b, 0xa8, 0xc4, 0x24, 0x9d, 0x56, 0xef
24441d561cbSFan Zhang 			},
24541d561cbSFan Zhang 			.len = 128,
24641d561cbSFan Zhang 		},
24741d561cbSFan Zhang 		.key = {
24841d561cbSFan Zhang 			.data = {
24941d561cbSFan Zhang 				0x91, 0x7a, 0x69, 0x8c, 0x82, 0xf4, 0x4f, 0x19,
25041d561cbSFan Zhang 				0x57, 0x3b, 0x64, 0x5c, 0x48, 0x79, 0xb8, 0x73,
25141d561cbSFan Zhang 				0x0b, 0x58, 0xdf, 0xf4, 0xed, 0xc6, 0xa0, 0xd3,
25241d561cbSFan Zhang 				0x21, 0xf5, 0xf1, 0x86, 0x58, 0xa5, 0x24, 0x66,
25341d561cbSFan Zhang 				0x92, 0xa5, 0x5b, 0x59, 0x33, 0x97, 0x41, 0xae,
25441d561cbSFan Zhang 				0x59, 0xf5, 0xfc, 0x48, 0x6d, 0x51, 0x5d, 0xff,
25541d561cbSFan Zhang 				0xf8, 0xe1
25641d561cbSFan Zhang 			},
25741d561cbSFan Zhang 			.len = 50,
25841d561cbSFan Zhang 		},
25941d561cbSFan Zhang 		.digest = {
26041d561cbSFan Zhang 			.data = {
26141d561cbSFan Zhang 				0x77, 0xbf, 0x56, 0x15, 0xec, 0x52, 0xf7, 0x06,
26241d561cbSFan Zhang 				0xca, 0x74, 0x64, 0x01, 0xe9, 0xfd, 0xe4, 0x3f,
26341d561cbSFan Zhang 				0x15, 0x60, 0x52, 0x37, 0xe5, 0x50, 0xb9, 0x3a,
26441d561cbSFan Zhang 				0x84, 0x72, 0xfd, 0x14, 0x4f, 0xc3, 0x9e, 0x5e,
26541d561cbSFan Zhang 				0xca, 0x0f, 0xe8, 0x90, 0x83, 0x88, 0x28, 0xa0
26641d561cbSFan Zhang 			},
26741d561cbSFan Zhang 			.len = 40,
26841d561cbSFan Zhang 		},
26941d561cbSFan Zhang };
27041d561cbSFan Zhang 
27141d561cbSFan Zhang /* HMAC count=28 L=64 SHA512 GENERATE*/
27241d561cbSFan Zhang static struct fips_dev_self_test_vector
27341d561cbSFan Zhang SELF_TEST_SHA512_HMAC_test_vector = {
27441d561cbSFan Zhang 		.name = "SELF_TEST_SHA512_HMAC_test_vector",
27541d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
27641d561cbSFan Zhang 		.auth = {
27741d561cbSFan Zhang 			.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
27841d561cbSFan Zhang 		},
27941d561cbSFan Zhang 		.input = {
28041d561cbSFan Zhang 			.data = {
28141d561cbSFan Zhang 				0x0a, 0x33, 0x1c, 0xe2, 0x00, 0x89, 0xb2, 0x9e,
28241d561cbSFan Zhang 				0x94, 0xb2, 0xc5, 0xf5, 0x18, 0xc8, 0xdb, 0xea,
28341d561cbSFan Zhang 				0xd4, 0x04, 0x17, 0xa2, 0xa8, 0xd5, 0x00, 0x18,
28441d561cbSFan Zhang 				0xf3, 0x2f, 0x85, 0x12, 0xb3, 0x26, 0x3d, 0x54,
28541d561cbSFan Zhang 				0xed, 0xbb, 0xf3, 0x13, 0x4f, 0xf6, 0x61, 0xac,
28641d561cbSFan Zhang 				0x14, 0x35, 0x3c, 0x96, 0x28, 0xc3, 0x71, 0x95,
28741d561cbSFan Zhang 				0x8c, 0xac, 0xaf, 0x31, 0xfd, 0xd0, 0x25, 0x67,
28841d561cbSFan Zhang 				0xd0, 0x37, 0x8d, 0x9e, 0x21, 0xa4, 0x69, 0xdd,
28941d561cbSFan Zhang 				0x2c, 0x6d, 0x8c, 0x3a, 0xfb, 0x89, 0xdd, 0x96,
29041d561cbSFan Zhang 				0x42, 0xeb, 0x58, 0x87, 0x87, 0x0e, 0x55, 0x96,
29141d561cbSFan Zhang 				0x85, 0xd2, 0x0d, 0xab, 0xd3, 0x86, 0x5a, 0xc5,
29241d561cbSFan Zhang 				0xc1, 0x46, 0xbe, 0xee, 0x83, 0x87, 0xa7, 0x6f,
29341d561cbSFan Zhang 				0x91, 0xf0, 0xf1, 0x40, 0x4d, 0x6c, 0xad, 0xc2,
29441d561cbSFan Zhang 				0xe6, 0x7d, 0x21, 0xb0, 0x7d, 0xd3, 0x0f, 0x53,
29541d561cbSFan Zhang 				0x87, 0x1d, 0x3b, 0xf6, 0x73, 0x1f, 0x27, 0x9a,
29641d561cbSFan Zhang 				0x8c, 0x04, 0x21, 0xeb, 0x20, 0xf6, 0x7f, 0x72
29741d561cbSFan Zhang 			},
29841d561cbSFan Zhang 			.len = 128,
29941d561cbSFan Zhang 		},
30041d561cbSFan Zhang 		.key = {
30141d561cbSFan Zhang 			.data = {
30241d561cbSFan Zhang 				0x39, 0xb8, 0x77, 0xb8, 0xe8, 0x2e, 0xcb, 0xd9,
30341d561cbSFan Zhang 				0x74, 0x03, 0x25, 0x82, 0x8f, 0xaf, 0x67, 0x21,
30441d561cbSFan Zhang 				0xc1, 0x29, 0x04, 0x6e, 0xb0, 0x13, 0x61, 0x44,
30541d561cbSFan Zhang 				0xa0, 0x31, 0x82, 0xb1, 0x36, 0x20, 0xe2, 0x49,
30641d561cbSFan Zhang 				0x81, 0x45, 0xa2, 0xbf, 0x3b, 0x03, 0xe6, 0xb6,
30741d561cbSFan Zhang 				0x4b, 0x31, 0x7d, 0xd4, 0x8f, 0xcb, 0xc0, 0x18,
30841d561cbSFan Zhang 				0xd9, 0xe7, 0xbc, 0x6e, 0x37, 0xeb, 0x93, 0x81,
30941d561cbSFan Zhang 				0x78, 0xfe, 0x1f, 0xd1, 0xeb, 0xbc, 0xd9, 0x05,
31041d561cbSFan Zhang 				0x6a, 0x2e, 0xf9, 0x82, 0x97, 0xf9, 0xdf, 0x3c,
31141d561cbSFan Zhang 				0x66, 0xd5, 0xb2, 0xcc, 0xdc, 0x41, 0x47, 0xc4,
31241d561cbSFan Zhang 				0x16, 0x76, 0x44, 0x3f, 0x8c, 0x99, 0x85, 0xbc,
31341d561cbSFan Zhang 				0x97, 0x34, 0xbe, 0x2c, 0x31, 0xe7, 0x62, 0x49,
31441d561cbSFan Zhang 				0xfc, 0x5b, 0xc4, 0x2a
31541d561cbSFan Zhang 			},
31641d561cbSFan Zhang 			.len = 100,
31741d561cbSFan Zhang 		},
31841d561cbSFan Zhang 		.digest = {
31941d561cbSFan Zhang 			.data = {
32041d561cbSFan Zhang 				0x97, 0x16, 0x8f, 0x55, 0x13, 0xc2, 0xe9, 0xbc,
32141d561cbSFan Zhang 				0x4b, 0xc5, 0x25, 0xce, 0x27, 0x03, 0x74, 0x0b,
32241d561cbSFan Zhang 				0xce, 0x1a, 0x06, 0xec, 0xfe, 0x99, 0xa5, 0x70,
32341d561cbSFan Zhang 				0xac, 0x66, 0xc8, 0x3e, 0xde, 0x96, 0x67, 0xcc,
32441d561cbSFan Zhang 				0x07, 0xed, 0xf6, 0x64, 0x61, 0x7c, 0xe5, 0x3c
32541d561cbSFan Zhang 			},
32641d561cbSFan Zhang 			.len = 40,
32741d561cbSFan Zhang 		},
32841d561cbSFan Zhang };
32941d561cbSFan Zhang 
33041d561cbSFan Zhang /* <-- AES CMAC --> */
33141d561cbSFan Zhang static struct fips_dev_self_test_vector
33241d561cbSFan Zhang SELF_TEST_AES_CMAC_test_vector = {
33341d561cbSFan Zhang 		.name = "SELF_TEST_AES_CMAC_test_vector",
33441d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AUTH,
33541d561cbSFan Zhang 		.auth = {
33641d561cbSFan Zhang 			.algo = RTE_CRYPTO_AUTH_AES_CMAC,
33741d561cbSFan Zhang 		},
33841d561cbSFan Zhang 		.input = {
33941d561cbSFan Zhang 			.data = {
34041d561cbSFan Zhang 				0x57, 0x88, 0xf6, 0x1e, 0x02, 0x30, 0x47, 0x91,
34141d561cbSFan Zhang 				0xb5, 0x2f, 0x40, 0x05, 0x7a, 0xbb, 0x4e, 0x04,
34241d561cbSFan Zhang 				0x46, 0x40, 0x3e, 0xf3, 0x74, 0x02, 0x53, 0xdf,
34341d561cbSFan Zhang 				0x72, 0x05, 0x96, 0x79, 0xbb, 0x2a, 0x6e, 0x5e,
34441d561cbSFan Zhang 				0x05, 0x9a, 0x70, 0x9c, 0xbb
34541d561cbSFan Zhang 			},
34641d561cbSFan Zhang 			.len = 37,
34741d561cbSFan Zhang 		},
34841d561cbSFan Zhang 		.key = {
34941d561cbSFan Zhang 			.data = {
35041d561cbSFan Zhang 				0x18, 0x42, 0x15, 0x14, 0x5d, 0xa4, 0x9d, 0xb4,
35141d561cbSFan Zhang 				0x17, 0xe8, 0xbd, 0xd5, 0x73, 0xd6, 0x28, 0x2d
35241d561cbSFan Zhang 			},
35341d561cbSFan Zhang 			.len = 16,
35441d561cbSFan Zhang 		},
35541d561cbSFan Zhang 		.digest = {
35641d561cbSFan Zhang 			.data = {
35741d561cbSFan Zhang 				0x8d, 0xa8, 0xcc, 0xa9, 0xb3, 0x6f, 0x68, 0x57,
35841d561cbSFan Zhang 				0x1c, 0x6c, 0x0e, 0x40, 0xa3, 0xf4, 0x10
35941d561cbSFan Zhang 			},
36041d561cbSFan Zhang 			.len = 15,
36141d561cbSFan Zhang 		},
36241d561cbSFan Zhang };
36341d561cbSFan Zhang 
36441d561cbSFan Zhang /* <-- AES CCM --> */
36541d561cbSFan Zhang static struct fips_dev_self_test_vector
36641d561cbSFan Zhang SELF_TEST_AES128_CCM_test_vector = {
36741d561cbSFan Zhang 		.name = "SELF_TEST_AES128_CCM_test_vector",
36841d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,
36941d561cbSFan Zhang 		.iv = {
37041d561cbSFan Zhang 			.data = {
37141d561cbSFan Zhang 				0x00, 0x50, 0x30, 0xF1, 0x84, 0x44, 0x08, 0xB5,
37241d561cbSFan Zhang 				0x03, 0x97, 0x76, 0xE7, 0x0C
37341d561cbSFan Zhang 			},
37441d561cbSFan Zhang 			.len = 13,
37541d561cbSFan Zhang 		},
37641d561cbSFan Zhang 		.aead = {
37741d561cbSFan Zhang 			.algo = RTE_CRYPTO_AEAD_AES_CCM,
37841d561cbSFan Zhang 			.aad = {
37941d561cbSFan Zhang 				.data = {
38041d561cbSFan Zhang 					/* 18 bytes padding for AAD */
38141d561cbSFan Zhang 					0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
38241d561cbSFan Zhang 					0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
38341d561cbSFan Zhang 					0x00, 0x00,
38441d561cbSFan Zhang 					0x08, 0x40, 0x0F, 0xD2, 0xE1, 0x28, 0xA5, 0x7C,
38541d561cbSFan Zhang 					0x50, 0x30, 0xF1, 0x84, 0x44, 0x08, 0xAB, 0xAE,
38641d561cbSFan Zhang 					0xA5, 0xB8, 0xFC, 0xBA, 0x00, 0x00
38741d561cbSFan Zhang 				},
38841d561cbSFan Zhang 				.len = 22,
38941d561cbSFan Zhang 			},
39041d561cbSFan Zhang 		},
39141d561cbSFan Zhang 		.input = {
39241d561cbSFan Zhang 			.data = {
39341d561cbSFan Zhang 				0xF8, 0xBA, 0x1A, 0x55, 0xD0, 0x2F, 0x85, 0xAE,
39441d561cbSFan Zhang 				0x96, 0x7B, 0xB6, 0x2F, 0xB6, 0xCD, 0xA8, 0xEB,
39541d561cbSFan Zhang 				0x7E, 0x78, 0xA0, 0x50
39641d561cbSFan Zhang 			},
39741d561cbSFan Zhang 			.len = 20,
39841d561cbSFan Zhang 		},
39941d561cbSFan Zhang 		.key = {
40041d561cbSFan Zhang 			.data = {
40141d561cbSFan Zhang 				0xC9, 0x7C, 0x1F, 0x67, 0xCE, 0x37, 0x11, 0x85,
40241d561cbSFan Zhang 				0x51, 0x4A, 0x8A, 0x19, 0xF2, 0xBD, 0xD5, 0x2F
40341d561cbSFan Zhang 			},
40441d561cbSFan Zhang 			.len = 16,
40541d561cbSFan Zhang 		},
40641d561cbSFan Zhang 		.output = {
40741d561cbSFan Zhang 			.data = {
40841d561cbSFan Zhang 				0xF3, 0xD0, 0xA2, 0xFE, 0x9A, 0x3D, 0xBF, 0x23,
40941d561cbSFan Zhang 				0x42, 0xA6, 0x43, 0xE4, 0x32, 0x46, 0xE8, 0x0C,
41041d561cbSFan Zhang 				0x3C, 0x04, 0xD0, 0x19
41141d561cbSFan Zhang 			},
41241d561cbSFan Zhang 			.len = 20,
41341d561cbSFan Zhang 		},
41441d561cbSFan Zhang 		.digest = {
41541d561cbSFan Zhang 			.data = {
41641d561cbSFan Zhang 				0x78, 0x45, 0xCE, 0x0B, 0x16, 0xF9, 0x76, 0x23
41741d561cbSFan Zhang 			},
41841d561cbSFan Zhang 			.len = 8,
41941d561cbSFan Zhang 		},
42041d561cbSFan Zhang };
42141d561cbSFan Zhang 
42241d561cbSFan Zhang /* <-- AES CBC --> */
42341d561cbSFan Zhang static struct fips_dev_self_test_vector
42441d561cbSFan Zhang SELF_TEST_AES128_CBC_test_vector = {
42541d561cbSFan Zhang 		.name = "SELF_TEST_AES128_CBC_test_vector",
42641d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
42741d561cbSFan Zhang 
42841d561cbSFan Zhang 		.iv = {
42941d561cbSFan Zhang 			.data = {
43041d561cbSFan Zhang 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
43141d561cbSFan Zhang 				0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
43241d561cbSFan Zhang 			},
43341d561cbSFan Zhang 			.len = 16,
43441d561cbSFan Zhang 		},
43541d561cbSFan Zhang 		.cipher = {
43641d561cbSFan Zhang 			.algo = RTE_CRYPTO_CIPHER_AES_CBC,
43741d561cbSFan Zhang 		},
43841d561cbSFan Zhang 		.input = {
43941d561cbSFan Zhang 			.data = {
44041d561cbSFan Zhang 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
44141d561cbSFan Zhang 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
44241d561cbSFan Zhang 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
44341d561cbSFan Zhang 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
44441d561cbSFan Zhang 			},
44541d561cbSFan Zhang 			.len = 32,
44641d561cbSFan Zhang 		},
44741d561cbSFan Zhang 		.key = {
44841d561cbSFan Zhang 			.data = {
44941d561cbSFan Zhang 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
45041d561cbSFan Zhang 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
45141d561cbSFan Zhang 			},
45241d561cbSFan Zhang 			.len = 16,
45341d561cbSFan Zhang 		},
45441d561cbSFan Zhang 		.output = {
45541d561cbSFan Zhang 			.data = {
45641d561cbSFan Zhang 				0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
45741d561cbSFan Zhang 				0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
45841d561cbSFan Zhang 				0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
45941d561cbSFan Zhang 				0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
46041d561cbSFan Zhang 			},
46141d561cbSFan Zhang 			.len = 32,
46241d561cbSFan Zhang 		},
46341d561cbSFan Zhang };
46441d561cbSFan Zhang 
46541d561cbSFan Zhang static struct fips_dev_self_test_vector
46641d561cbSFan Zhang SELF_TEST_AES192_CBC_test_vector = {
46741d561cbSFan Zhang 		.name = "SELF_TEST_AES192_CBC_test_vector",
46841d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
46941d561cbSFan Zhang 
47041d561cbSFan Zhang 		.iv = {
47141d561cbSFan Zhang 			.data = {
47241d561cbSFan Zhang 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
47341d561cbSFan Zhang 				0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
47441d561cbSFan Zhang 			},
47541d561cbSFan Zhang 			.len = 16,
47641d561cbSFan Zhang 		},
47741d561cbSFan Zhang 		.cipher = {
47841d561cbSFan Zhang 			.algo = RTE_CRYPTO_CIPHER_AES_CBC,
47941d561cbSFan Zhang 		},
48041d561cbSFan Zhang 		.input = {
48141d561cbSFan Zhang 			.data = {
48241d561cbSFan Zhang 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
48341d561cbSFan Zhang 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
48441d561cbSFan Zhang 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
48541d561cbSFan Zhang 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
48641d561cbSFan Zhang 			},
48741d561cbSFan Zhang 			.len = 32,
48841d561cbSFan Zhang 		},
48941d561cbSFan Zhang 		.key = {
49041d561cbSFan Zhang 			.data = {
49141d561cbSFan Zhang 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
49241d561cbSFan Zhang 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,
49341d561cbSFan Zhang 				0xD4, 0xC3, 0xA3, 0xAA, 0x33, 0x62, 0x61, 0xE0
49441d561cbSFan Zhang 			},
49541d561cbSFan Zhang 			.len = 24,
49641d561cbSFan Zhang 		},
49741d561cbSFan Zhang 		.output = {
49841d561cbSFan Zhang 			.data = {
49941d561cbSFan Zhang 				0x45, 0xEE, 0x9A, 0xEA, 0x3C, 0x03, 0xFC, 0x4C,
50041d561cbSFan Zhang 				0x84, 0x36, 0xB0, 0xDA, 0xB0, 0xDC, 0xF3, 0x5B,
50141d561cbSFan Zhang 				0x75, 0xA7, 0xBE, 0x0E, 0xC0, 0x8D, 0x6C, 0xF8,
50241d561cbSFan Zhang 				0xC1, 0x0F, 0xD0, 0x35, 0x1D, 0x82, 0xAE, 0x7C,
50341d561cbSFan Zhang 			},
50441d561cbSFan Zhang 			.len = 32,
50541d561cbSFan Zhang 		},
50641d561cbSFan Zhang };
50741d561cbSFan Zhang 
50841d561cbSFan Zhang /* AES-256 CBC ENCRYPT*/
50941d561cbSFan Zhang static struct fips_dev_self_test_vector
51041d561cbSFan Zhang SELF_TEST_AES256_CBC_test_vector = {
51141d561cbSFan Zhang 		.name = "SELF_TEST_AES256_CBC_test_vector",
51241d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
51341d561cbSFan Zhang 
51441d561cbSFan Zhang 		.iv = {
51541d561cbSFan Zhang 			.data = {
51641d561cbSFan Zhang 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
51741d561cbSFan Zhang 				0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
51841d561cbSFan Zhang 			},
51941d561cbSFan Zhang 			.len = 16,
52041d561cbSFan Zhang 		},
52141d561cbSFan Zhang 		.cipher = {
52241d561cbSFan Zhang 			.algo = RTE_CRYPTO_CIPHER_AES_CBC,
52341d561cbSFan Zhang 		},
52441d561cbSFan Zhang 		.input = {
52541d561cbSFan Zhang 			.data = {
52641d561cbSFan Zhang 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
52741d561cbSFan Zhang 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
52841d561cbSFan Zhang 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
52941d561cbSFan Zhang 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
53041d561cbSFan Zhang 			},
53141d561cbSFan Zhang 			.len = 32,
53241d561cbSFan Zhang 		},
53341d561cbSFan Zhang 		.key = {
53441d561cbSFan Zhang 			.data = {
53541d561cbSFan Zhang 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
53641d561cbSFan Zhang 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,
53741d561cbSFan Zhang 				0xD4, 0xC3, 0xA3, 0xAA, 0x33, 0x62, 0x61, 0xE0,
53841d561cbSFan Zhang 				0x37, 0x07, 0xB8, 0x23, 0xA2, 0xA3, 0xB5, 0x8D
53941d561cbSFan Zhang 			},
54041d561cbSFan Zhang 			.len = 32,
54141d561cbSFan Zhang 		},
54241d561cbSFan Zhang 		.output = {
54341d561cbSFan Zhang 			.data = {
54441d561cbSFan Zhang 				0xF3, 0xDD, 0xF0, 0x0B, 0xFF, 0xA2, 0x6A, 0x04,
54541d561cbSFan Zhang 				0xBE, 0xDA, 0x52, 0xA6, 0xFE, 0x6B, 0xA6, 0xA7,
54641d561cbSFan Zhang 				0x48, 0x1D, 0x7D, 0x98, 0x65, 0xDB, 0xEF, 0x06,
54741d561cbSFan Zhang 				0x26, 0xB5, 0x8E, 0xEB, 0x05, 0x0E, 0x77, 0x98,
54841d561cbSFan Zhang 			},
54941d561cbSFan Zhang 			.len = 32,
55041d561cbSFan Zhang 		},
55141d561cbSFan Zhang };
55241d561cbSFan Zhang 
55341d561cbSFan Zhang /* DES-128 CBC ENCRYPT*/
55441d561cbSFan Zhang static struct fips_dev_self_test_vector
55541d561cbSFan Zhang SELF_TEST_3DES_2KEY_CBC_test_vector = {
55641d561cbSFan Zhang 		.name = "SELF_TEST_3DES_2KEY_CBC_test_vector",
55741d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
55841d561cbSFan Zhang 		.iv = {
55941d561cbSFan Zhang 			.data = {
56041d561cbSFan Zhang 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
56141d561cbSFan Zhang 			},
56241d561cbSFan Zhang 			.len = 8,
56341d561cbSFan Zhang 		},
56441d561cbSFan Zhang 		.cipher = {
56541d561cbSFan Zhang 			.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
56641d561cbSFan Zhang 		},
56741d561cbSFan Zhang 		.input = {
56841d561cbSFan Zhang 			.data = {
56941d561cbSFan Zhang 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
57041d561cbSFan Zhang 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
57141d561cbSFan Zhang 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
57241d561cbSFan Zhang 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
57341d561cbSFan Zhang 			},
57441d561cbSFan Zhang 			.len = 32,
57541d561cbSFan Zhang 		},
57641d561cbSFan Zhang 		.key = {
57741d561cbSFan Zhang 			.data = {
57841d561cbSFan Zhang 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
57941d561cbSFan Zhang 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,
58041d561cbSFan Zhang 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2
58141d561cbSFan Zhang 			},
58241d561cbSFan Zhang 			.len = 24,
58341d561cbSFan Zhang 		},
58441d561cbSFan Zhang 		.output = {
58541d561cbSFan Zhang 			.data = {
58641d561cbSFan Zhang 				0x28, 0x2a, 0xff, 0x15, 0x5c, 0xdf, 0xd9, 0x6b,
58741d561cbSFan Zhang 				0x54, 0xbc, 0x7b, 0xfb, 0xc5, 0x64, 0x4d, 0xdd,
58841d561cbSFan Zhang 				0x3e, 0xf2, 0x9e, 0xb7, 0x53, 0x65, 0x37, 0x05,
58941d561cbSFan Zhang 				0xe0, 0xdf, 0xae, 0xf7, 0xc9, 0x27, 0xe4, 0xec,
59041d561cbSFan Zhang 			},
59141d561cbSFan Zhang 			.len = 32,
59241d561cbSFan Zhang 		},
59341d561cbSFan Zhang };
59441d561cbSFan Zhang 
59541d561cbSFan Zhang static struct fips_dev_self_test_vector
59641d561cbSFan Zhang SELF_TEST_3DES_3KEY_CBC_test_vector = {
59741d561cbSFan Zhang 		.name = "SELF_TEST_3DES_3KEY_CBC_test_vector",
59841d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
59941d561cbSFan Zhang 
60041d561cbSFan Zhang 		.iv = {
60141d561cbSFan Zhang 			.data = {
60241d561cbSFan Zhang 				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
60341d561cbSFan Zhang 			},
60441d561cbSFan Zhang 			.len = 8,
60541d561cbSFan Zhang 		},
60641d561cbSFan Zhang 		.cipher = {
60741d561cbSFan Zhang 			.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
60841d561cbSFan Zhang 		},
60941d561cbSFan Zhang 		.input = {
61041d561cbSFan Zhang 			.data = {
61141d561cbSFan Zhang 				0x57, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6C,
61241d561cbSFan Zhang 				0x6F, 0x75, 0x73, 0x79, 0x20, 0x65, 0x61, 0x72,
61341d561cbSFan Zhang 				0x74, 0x68, 0x21, 0x20, 0x48, 0x65, 0x20, 0x77,
61441d561cbSFan Zhang 				0x6F, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
61541d561cbSFan Zhang 			},
61641d561cbSFan Zhang 			.len = 32,
61741d561cbSFan Zhang 		},
61841d561cbSFan Zhang 		.key = {
61941d561cbSFan Zhang 			.data = {
62041d561cbSFan Zhang 				0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
62141d561cbSFan Zhang 				0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,
62241d561cbSFan Zhang 				0xD4, 0xC3, 0xA3, 0xAA, 0x33, 0x62, 0x61, 0xE0
62341d561cbSFan Zhang 			},
62441d561cbSFan Zhang 			.len = 24,
62541d561cbSFan Zhang 		},
62641d561cbSFan Zhang 		.output = {
62741d561cbSFan Zhang 			.data = {
62841d561cbSFan Zhang 				0xd0, 0xc9, 0xdc, 0x51, 0x29, 0x97, 0x03, 0x64,
62941d561cbSFan Zhang 				0xcd, 0x22, 0xba, 0x3d, 0x2b, 0xbc, 0x21, 0x37,
63041d561cbSFan Zhang 				0x7b, 0x1e, 0x29, 0x23, 0xeb, 0x51, 0x6e, 0xac,
63141d561cbSFan Zhang 				0xbe, 0x5b, 0xd3, 0x67, 0xe0, 0x3f, 0xc3, 0xb5,
63241d561cbSFan Zhang 			},
63341d561cbSFan Zhang 			.len = 32,
63441d561cbSFan Zhang 		},
63541d561cbSFan Zhang };
63641d561cbSFan Zhang 
63741d561cbSFan Zhang /* <-- AES GCM --> */
63841d561cbSFan Zhang static struct fips_dev_self_test_vector
63941d561cbSFan Zhang SELF_TEST_AES128_GCM_encrypt_test_vector = {
64041d561cbSFan Zhang 		.name = "SELF_TEST_AES128_GCM_encrypt_test_vector",
64141d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,
64241d561cbSFan Zhang 
64341d561cbSFan Zhang 		.iv = {
64441d561cbSFan Zhang 			.data = {
64541d561cbSFan Zhang 				0x5a, 0xdb, 0x96, 0x09, 0xdb, 0xae, 0xb5, 0x8c,
64641d561cbSFan Zhang 				0xbd, 0x6e, 0x72, 0x75
64741d561cbSFan Zhang 			},
64841d561cbSFan Zhang 			.len = 12,
64941d561cbSFan Zhang 		},
65041d561cbSFan Zhang 		.aead = {
65141d561cbSFan Zhang 			.algo = RTE_CRYPTO_AEAD_AES_GCM,
65241d561cbSFan Zhang 			.aad = {
65341d561cbSFan Zhang 				.data = {
65441d561cbSFan Zhang 					0x88, 0x31, 0x9d, 0x6e, 0x1d, 0x3f, 0xfa, 0x5f,
65541d561cbSFan Zhang 					0x98, 0x71, 0x99, 0x16, 0x6c, 0x8a, 0x9b, 0x56,
65641d561cbSFan Zhang 					0xc2, 0xae, 0xba, 0x5a
65741d561cbSFan Zhang 				},
65841d561cbSFan Zhang 				.len = 20,
65941d561cbSFan Zhang 			},
66041d561cbSFan Zhang 		},
66141d561cbSFan Zhang 		.input = {
66241d561cbSFan Zhang 			.data = {
66341d561cbSFan Zhang 				0x7c, 0x0e, 0x88, 0xc8, 0x88, 0x99, 0xa7, 0x79,
66441d561cbSFan Zhang 				0x22, 0x84, 0x65, 0x07, 0x47, 0x97, 0xcd, 0x4c,
66541d561cbSFan Zhang 				0x2e, 0x14, 0x98, 0xd2, 0x59, 0xb5, 0x43, 0x90,
66641d561cbSFan Zhang 				0xb8, 0x5e, 0x3e, 0xef, 0x1c, 0x02, 0xdf, 0x60,
66741d561cbSFan Zhang 				0xe7, 0x43, 0xf1, 0xb8, 0x40, 0x38, 0x2c, 0x4b,
66841d561cbSFan Zhang 				0xcc, 0xaf, 0x3b, 0xaf, 0xb4, 0xca, 0x84, 0x29,
66941d561cbSFan Zhang 				0xbe, 0xa0, 0x63
67041d561cbSFan Zhang 			},
67141d561cbSFan Zhang 			.len = 51,
67241d561cbSFan Zhang 		},
67341d561cbSFan Zhang 		.key = {
67441d561cbSFan Zhang 			.data = {
67541d561cbSFan Zhang 				0xfe, 0x47, 0xfc, 0xce, 0x5f, 0xc3, 0x26, 0x65,
67641d561cbSFan Zhang 				0xd2, 0xae, 0x39, 0x9e, 0x4e, 0xec, 0x72, 0xba
67741d561cbSFan Zhang 			},
67841d561cbSFan Zhang 			.len = 16,
67941d561cbSFan Zhang 		},
68041d561cbSFan Zhang 		.output = {
68141d561cbSFan Zhang 			.data = {
68241d561cbSFan Zhang 				0x98, 0xf4, 0x82, 0x6f, 0x05, 0xa2, 0x65, 0xe6,
68341d561cbSFan Zhang 				0xdd, 0x2b, 0xe8, 0x2d, 0xb2, 0x41, 0xc0, 0xfb,
68441d561cbSFan Zhang 				0xbb, 0xf9, 0xff, 0xb1, 0xc1, 0x73, 0xaa, 0x83,
68541d561cbSFan Zhang 				0x96, 0x4b, 0x7c, 0xf5, 0x39, 0x30, 0x43, 0x73,
68641d561cbSFan Zhang 				0x63, 0x65, 0x25, 0x3d, 0xdb, 0xc5, 0xdb, 0x87,
68741d561cbSFan Zhang 				0x78, 0x37, 0x14, 0x95, 0xda, 0x76, 0xd2, 0x69,
68841d561cbSFan Zhang 				0xe5, 0xdb, 0x3e
68941d561cbSFan Zhang 			},
69041d561cbSFan Zhang 			.len = 51,
69141d561cbSFan Zhang 		},
69241d561cbSFan Zhang 		.digest = {
69341d561cbSFan Zhang 			.data = {
69441d561cbSFan Zhang 				0x29, 0x1e, 0xf1, 0x98, 0x2e, 0x4d, 0xef, 0xed,
69541d561cbSFan Zhang 				0xaa, 0x22, 0x49, 0xf8, 0x98, 0x55, 0x6b, 0x47
69641d561cbSFan Zhang 			},
69741d561cbSFan Zhang 			.len = 16,
69841d561cbSFan Zhang 		},
69941d561cbSFan Zhang };
70041d561cbSFan Zhang 
70141d561cbSFan Zhang static struct fips_dev_self_test_vector
70241d561cbSFan Zhang SELF_TEST_AES192_GCM_encrypt_test_vector = {
70341d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,
70441d561cbSFan Zhang 		.name = "SELF_TEST_AES192_GCM_encrypt_test_vector",
70541d561cbSFan Zhang 		.iv = {
70641d561cbSFan Zhang 			.data = {
70741d561cbSFan Zhang 				0x0b, 0xd4, 0x4f, 0xf4, 0xd2, 0x0c, 0x15, 0xd0,
70841d561cbSFan Zhang 				0x4f, 0xc6, 0x1e, 0xe7
70941d561cbSFan Zhang 			},
71041d561cbSFan Zhang 			.len = 12,
71141d561cbSFan Zhang 		},
71241d561cbSFan Zhang 		.aead = {
71341d561cbSFan Zhang 			.algo = RTE_CRYPTO_AEAD_AES_GCM,
71441d561cbSFan Zhang 			.aad = {
71541d561cbSFan Zhang 				.data = {
71641d561cbSFan Zhang 					0x9e, 0xa4, 0x2c, 0x50, 0xa7, 0xfd, 0xb8, 0x5e,
71741d561cbSFan Zhang 					0x14, 0x1a, 0xa0, 0x84, 0xb4, 0x6b, 0xde, 0x12
71841d561cbSFan Zhang 				},
71941d561cbSFan Zhang 				.len = 16,
72041d561cbSFan Zhang 			},
72141d561cbSFan Zhang 		},
72241d561cbSFan Zhang 		.input = {
72341d561cbSFan Zhang 			.data = {
72441d561cbSFan Zhang 				0x56, 0x7c, 0xcb, 0x3f, 0xa0, 0xdb, 0x89, 0x70,
72541d561cbSFan Zhang 				0x8a, 0xf3, 0xff, 0x2b, 0xb0, 0x29, 0xdd, 0xec,
72641d561cbSFan Zhang 				0x52, 0xc6, 0x69, 0x47, 0x58, 0x5d, 0x29, 0x1a,
72741d561cbSFan Zhang 				0x28, 0x56, 0x4b, 0xf5, 0x6d, 0xb7, 0x06, 0xf7
72841d561cbSFan Zhang 			},
72941d561cbSFan Zhang 			.len = 32,
73041d561cbSFan Zhang 		},
73141d561cbSFan Zhang 		.key = {
73241d561cbSFan Zhang 			.data = {
73341d561cbSFan Zhang 				0x0d, 0x4a, 0x90, 0x0d, 0x1b, 0x0b, 0xb5, 0xb7,
73441d561cbSFan Zhang 				0xbe, 0x24, 0x38, 0xc2, 0xba, 0x48, 0xfc, 0x45,
73541d561cbSFan Zhang 				0x13, 0x4c, 0xc1, 0x98, 0x10, 0x8c, 0xf8, 0x85
73641d561cbSFan Zhang 			},
73741d561cbSFan Zhang 			.len = 24,
73841d561cbSFan Zhang 		},
73941d561cbSFan Zhang 		.output = {
74041d561cbSFan Zhang 			.data = {
74141d561cbSFan Zhang 				0x2f, 0x8a, 0x42, 0xcd, 0x18, 0x3b, 0x03, 0x14,
74241d561cbSFan Zhang 				0xfd, 0x20, 0xa3, 0xd9, 0x7d, 0x9e, 0x0c, 0x52,
74341d561cbSFan Zhang 				0x17, 0xb0, 0xf0, 0x88, 0xd2, 0xca, 0x87, 0xa8,
74441d561cbSFan Zhang 				0x29, 0x0d, 0x4b, 0xae, 0x69, 0xad, 0x83, 0xf5
74541d561cbSFan Zhang 			},
74641d561cbSFan Zhang 			.len = 32,
74741d561cbSFan Zhang 		},
74841d561cbSFan Zhang 		.digest = {
74941d561cbSFan Zhang 			.data = {
75041d561cbSFan Zhang 				0xde, 0x41, 0x45, 0x92, 0xd7, 0x7f, 0x2f, 0x0b,
75141d561cbSFan Zhang 				0x50, 0xdf, 0x4a, 0xec, 0x71, 0x4f, 0xad, 0x43
75241d561cbSFan Zhang 			},
75341d561cbSFan Zhang 			.len = 16,
75441d561cbSFan Zhang 		},
75541d561cbSFan Zhang };
75641d561cbSFan Zhang 
75741d561cbSFan Zhang static struct fips_dev_self_test_vector
75841d561cbSFan Zhang SELF_TEST_AES256_GCM_encrypt_test_vector = {
75941d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_AEAD,
76041d561cbSFan Zhang 		.name = "SELF_TEST_AES256_GCM_encrypt_test_vector",
76141d561cbSFan Zhang 		.iv = {
76241d561cbSFan Zhang 			.data = {
76341d561cbSFan Zhang 				0x5c, 0x1b, 0x21, 0xc8, 0x99, 0x8e, 0xd6, 0x29,
76441d561cbSFan Zhang 				0x90, 0x06, 0xd3, 0xf9
76541d561cbSFan Zhang 			},
76641d561cbSFan Zhang 			.len = 12,
76741d561cbSFan Zhang 		},
76841d561cbSFan Zhang 		.aead = {
76941d561cbSFan Zhang 			.algo = RTE_CRYPTO_AEAD_AES_GCM,
77041d561cbSFan Zhang 			.aad = {
77141d561cbSFan Zhang 				.data = {
77241d561cbSFan Zhang 					0x22, 0xed, 0x23, 0x59, 0x46, 0x23, 0x5a, 0x85,
77341d561cbSFan Zhang 					0xa4, 0x5b, 0xc5, 0xfa, 0xd7, 0x14, 0x0b, 0xfa
77441d561cbSFan Zhang 				},
77541d561cbSFan Zhang 				.len = 16,
77641d561cbSFan Zhang 			},
77741d561cbSFan Zhang 		},
77841d561cbSFan Zhang 		.input = {
77941d561cbSFan Zhang 			.data = {
78041d561cbSFan Zhang 				0xad, 0x42, 0x60, 0xe3, 0xcd, 0xc7, 0x6b, 0xcc,
78141d561cbSFan Zhang 				0x10, 0xc7, 0xb2, 0xc0, 0x6b, 0x80, 0xb3, 0xbe,
78241d561cbSFan Zhang 				0x94, 0x82, 0x58, 0xe5, 0xef, 0x20, 0xc5, 0x08,
78341d561cbSFan Zhang 				0xa8, 0x1f, 0x51, 0xe9, 0x6a, 0x51, 0x83, 0x88
78441d561cbSFan Zhang 			},
78541d561cbSFan Zhang 			.len = 32,
78641d561cbSFan Zhang 		},
78741d561cbSFan Zhang 		.key = {
78841d561cbSFan Zhang 			.data = {
78941d561cbSFan Zhang 				0x37, 0xcc, 0xdb, 0xa1, 0xd9, 0x29, 0xd6, 0x43,
79041d561cbSFan Zhang 				0x6c, 0x16, 0xbb, 0xa5, 0xb5, 0xff, 0x34, 0xde,
79141d561cbSFan Zhang 				0xec, 0x88, 0xed, 0x7d, 0xf3, 0xd1, 0x5d, 0x0f,
79241d561cbSFan Zhang 				0x4d, 0xdf, 0x80, 0xc0, 0xc7, 0x31, 0xee, 0x1f
79341d561cbSFan Zhang 			},
79441d561cbSFan Zhang 			.len = 32,
79541d561cbSFan Zhang 		},
79641d561cbSFan Zhang 		.output = {
79741d561cbSFan Zhang 			.data = {
79841d561cbSFan Zhang 				0x3b, 0x33, 0x5f, 0x8b, 0x08, 0xd3, 0x3c, 0xcd,
79941d561cbSFan Zhang 				0xca, 0xd2, 0x28, 0xa7, 0x47, 0x00, 0xf1, 0x00,
80041d561cbSFan Zhang 				0x75, 0x42, 0xa4, 0xd1, 0xe7, 0xfc, 0x1e, 0xbe,
80141d561cbSFan Zhang 				0x3f, 0x44, 0x7f, 0xe7, 0x1a, 0xf2, 0x98, 0x16
80241d561cbSFan Zhang 			},
80341d561cbSFan Zhang 			.len = 32,
80441d561cbSFan Zhang 		},
80541d561cbSFan Zhang 		.digest = {
80641d561cbSFan Zhang 			.data = {
80741d561cbSFan Zhang 				0x1f, 0xbf, 0x49, 0xcc, 0x46, 0xf4, 0x58, 0xbf,
80841d561cbSFan Zhang 				0x6e, 0x88, 0xf6, 0x37, 0x09, 0x75, 0xe6, 0xd4
80941d561cbSFan Zhang 			},
81041d561cbSFan Zhang 			.len = 16,
81141d561cbSFan Zhang 		},
81241d561cbSFan Zhang };
81341d561cbSFan Zhang 
81441d561cbSFan Zhang 
81541d561cbSFan Zhang /* <-- AES CTR --> */
81641d561cbSFan Zhang static struct fips_dev_self_test_vector
81741d561cbSFan Zhang SELF_TEST_AES128_CTR_test_vector = {
81841d561cbSFan Zhang 		.name = "SELF_TEST_AES128_CTR_test_vector",
81941d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
82041d561cbSFan Zhang 
82141d561cbSFan Zhang 		.iv = {
82241d561cbSFan Zhang 			.data = {
82341d561cbSFan Zhang 				0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
82441d561cbSFan Zhang 				0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
82541d561cbSFan Zhang 			},
82641d561cbSFan Zhang 			.len = 16,
82741d561cbSFan Zhang 		},
82841d561cbSFan Zhang 		.cipher = {
82941d561cbSFan Zhang 			.algo = RTE_CRYPTO_CIPHER_AES_CTR,
83041d561cbSFan Zhang 		},
83141d561cbSFan Zhang 		.input = {
83241d561cbSFan Zhang 			.data = {
83341d561cbSFan Zhang 				0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
83441d561cbSFan Zhang 				0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
83541d561cbSFan Zhang 				0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
83641d561cbSFan Zhang 				0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
83741d561cbSFan Zhang 			},
83841d561cbSFan Zhang 			.len = 32,
83941d561cbSFan Zhang 		},
84041d561cbSFan Zhang 		.key = {
84141d561cbSFan Zhang 			.data = {
84241d561cbSFan Zhang 				0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
84341d561cbSFan Zhang 				0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
84441d561cbSFan Zhang 			},
84541d561cbSFan Zhang 			.len = 16,
84641d561cbSFan Zhang 		},
84741d561cbSFan Zhang 		.output = {
84841d561cbSFan Zhang 			.data = {
84941d561cbSFan Zhang 				0x87, 0x4D, 0x61, 0x91, 0xB6, 0x20, 0xE3, 0x26,
85041d561cbSFan Zhang 				0x1B, 0xEF, 0x68, 0x64, 0x99, 0x0D, 0xB6, 0xCE,
85141d561cbSFan Zhang 				0x98, 0x06, 0xF6, 0x6B, 0x79, 0x70, 0xFD, 0xFF,
85241d561cbSFan Zhang 				0x86, 0x17, 0x18, 0x7B, 0xB9, 0xFF, 0xFD, 0xFF,
85341d561cbSFan Zhang 			},
85441d561cbSFan Zhang 			.len = 32,
85541d561cbSFan Zhang 		},
85641d561cbSFan Zhang };
85741d561cbSFan Zhang 
85841d561cbSFan Zhang static struct fips_dev_self_test_vector
85941d561cbSFan Zhang SELF_TEST_AES192_CTR_test_vector = {
86041d561cbSFan Zhang 		.name = "SELF_TEST_AES192_CTR_test_vector",
86141d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
86241d561cbSFan Zhang 
86341d561cbSFan Zhang 		.iv = {
86441d561cbSFan Zhang 			.data = {
86541d561cbSFan Zhang 				0x3F, 0x69, 0xA8, 0xCD, 0xE8, 0xF0, 0xEF, 0x40,
86641d561cbSFan Zhang 				0xB8, 0x7A, 0x4B, 0xED, 0x2B, 0xAF, 0xBF, 0x57
86741d561cbSFan Zhang 			},
86841d561cbSFan Zhang 			.len = 16,
86941d561cbSFan Zhang 		},
87041d561cbSFan Zhang 		.cipher = {
87141d561cbSFan Zhang 			.algo = RTE_CRYPTO_CIPHER_AES_CTR,
87241d561cbSFan Zhang 		},
87341d561cbSFan Zhang 		.input = {
87441d561cbSFan Zhang 			.data = {
87541d561cbSFan Zhang 				0x01, 0x0F, 0x10, 0x1F, 0x20, 0x1C, 0x0E, 0xB8,
87641d561cbSFan Zhang 				0xFB, 0x5C, 0xCD, 0xCC, 0x1F, 0xF9, 0xAF, 0x0B,
87741d561cbSFan Zhang 				0x95, 0x03, 0x74, 0x99, 0x49, 0xE7, 0x62, 0x55,
87841d561cbSFan Zhang 				0xDA, 0xEA, 0x13, 0x20, 0x1D, 0xC6, 0xCC, 0xCC,
87941d561cbSFan Zhang 			},
88041d561cbSFan Zhang 			.len = 32,
88141d561cbSFan Zhang 		},
88241d561cbSFan Zhang 		.key = {
88341d561cbSFan Zhang 			.data = {
88441d561cbSFan Zhang 				0xCB, 0xC5, 0xED, 0x5B, 0xE7, 0x7C, 0xBD, 0x8C,
88541d561cbSFan Zhang 				0x50, 0xD9, 0x30, 0xF2, 0xB5, 0x6A, 0x0E, 0x5F,
88641d561cbSFan Zhang 				0xAA, 0xAE, 0xAD, 0xA2, 0x1F, 0x49, 0x52, 0xD4
88741d561cbSFan Zhang 			},
88841d561cbSFan Zhang 			.len = 24,
88941d561cbSFan Zhang 		},
89041d561cbSFan Zhang 		.output = {
89141d561cbSFan Zhang 			.data = {
89241d561cbSFan Zhang 				0x4A, 0x6C, 0xC8, 0xCC, 0x96, 0x2A, 0x13, 0x84,
89341d561cbSFan Zhang 				0x1C, 0x36, 0x88, 0xE9, 0xE5, 0x94, 0x70, 0xB2,
89441d561cbSFan Zhang 				0x14, 0x5B, 0x13, 0x80, 0xEA, 0xD8, 0x8D, 0x37,
89541d561cbSFan Zhang 				0xFD, 0x70, 0xA8, 0x83, 0xE8, 0x2B, 0x88, 0x1E,
89641d561cbSFan Zhang 			},
89741d561cbSFan Zhang 			.len = 32,
89841d561cbSFan Zhang 		},
89941d561cbSFan Zhang };
90041d561cbSFan Zhang 
90141d561cbSFan Zhang static struct fips_dev_self_test_vector
90241d561cbSFan Zhang SELF_TEST_AES256_CTR_test_vector = {
90341d561cbSFan Zhang 		.name = "SELF_TEST_AES256_CTR_test_vector",
90441d561cbSFan Zhang 		.operation_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
90541d561cbSFan Zhang 
90641d561cbSFan Zhang 		.iv = {
90741d561cbSFan Zhang 			.data = {
90841d561cbSFan Zhang 				0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
90941d561cbSFan Zhang 				0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
91041d561cbSFan Zhang 			},
91141d561cbSFan Zhang 			.len = 16,
91241d561cbSFan Zhang 		},
91341d561cbSFan Zhang 		.cipher = {
91441d561cbSFan Zhang 			.algo = RTE_CRYPTO_CIPHER_AES_CTR,
91541d561cbSFan Zhang 		},
91641d561cbSFan Zhang 		.input = {
91741d561cbSFan Zhang 			.data = {
91841d561cbSFan Zhang 				0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
91941d561cbSFan Zhang 				0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
92041d561cbSFan Zhang 				0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
92141d561cbSFan Zhang 				0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
92241d561cbSFan Zhang 			},
92341d561cbSFan Zhang 			.len = 32,
92441d561cbSFan Zhang 		},
92541d561cbSFan Zhang 		.key = {
92641d561cbSFan Zhang 			.data = {
92741d561cbSFan Zhang 				0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
92841d561cbSFan Zhang 				0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
92941d561cbSFan Zhang 				0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
93041d561cbSFan Zhang 				0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4
93141d561cbSFan Zhang 			},
93241d561cbSFan Zhang 			.len = 32,
93341d561cbSFan Zhang 		},
93441d561cbSFan Zhang 		.output = {
93541d561cbSFan Zhang 			.data = {
93641d561cbSFan Zhang 				0x60, 0x1E, 0xC3, 0x13, 0x77, 0x57, 0x89, 0xA5,
93741d561cbSFan Zhang 				0xB7, 0xA7, 0xF5, 0x04, 0xBB, 0xF3, 0xD2, 0x28,
93841d561cbSFan Zhang 				0xF4, 0x43, 0xE3, 0xCA, 0x4D, 0x62, 0xB5, 0x9A,
93941d561cbSFan Zhang 				0xCA, 0x84, 0xE9, 0x90, 0xCA, 0xCA, 0xF5, 0xC5,
94041d561cbSFan Zhang 			},
94141d561cbSFan Zhang 			.len = 32,
94241d561cbSFan Zhang 		},
94341d561cbSFan Zhang };
94441d561cbSFan Zhang 
94541d561cbSFan Zhang 
94641d561cbSFan Zhang struct fips_dev_self_test_vector
94741d561cbSFan Zhang *self_test_vectors[] = {
94841d561cbSFan Zhang 		&SELF_TEST_AES128_CBC_test_vector,
94941d561cbSFan Zhang 		&SELF_TEST_AES192_CBC_test_vector,
95041d561cbSFan Zhang 		&SELF_TEST_AES256_CBC_test_vector,
95141d561cbSFan Zhang 		&SELF_TEST_3DES_2KEY_CBC_test_vector,
95241d561cbSFan Zhang 		&SELF_TEST_3DES_3KEY_CBC_test_vector,
95341d561cbSFan Zhang 		&SELF_TEST_AES128_CCM_test_vector,
95441d561cbSFan Zhang 		&SELF_TEST_SHA1_HMAC_test_vector,
95541d561cbSFan Zhang 		&SELF_TEST_SHA224_HMAC_test_vector,
95641d561cbSFan Zhang 		&SELF_TEST_SHA256_HMAC_test_vector,
95741d561cbSFan Zhang 		&SELF_TEST_SHA384_HMAC_test_vector,
95841d561cbSFan Zhang 		&SELF_TEST_SHA512_HMAC_test_vector,
95941d561cbSFan Zhang 		&SELF_TEST_AES_CMAC_test_vector,
96041d561cbSFan Zhang 		&SELF_TEST_AES128_GCM_encrypt_test_vector,
96141d561cbSFan Zhang 		&SELF_TEST_AES192_GCM_encrypt_test_vector,
96241d561cbSFan Zhang 		&SELF_TEST_AES256_GCM_encrypt_test_vector,
96341d561cbSFan Zhang 		&SELF_TEST_AES128_CTR_test_vector,
96441d561cbSFan Zhang 		&SELF_TEST_AES192_CTR_test_vector,
96541d561cbSFan Zhang 		&SELF_TEST_AES256_CTR_test_vector,
96641d561cbSFan Zhang };
96741d561cbSFan Zhang 
96841d561cbSFan Zhang struct fips_dev_auto_test_env {
96941d561cbSFan Zhang 	struct rte_mempool *mpool;
97041d561cbSFan Zhang 	struct rte_mempool *op_pool;
97141d561cbSFan Zhang 	struct rte_mempool *sess_pool;
97241d561cbSFan Zhang 	struct rte_mempool *sess_priv_pool;
97341d561cbSFan Zhang 	struct rte_mbuf *mbuf;
97441d561cbSFan Zhang 	struct rte_crypto_op *op;
97541d561cbSFan Zhang };
97641d561cbSFan Zhang 
97741d561cbSFan Zhang typedef int (*fips_dev_self_test_prepare_xform_t)(uint8_t,
97841d561cbSFan Zhang 		struct rte_crypto_sym_xform *,
97941d561cbSFan Zhang 		struct fips_dev_self_test_vector *,
98041d561cbSFan Zhang 		uint32_t, uint8_t *,
98141d561cbSFan Zhang 		uint32_t);
98241d561cbSFan Zhang 
98341d561cbSFan Zhang typedef int (*fips_dev_self_test_prepare_op_t)(struct rte_crypto_op *,
98441d561cbSFan Zhang 		struct rte_mbuf *, struct rte_cryptodev_sym_session *,
98541d561cbSFan Zhang 		uint32_t, struct fips_dev_self_test_vector *);
98641d561cbSFan Zhang 
98741d561cbSFan Zhang typedef int (*fips_dev_self_test_check_result_t)(struct rte_crypto_op *,
98841d561cbSFan Zhang 		struct fips_dev_self_test_vector *, uint32_t);
98941d561cbSFan Zhang 
99041d561cbSFan Zhang struct fips_dev_self_test_ops {
99141d561cbSFan Zhang 	enum rte_crypto_sym_xform_type last_operation_type;
99241d561cbSFan Zhang 	fips_dev_self_test_prepare_xform_t prepare_xform;
99341d561cbSFan Zhang 	fips_dev_self_test_prepare_op_t prepare_op;
99441d561cbSFan Zhang 	fips_dev_self_test_check_result_t check_result;
99541d561cbSFan Zhang };
99641d561cbSFan Zhang 
99741d561cbSFan Zhang static int
99841d561cbSFan Zhang prepare_cipher_xform(uint8_t dev_id,
99941d561cbSFan Zhang 		struct rte_crypto_sym_xform *xform,
100041d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec,
100141d561cbSFan Zhang 		uint32_t dir,
100241d561cbSFan Zhang 		uint8_t *key,
100341d561cbSFan Zhang 		uint32_t neg_test)
100441d561cbSFan Zhang {
100541d561cbSFan Zhang 	const struct rte_cryptodev_symmetric_capability *cap;
100641d561cbSFan Zhang 	struct rte_cryptodev_sym_capability_idx cap_idx;
100741d561cbSFan Zhang 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
100841d561cbSFan Zhang 
100941d561cbSFan Zhang 	memset(xform, 0, sizeof(*xform));
101041d561cbSFan Zhang 
101141d561cbSFan Zhang 	/** negative test, key is xored */
101241d561cbSFan Zhang 	if (neg_test) {
101341d561cbSFan Zhang 		uint32_t i;
101441d561cbSFan Zhang 
101541d561cbSFan Zhang 		for (i = 0; i < vec->key.len; i++)
101641d561cbSFan Zhang 			key[i] ^= vec->key.data[i];
101741d561cbSFan Zhang 	} else
101841d561cbSFan Zhang 		memcpy(key, vec->key.data, vec->key.len);
101941d561cbSFan Zhang 
102041d561cbSFan Zhang 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
102141d561cbSFan Zhang 
102241d561cbSFan Zhang 	cipher_xform->algo = vec->cipher.algo;
102341d561cbSFan Zhang 	cipher_xform->op = (dir == self_test_dir_enc_auth_gen) ?
102441d561cbSFan Zhang 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
102541d561cbSFan Zhang 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
102641d561cbSFan Zhang 	cipher_xform->key.data = key;
102741d561cbSFan Zhang 	cipher_xform->key.length = vec->key.len;
102841d561cbSFan Zhang 	cipher_xform->iv.length = vec->iv.len;
102941d561cbSFan Zhang 	cipher_xform->iv.offset = IV_OFF;
103041d561cbSFan Zhang 
103141d561cbSFan Zhang 	cap_idx.algo.cipher = cipher_xform->algo;
103241d561cbSFan Zhang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
103341d561cbSFan Zhang 
103441d561cbSFan Zhang 	cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
103541d561cbSFan Zhang 	if (!cap) {
103641d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Failed to get capability for cdev %u\n",
103741d561cbSFan Zhang 				dev_id);
103841d561cbSFan Zhang 		return -EACCES;
103941d561cbSFan Zhang 	}
104041d561cbSFan Zhang 
104141d561cbSFan Zhang 	if (rte_cryptodev_sym_capability_check_cipher(cap,
104241d561cbSFan Zhang 			cipher_xform->key.length,
104341d561cbSFan Zhang 			cipher_xform->iv.length) != 0) {
104441d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "PMD %s key length %u IV length %u\n",
104541d561cbSFan Zhang 				rte_cryptodev_name_get(dev_id),
104641d561cbSFan Zhang 				cipher_xform->key.length,
104741d561cbSFan Zhang 				cipher_xform->iv.length);
104841d561cbSFan Zhang 		return -EACCES;
104941d561cbSFan Zhang 	}
105041d561cbSFan Zhang 
105141d561cbSFan Zhang 	return 0;
105241d561cbSFan Zhang }
105341d561cbSFan Zhang 
105441d561cbSFan Zhang static int
105541d561cbSFan Zhang prepare_auth_xform(uint8_t dev_id,
105641d561cbSFan Zhang 		struct rte_crypto_sym_xform *xform,
105741d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec,
105841d561cbSFan Zhang 		uint32_t dir,
105941d561cbSFan Zhang 		uint8_t *key,
106041d561cbSFan Zhang 		uint32_t neg_test)
106141d561cbSFan Zhang {
106241d561cbSFan Zhang 	const struct rte_cryptodev_symmetric_capability *cap;
106341d561cbSFan Zhang 	struct rte_cryptodev_sym_capability_idx cap_idx;
106441d561cbSFan Zhang 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
106541d561cbSFan Zhang 
106641d561cbSFan Zhang 	memset(xform, 0, sizeof(*xform));
106741d561cbSFan Zhang 
106841d561cbSFan Zhang 	/** negative test, key is xored */
106941d561cbSFan Zhang 	if (neg_test) {
107041d561cbSFan Zhang 		uint32_t i;
107141d561cbSFan Zhang 
107241d561cbSFan Zhang 		for (i = 0; i < vec->key.len; i++)
107341d561cbSFan Zhang 			key[i] ^= vec->key.data[i];
107441d561cbSFan Zhang 	} else
107541d561cbSFan Zhang 		memcpy(key, vec->key.data, vec->key.len);
107641d561cbSFan Zhang 
107741d561cbSFan Zhang 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
107841d561cbSFan Zhang 
107941d561cbSFan Zhang 	auth_xform->algo = vec->auth.algo;
108041d561cbSFan Zhang 	auth_xform->op = (dir == self_test_dir_enc_auth_gen) ?
108141d561cbSFan Zhang 			RTE_CRYPTO_AUTH_OP_GENERATE :
108241d561cbSFan Zhang 			RTE_CRYPTO_AUTH_OP_VERIFY;
108341d561cbSFan Zhang 	auth_xform->digest_length = vec->digest.len;
108441d561cbSFan Zhang 	auth_xform->key.data = key;
108541d561cbSFan Zhang 	auth_xform->key.length = vec->key.len;
108641d561cbSFan Zhang 
108741d561cbSFan Zhang 	cap_idx.algo.auth = auth_xform->algo;
108841d561cbSFan Zhang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
108941d561cbSFan Zhang 
109041d561cbSFan Zhang 	cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
109141d561cbSFan Zhang 	if (!cap) {
109241d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Failed to get capability for cdev %u\n",
109341d561cbSFan Zhang 				dev_id);
109441d561cbSFan Zhang 		return -EACCES;
109541d561cbSFan Zhang 	}
109641d561cbSFan Zhang 
109741d561cbSFan Zhang 	if (rte_cryptodev_sym_capability_check_auth(cap,
109841d561cbSFan Zhang 			auth_xform->key.length,
109941d561cbSFan Zhang 			auth_xform->digest_length, 0) != 0) {
110041d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "PMD %s key length %u Digest length %u\n",
110141d561cbSFan Zhang 				rte_cryptodev_name_get(dev_id),
110241d561cbSFan Zhang 				auth_xform->key.length,
110341d561cbSFan Zhang 				auth_xform->digest_length);
110441d561cbSFan Zhang 		return -EACCES;
110541d561cbSFan Zhang 	}
110641d561cbSFan Zhang 
110741d561cbSFan Zhang 	return 0;
110841d561cbSFan Zhang }
110941d561cbSFan Zhang 
111041d561cbSFan Zhang static int
111141d561cbSFan Zhang prepare_aead_xform(uint8_t dev_id,
111241d561cbSFan Zhang 		struct rte_crypto_sym_xform *xform,
111341d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec,
111441d561cbSFan Zhang 		uint32_t dir,
111541d561cbSFan Zhang 		uint8_t *key,
111641d561cbSFan Zhang 		uint32_t neg_test)
111741d561cbSFan Zhang {
111841d561cbSFan Zhang 	const struct rte_cryptodev_symmetric_capability *cap;
111941d561cbSFan Zhang 	struct rte_cryptodev_sym_capability_idx cap_idx;
112041d561cbSFan Zhang 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
112141d561cbSFan Zhang 
112241d561cbSFan Zhang 	memset(xform, 0, sizeof(*xform));
112341d561cbSFan Zhang 
112441d561cbSFan Zhang 	/** negative test, key is xored */
112541d561cbSFan Zhang 	if (neg_test) {
112641d561cbSFan Zhang 		uint32_t i;
112741d561cbSFan Zhang 
112841d561cbSFan Zhang 		for (i = 0; i < vec->key.len; i++)
112941d561cbSFan Zhang 			key[i] ^= vec->key.data[i];
113041d561cbSFan Zhang 	} else
113141d561cbSFan Zhang 		memcpy(key, vec->key.data, vec->key.len);
113241d561cbSFan Zhang 
113341d561cbSFan Zhang 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
113441d561cbSFan Zhang 
113541d561cbSFan Zhang 	aead_xform->algo = vec->aead.algo;
113641d561cbSFan Zhang 	aead_xform->op = (dir == self_test_dir_enc_auth_gen) ?
113741d561cbSFan Zhang 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
113841d561cbSFan Zhang 			RTE_CRYPTO_AEAD_OP_DECRYPT;
113941d561cbSFan Zhang 	aead_xform->aad_length = vec->aead.aad.len;
114041d561cbSFan Zhang 	aead_xform->digest_length = vec->digest.len;
114141d561cbSFan Zhang 	aead_xform->iv.offset = IV_OFF;
114241d561cbSFan Zhang 	aead_xform->iv.length = vec->iv.len;
114341d561cbSFan Zhang 	aead_xform->key.data = key;
114441d561cbSFan Zhang 	aead_xform->key.length = vec->key.len;
114541d561cbSFan Zhang 
114641d561cbSFan Zhang 	cap_idx.algo.aead = aead_xform->algo;
114741d561cbSFan Zhang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
114841d561cbSFan Zhang 
114941d561cbSFan Zhang 	cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
115041d561cbSFan Zhang 	if (!cap) {
115141d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Failed to get capability for cdev %u\n",
115241d561cbSFan Zhang 				dev_id);
115341d561cbSFan Zhang 		return -EACCES;
115441d561cbSFan Zhang 	}
115541d561cbSFan Zhang 
115641d561cbSFan Zhang 	if (rte_cryptodev_sym_capability_check_aead(cap,
115741d561cbSFan Zhang 			aead_xform->key.length,
115841d561cbSFan Zhang 			aead_xform->digest_length, aead_xform->aad_length,
115941d561cbSFan Zhang 			aead_xform->iv.length) != 0) {
116041d561cbSFan Zhang 		RTE_LOG(ERR, PMD,
116141d561cbSFan Zhang 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
116241d561cbSFan Zhang 				rte_cryptodev_name_get(dev_id),
116341d561cbSFan Zhang 				aead_xform->key.length,
116441d561cbSFan Zhang 				aead_xform->digest_length,
116541d561cbSFan Zhang 				aead_xform->aad_length,
116641d561cbSFan Zhang 				aead_xform->iv.length);
116741d561cbSFan Zhang 		return -EACCES;
116841d561cbSFan Zhang 	}
116941d561cbSFan Zhang 
117041d561cbSFan Zhang 	return 0;
117141d561cbSFan Zhang }
117241d561cbSFan Zhang 
117341d561cbSFan Zhang static int
117441d561cbSFan Zhang prepare_cipher_op(struct rte_crypto_op *op,
117541d561cbSFan Zhang 		struct rte_mbuf *mbuf,
117641d561cbSFan Zhang 		struct rte_cryptodev_sym_session *session,
117741d561cbSFan Zhang 		uint32_t dir,
117841d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec)
117941d561cbSFan Zhang {
118041d561cbSFan Zhang 	struct rte_crypto_sym_op *sym = op->sym;
118141d561cbSFan Zhang 	uint8_t *iv = rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFF);
118241d561cbSFan Zhang 	uint8_t *dst;
118341d561cbSFan Zhang 	const uint8_t *src;
118441d561cbSFan Zhang 	uint32_t len;
118541d561cbSFan Zhang 
118641d561cbSFan Zhang 	if (dir == self_test_dir_enc_auth_gen) {
118741d561cbSFan Zhang 		src = vec->input.data;
118841d561cbSFan Zhang 		len = vec->input.len;
118941d561cbSFan Zhang 	} else {
119041d561cbSFan Zhang 		src = vec->output.data;
119141d561cbSFan Zhang 		len = vec->output.len;
119241d561cbSFan Zhang 	}
119341d561cbSFan Zhang 
119441d561cbSFan Zhang 	sym->cipher.data.offset = 0;
119541d561cbSFan Zhang 	memcpy(iv, vec->iv.data, vec->iv.len);
119641d561cbSFan Zhang 
119741d561cbSFan Zhang 	dst = (uint8_t *)rte_pktmbuf_append(mbuf, len);
119841d561cbSFan Zhang 	if (!dst) {
119941d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Error %i: MBUF too small\n", -ENOMEM);
120041d561cbSFan Zhang 		return -ENOMEM;
120141d561cbSFan Zhang 	}
120241d561cbSFan Zhang 
120341d561cbSFan Zhang 	memcpy(dst, src, len);
120441d561cbSFan Zhang 
120541d561cbSFan Zhang 	sym->cipher.data.length = len;
120641d561cbSFan Zhang 
120741d561cbSFan Zhang 	rte_crypto_op_attach_sym_session(op, session);
120841d561cbSFan Zhang 
120941d561cbSFan Zhang 	return 0;
121041d561cbSFan Zhang }
121141d561cbSFan Zhang 
121241d561cbSFan Zhang static int
121341d561cbSFan Zhang prepare_auth_op(struct rte_crypto_op *op,
121441d561cbSFan Zhang 		struct rte_mbuf *mbuf,
121541d561cbSFan Zhang 		struct rte_cryptodev_sym_session *session,
121641d561cbSFan Zhang 		uint32_t dir,
121741d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec)
121841d561cbSFan Zhang {
121941d561cbSFan Zhang 	struct rte_crypto_sym_op *sym = op->sym;
122041d561cbSFan Zhang 	uint8_t *dst;
122141d561cbSFan Zhang 
122241d561cbSFan Zhang 	if (vec->input.len + vec->digest.len > RTE_MBUF_MAX_NB_SEGS) {
122341d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Error %i: Test data too long (%u).\n",
122441d561cbSFan Zhang 				-ENOMEM, vec->input.len + vec->digest.len);
122541d561cbSFan Zhang 		return -ENOMEM;
122641d561cbSFan Zhang 	}
122741d561cbSFan Zhang 
122841d561cbSFan Zhang 	sym->auth.data.offset = 0;
122941d561cbSFan Zhang 
123041d561cbSFan Zhang 	dst = (uint8_t *)rte_pktmbuf_append(mbuf, vec->input.len +
123141d561cbSFan Zhang 			vec->digest.len);
123241d561cbSFan Zhang 	if (!dst) {
123341d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Error %i: MBUF too small\n", -ENOMEM);
123441d561cbSFan Zhang 		return -ENOMEM;
123541d561cbSFan Zhang 	}
123641d561cbSFan Zhang 
123741d561cbSFan Zhang 	memcpy(dst, vec->input.data, vec->input.len);
123841d561cbSFan Zhang 	sym->auth.data.length = vec->input.len;
123941d561cbSFan Zhang 	sym->auth.digest.data = dst + vec->input.len;
124026e28801SFan Zhang 	sym->auth.digest.phys_addr = rte_pktmbuf_iova_offset(mbuf,
124126e28801SFan Zhang 			vec->input.len);
124241d561cbSFan Zhang 
124341d561cbSFan Zhang 	if (dir == self_test_dir_dec_auth_verify)
124441d561cbSFan Zhang 		memcpy(dst + vec->input.len, vec->digest.data, vec->digest.len);
124541d561cbSFan Zhang 
124641d561cbSFan Zhang 	rte_crypto_op_attach_sym_session(op, session);
124741d561cbSFan Zhang 
124841d561cbSFan Zhang 	return 0;
124941d561cbSFan Zhang }
125041d561cbSFan Zhang 
125141d561cbSFan Zhang static int
125241d561cbSFan Zhang prepare_aead_op(struct rte_crypto_op *op,
125341d561cbSFan Zhang 		struct rte_mbuf *mbuf,
125441d561cbSFan Zhang 		struct rte_cryptodev_sym_session *session,
125541d561cbSFan Zhang 		uint32_t dir,
125641d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec)
125741d561cbSFan Zhang {
125841d561cbSFan Zhang 	struct rte_crypto_sym_op *sym = op->sym;
125941d561cbSFan Zhang 	uint8_t *iv = rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFF);
126041d561cbSFan Zhang 	uint8_t *dst;
126141d561cbSFan Zhang 	const uint8_t *src;
126241d561cbSFan Zhang 	uint32_t len;
126341d561cbSFan Zhang 
126441d561cbSFan Zhang 	if (dir == self_test_dir_enc_auth_gen) {
126541d561cbSFan Zhang 		len = vec->input.len;
126641d561cbSFan Zhang 		src = vec->input.data;
126741d561cbSFan Zhang 	} else {
126841d561cbSFan Zhang 		len = vec->output.len;
126941d561cbSFan Zhang 		src = vec->output.data;
127041d561cbSFan Zhang 	}
127141d561cbSFan Zhang 
127241d561cbSFan Zhang 	if (vec->aead.algo == RTE_CRYPTO_AEAD_AES_CCM)
127341d561cbSFan Zhang 		memcpy(iv + 1, vec->iv.data, vec->iv.len);
127441d561cbSFan Zhang 	else
127541d561cbSFan Zhang 		memcpy(iv, vec->iv.data, vec->iv.len);
127641d561cbSFan Zhang 
127741d561cbSFan Zhang 	if (len + vec->digest.len > RTE_MBUF_MAX_NB_SEGS) {
127841d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Error %i: Test data too long (%u).\n",
127941d561cbSFan Zhang 				-ENOMEM, len + vec->digest.len);
128041d561cbSFan Zhang 		return -ENOMEM;
128141d561cbSFan Zhang 	}
128241d561cbSFan Zhang 
128326e28801SFan Zhang 	dst = (uint8_t *)rte_pktmbuf_append(mbuf, RTE_ALIGN_CEIL(len +
128426e28801SFan Zhang 			vec->digest.len, 16));
128541d561cbSFan Zhang 	if (!dst) {
128641d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Error %i: MBUF too small\n", -ENOMEM);
128741d561cbSFan Zhang 		return -ENOMEM;
128841d561cbSFan Zhang 	}
128941d561cbSFan Zhang 
129041d561cbSFan Zhang 	sym->m_src = mbuf;
129141d561cbSFan Zhang 	sym->aead.data.length = len;
129241d561cbSFan Zhang 	sym->aead.data.offset = 0;
129341d561cbSFan Zhang 	memcpy(dst, src, len);
129441d561cbSFan Zhang 
129526e28801SFan Zhang 	sym->aead.digest.data = dst + vec->input.len;
129626e28801SFan Zhang 	sym->aead.digest.phys_addr = rte_pktmbuf_iova_offset(mbuf,
129726e28801SFan Zhang 			vec->input.len);
129841d561cbSFan Zhang 	if (dir == self_test_dir_dec_auth_verify)
129941d561cbSFan Zhang 		memcpy(sym->aead.digest.data, vec->digest.data, vec->digest.len);
130041d561cbSFan Zhang 
130126e28801SFan Zhang 	len = (vec->aead.algo == RTE_CRYPTO_AEAD_AES_CCM) ?
130226e28801SFan Zhang 			(vec->aead.aad.len + AES_CCM_AAD_PAD_SIZE) :
130326e28801SFan Zhang 			vec->aead.aad.len;
130426e28801SFan Zhang 
130526e28801SFan Zhang 	dst = rte_malloc(NULL, len, 16);
130626e28801SFan Zhang 	if (!dst) {
130726e28801SFan Zhang 		RTE_LOG(ERR, PMD, "Error %i: Not enough memory\n", -ENOMEM);
130826e28801SFan Zhang 		return -ENOMEM;
130926e28801SFan Zhang 	}
131026e28801SFan Zhang 
131126e28801SFan Zhang 	sym->aead.aad.data = dst;
131226e28801SFan Zhang 	sym->aead.aad.phys_addr = rte_malloc_virt2iova(dst);
131326e28801SFan Zhang 	if (vec->aead.algo == RTE_CRYPTO_AEAD_AES_CCM)
131426e28801SFan Zhang 		memcpy(dst, vec->aead.aad.data,
131526e28801SFan Zhang 				vec->aead.aad.len + AES_CCM_AAD_PAD_SIZE);
131626e28801SFan Zhang 	else
131726e28801SFan Zhang 		memcpy(dst, vec->aead.aad.data,
131826e28801SFan Zhang 				vec->aead.aad.len);
131926e28801SFan Zhang 
132041d561cbSFan Zhang 	rte_crypto_op_attach_sym_session(op, session);
132141d561cbSFan Zhang 
132241d561cbSFan Zhang 	return 0;
132341d561cbSFan Zhang }
132441d561cbSFan Zhang 
132541d561cbSFan Zhang static int
132641d561cbSFan Zhang check_cipher_result(struct rte_crypto_op *op,
132741d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec,
132841d561cbSFan Zhang 		uint32_t dir)
132941d561cbSFan Zhang {
133041d561cbSFan Zhang 	struct rte_mbuf *mbuf = op->sym->m_src;
133141d561cbSFan Zhang 	uint8_t *data;
133241d561cbSFan Zhang 	const uint8_t *src;
133341d561cbSFan Zhang 	uint32_t len, src_len;
133441d561cbSFan Zhang 	int ret;
133541d561cbSFan Zhang 
13366da6a83eSFan Zhang 	if (!mbuf)
13376da6a83eSFan Zhang 		return -1;
13386da6a83eSFan Zhang 
133941d561cbSFan Zhang 	if (dir == self_test_dir_enc_auth_gen) {
134041d561cbSFan Zhang 		src = vec->output.data;
134141d561cbSFan Zhang 		src_len = vec->output.len;
134241d561cbSFan Zhang 	} else {
134341d561cbSFan Zhang 		src = vec->input.data;
134441d561cbSFan Zhang 		src_len = vec->input.len;
134541d561cbSFan Zhang 	}
134641d561cbSFan Zhang 
134741d561cbSFan Zhang 	GET_MBUF_DATA(data, len, mbuf);
13486da6a83eSFan Zhang 	if (!len)
134941d561cbSFan Zhang 		return -1;
135041d561cbSFan Zhang 
135141d561cbSFan Zhang 	ret = memcmp(data, src, src_len);
135241d561cbSFan Zhang 	if (ret != 0)
135341d561cbSFan Zhang 		return -1;
135441d561cbSFan Zhang 
135541d561cbSFan Zhang 	return 0;
135641d561cbSFan Zhang }
135741d561cbSFan Zhang 
135841d561cbSFan Zhang static int
135941d561cbSFan Zhang check_auth_result(struct rte_crypto_op *op,
136041d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec,
136141d561cbSFan Zhang 		uint32_t dir)
136241d561cbSFan Zhang {
136341d561cbSFan Zhang 	struct rte_mbuf *mbuf = op->sym->m_src;
136441d561cbSFan Zhang 	uint8_t *data;
136541d561cbSFan Zhang 	uint32_t len;
136641d561cbSFan Zhang 	int ret;
136741d561cbSFan Zhang 
13686da6a83eSFan Zhang 	if (mbuf == NULL)
13696da6a83eSFan Zhang 		return -1;
13706da6a83eSFan Zhang 
137141d561cbSFan Zhang 	GET_MBUF_DATA(data, len, mbuf);
13726da6a83eSFan Zhang 	if (!len)
137341d561cbSFan Zhang 		return -1;
137441d561cbSFan Zhang 
137541d561cbSFan Zhang 	if (dir == self_test_dir_enc_auth_gen) {
137641d561cbSFan Zhang 		data += vec->input.len;
137741d561cbSFan Zhang 		ret = memcmp(data, vec->digest.data, vec->digest.len);
137841d561cbSFan Zhang 		if (ret != 0)
137941d561cbSFan Zhang 			return -1;
138041d561cbSFan Zhang 	}
138141d561cbSFan Zhang 
138241d561cbSFan Zhang 	return 0;
138341d561cbSFan Zhang }
138441d561cbSFan Zhang 
138541d561cbSFan Zhang static int
138641d561cbSFan Zhang check_aead_result(struct rte_crypto_op *op,
138741d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec,
138841d561cbSFan Zhang 		uint32_t dir)
138941d561cbSFan Zhang {
139041d561cbSFan Zhang 	struct rte_mbuf *mbuf = op->sym->m_src;
139141d561cbSFan Zhang 	uint8_t *data;
139241d561cbSFan Zhang 	const uint8_t *src;
139341d561cbSFan Zhang 	uint32_t len, src_len;
139441d561cbSFan Zhang 	int ret;
139541d561cbSFan Zhang 
13966da6a83eSFan Zhang 	if (!mbuf)
13976da6a83eSFan Zhang 		return -1;
13986da6a83eSFan Zhang 
139926e28801SFan Zhang 	if (op->sym->aead.aad.data)
140026e28801SFan Zhang 		rte_free(op->sym->aead.aad.data);
140126e28801SFan Zhang 
140241d561cbSFan Zhang 	if (dir == self_test_dir_enc_auth_gen) {
140341d561cbSFan Zhang 		src = vec->output.data;
140441d561cbSFan Zhang 		src_len = vec->output.len;
140541d561cbSFan Zhang 	} else {
140641d561cbSFan Zhang 		src = vec->input.data;
140741d561cbSFan Zhang 		src_len = vec->input.len;
140841d561cbSFan Zhang 	}
140941d561cbSFan Zhang 
141041d561cbSFan Zhang 	GET_MBUF_DATA(data, len, mbuf);
14116da6a83eSFan Zhang 	if (!len)
141241d561cbSFan Zhang 		return -1;
141341d561cbSFan Zhang 
141441d561cbSFan Zhang 	ret = memcmp(data, src, src_len);
141541d561cbSFan Zhang 	if (ret != 0)
141641d561cbSFan Zhang 		return -1;
141741d561cbSFan Zhang 
141841d561cbSFan Zhang 	if (dir == self_test_dir_enc_auth_gen) {
141941d561cbSFan Zhang 		data += src_len;
142041d561cbSFan Zhang 		ret = memcmp(data, vec->digest.data, vec->digest.len);
142141d561cbSFan Zhang 		if (ret != 0)
142241d561cbSFan Zhang 			return -1;
142341d561cbSFan Zhang 	}
142441d561cbSFan Zhang 
142541d561cbSFan Zhang 	return 0;
142641d561cbSFan Zhang }
142741d561cbSFan Zhang 
142841d561cbSFan Zhang static void
142941d561cbSFan Zhang init_test_op(struct fips_dev_self_test_ops *test_ops,
143041d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec)
143141d561cbSFan Zhang {
143241d561cbSFan Zhang 	if (test_ops->last_operation_type == vec->operation_type)
143341d561cbSFan Zhang 		return;
143441d561cbSFan Zhang 
143541d561cbSFan Zhang 	switch (vec->operation_type) {
143641d561cbSFan Zhang 	case RTE_CRYPTO_SYM_XFORM_CIPHER:
143741d561cbSFan Zhang 		test_ops->prepare_xform = prepare_cipher_xform;
143841d561cbSFan Zhang 		test_ops->prepare_op = prepare_cipher_op;
143941d561cbSFan Zhang 		test_ops->check_result = check_cipher_result;
144041d561cbSFan Zhang 		break;
144141d561cbSFan Zhang 	case RTE_CRYPTO_SYM_XFORM_AUTH:
144241d561cbSFan Zhang 		test_ops->prepare_xform = prepare_auth_xform;
144341d561cbSFan Zhang 		test_ops->prepare_op = prepare_auth_op;
144441d561cbSFan Zhang 		test_ops->check_result = check_auth_result;
144541d561cbSFan Zhang 		break;
144641d561cbSFan Zhang 	case RTE_CRYPTO_SYM_XFORM_AEAD:
144741d561cbSFan Zhang 		test_ops->prepare_xform = prepare_aead_xform;
144841d561cbSFan Zhang 		test_ops->prepare_op = prepare_aead_op;
144941d561cbSFan Zhang 		test_ops->check_result = check_aead_result;
145041d561cbSFan Zhang 		break;
145141d561cbSFan Zhang 	default:
145241d561cbSFan Zhang 		break;
145341d561cbSFan Zhang 	}
145441d561cbSFan Zhang 
145541d561cbSFan Zhang 	test_ops->last_operation_type = vec->operation_type;
145641d561cbSFan Zhang }
145741d561cbSFan Zhang 
145841d561cbSFan Zhang static int
145941d561cbSFan Zhang run_single_test(uint8_t dev_id,
146041d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec,
146141d561cbSFan Zhang 		const struct fips_dev_self_test_ops *test_ops,
146241d561cbSFan Zhang 		struct fips_dev_auto_test_env *env,
146341d561cbSFan Zhang 		uint32_t dir,
146441d561cbSFan Zhang 		uint32_t negative_test)
146541d561cbSFan Zhang {
146641d561cbSFan Zhang 	struct rte_crypto_sym_xform xform;
146741d561cbSFan Zhang 	struct rte_cryptodev_sym_session *sess;
146841d561cbSFan Zhang 	uint16_t n_deqd;
146941d561cbSFan Zhang 	uint8_t key[256];
147041d561cbSFan Zhang 	int ret;
147141d561cbSFan Zhang 
147241d561cbSFan Zhang 	__rte_crypto_op_reset(env->op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
147341d561cbSFan Zhang 	rte_pktmbuf_reset(env->mbuf);
147441d561cbSFan Zhang 	env->op->sym->m_src = env->mbuf;
147541d561cbSFan Zhang 
147641d561cbSFan Zhang 	ret = test_ops->prepare_xform(dev_id, &xform, vec, dir, key,
147741d561cbSFan Zhang 			negative_test);
147841d561cbSFan Zhang 	if (ret < 0) {
147941d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Error %i: Prepare Xform\n", ret);
148041d561cbSFan Zhang 		return ret;
148141d561cbSFan Zhang 	}
148241d561cbSFan Zhang 
148341d561cbSFan Zhang 	sess = rte_cryptodev_sym_session_create(env->sess_pool);
148441d561cbSFan Zhang 	if (!sess)
148541d561cbSFan Zhang 		return -ENOMEM;
148641d561cbSFan Zhang 
148741d561cbSFan Zhang 	ret = rte_cryptodev_sym_session_init(dev_id,
148819f4fa70SFan Zhang 			sess, &xform, env->sess_priv_pool);
148941d561cbSFan Zhang 	if (ret < 0) {
149041d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Error %i: Init session\n", ret);
149141d561cbSFan Zhang 		return ret;
149241d561cbSFan Zhang 	}
149341d561cbSFan Zhang 
149441d561cbSFan Zhang 	ret = test_ops->prepare_op(env->op, env->mbuf, sess, dir, vec);
149541d561cbSFan Zhang 	if (ret < 0) {
149641d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Error %i: Prepare op\n", ret);
149741d561cbSFan Zhang 		return ret;
149841d561cbSFan Zhang 	}
149941d561cbSFan Zhang 
150041d561cbSFan Zhang 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &env->op, 1) < 1) {
150141d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Error: Failed enqueue\n");
150241d561cbSFan Zhang 		return ret;
150341d561cbSFan Zhang 	}
150441d561cbSFan Zhang 
150541d561cbSFan Zhang 	do {
150641d561cbSFan Zhang 		struct rte_crypto_op *deqd_op;
150741d561cbSFan Zhang 
150841d561cbSFan Zhang 		n_deqd = rte_cryptodev_dequeue_burst(dev_id, 0, &deqd_op,
150941d561cbSFan Zhang 				1);
151041d561cbSFan Zhang 	} while (n_deqd == 0);
151141d561cbSFan Zhang 
151241d561cbSFan Zhang 	rte_cryptodev_sym_session_clear(dev_id, sess);
151341d561cbSFan Zhang 	rte_cryptodev_sym_session_free(sess);
151441d561cbSFan Zhang 
151541d561cbSFan Zhang 	if (env->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
151641d561cbSFan Zhang 		return -1;
151741d561cbSFan Zhang 
151841d561cbSFan Zhang 	return test_ops->check_result(env->op, vec, dir);
151941d561cbSFan Zhang }
152041d561cbSFan Zhang 
152141d561cbSFan Zhang 
152241d561cbSFan Zhang static void
152341d561cbSFan Zhang fips_dev_auto_test_uninit(uint8_t dev_id,
152441d561cbSFan Zhang 		struct fips_dev_auto_test_env *env)
152541d561cbSFan Zhang {
152641d561cbSFan Zhang 	if (env->mbuf)
152741d561cbSFan Zhang 		rte_pktmbuf_free(env->mbuf);
152841d561cbSFan Zhang 	if (env->op)
152941d561cbSFan Zhang 		rte_crypto_op_free(env->op);
153041d561cbSFan Zhang 	if (env->mpool)
153141d561cbSFan Zhang 		rte_mempool_free(env->mpool);
153241d561cbSFan Zhang 	if (env->op_pool)
153341d561cbSFan Zhang 		rte_mempool_free(env->op_pool);
153441d561cbSFan Zhang 	if (env->sess_pool)
153541d561cbSFan Zhang 		rte_mempool_free(env->sess_pool);
153641d561cbSFan Zhang 	if (env->sess_priv_pool)
153741d561cbSFan Zhang 		rte_mempool_free(env->sess_priv_pool);
153841d561cbSFan Zhang 
153941d561cbSFan Zhang 	rte_cryptodev_stop(dev_id);
154041d561cbSFan Zhang }
154141d561cbSFan Zhang 
154241d561cbSFan Zhang static int
154341d561cbSFan Zhang fips_dev_auto_test_init(uint8_t dev_id, struct fips_dev_auto_test_env *env)
154441d561cbSFan Zhang {
154541d561cbSFan Zhang 	struct rte_cryptodev_qp_conf qp_conf = {128, NULL, NULL};
154641d561cbSFan Zhang 	uint32_t sess_sz = rte_cryptodev_sym_get_private_session_size(dev_id);
1547c9030ae3SAnoob Joseph 	struct rte_cryptodev_config conf;
154841d561cbSFan Zhang 	char name[128];
154941d561cbSFan Zhang 	int ret;
155041d561cbSFan Zhang 
1551c9030ae3SAnoob Joseph 	conf.socket_id = rte_cryptodev_socket_id(dev_id);
1552c9030ae3SAnoob Joseph 	conf.nb_queue_pairs = 1;
1553c9030ae3SAnoob Joseph 	conf.ff_disable = 0;
1554c9030ae3SAnoob Joseph 
155541d561cbSFan Zhang 	ret = rte_cryptodev_configure(dev_id, &conf);
155641d561cbSFan Zhang 	if (ret < 0)
155741d561cbSFan Zhang 		return ret;
155841d561cbSFan Zhang 
155941d561cbSFan Zhang 	memset(name, 0, 128);
156041d561cbSFan Zhang 	snprintf(name, 128, "%s%u", "SELF_TEST_MEMPOOL", dev_id);
156141d561cbSFan Zhang 
156241d561cbSFan Zhang 	memset(env, 0, sizeof(*env));
156341d561cbSFan Zhang 
156441d561cbSFan Zhang 	env->mpool = rte_pktmbuf_pool_create(name, 128, 0, 0,
156541d561cbSFan Zhang 			UINT16_MAX, rte_cryptodev_socket_id(dev_id));
156641d561cbSFan Zhang 	if (!env->mpool) {
156741d561cbSFan Zhang 		ret = -ENOMEM;
156841d561cbSFan Zhang 		goto error_exit;
156941d561cbSFan Zhang 	}
157041d561cbSFan Zhang 
157141d561cbSFan Zhang 	memset(name, 0, 128);
157241d561cbSFan Zhang 	snprintf(name, 128, "%s%u", "SELF_TEST_OP_POOL", dev_id);
157341d561cbSFan Zhang 
157441d561cbSFan Zhang 	env->op_pool = rte_crypto_op_pool_create(
157541d561cbSFan Zhang 			name,
157641d561cbSFan Zhang 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
157741d561cbSFan Zhang 			16, 0,
157841d561cbSFan Zhang 			16,
157941d561cbSFan Zhang 			rte_socket_id());
158041d561cbSFan Zhang 	if (!env->op_pool) {
158141d561cbSFan Zhang 		ret = -ENOMEM;
158241d561cbSFan Zhang 		goto error_exit;
158341d561cbSFan Zhang 	}
158441d561cbSFan Zhang 
158541d561cbSFan Zhang 	memset(name, 0, 128);
158641d561cbSFan Zhang 	snprintf(name, 128, "%s%u", "SELF_TEST_SESS_POOL", dev_id);
158741d561cbSFan Zhang 
158841d561cbSFan Zhang 	env->sess_pool = rte_cryptodev_sym_session_pool_create(name,
158941d561cbSFan Zhang 			128, 0, 0, 0, rte_cryptodev_socket_id(dev_id));
159041d561cbSFan Zhang 	if (!env->sess_pool) {
159141d561cbSFan Zhang 		ret = -ENOMEM;
159241d561cbSFan Zhang 		goto error_exit;
159341d561cbSFan Zhang 	}
159441d561cbSFan Zhang 
159541d561cbSFan Zhang 	memset(name, 0, 128);
159641d561cbSFan Zhang 	snprintf(name, 128, "%s%u", "SELF_TEST_SESS_PRIV_POOL", dev_id);
159741d561cbSFan Zhang 
159841d561cbSFan Zhang 	env->sess_priv_pool = rte_mempool_create(name,
159941d561cbSFan Zhang 			128, sess_sz, 0, 0, NULL, NULL, NULL,
160041d561cbSFan Zhang 			NULL, rte_cryptodev_socket_id(dev_id), 0);
160141d561cbSFan Zhang 	if (!env->sess_priv_pool) {
160241d561cbSFan Zhang 		ret = -ENOMEM;
160341d561cbSFan Zhang 		goto error_exit;
160441d561cbSFan Zhang 	}
160541d561cbSFan Zhang 
160641d561cbSFan Zhang 	qp_conf.mp_session = env->sess_pool;
160741d561cbSFan Zhang 	qp_conf.mp_session_private = env->sess_priv_pool;
160841d561cbSFan Zhang 
160941d561cbSFan Zhang 	ret = rte_cryptodev_queue_pair_setup(dev_id, 0, &qp_conf,
161041d561cbSFan Zhang 			rte_cryptodev_socket_id(dev_id));
161141d561cbSFan Zhang 	if (ret < 0)
161241d561cbSFan Zhang 		goto error_exit;
161341d561cbSFan Zhang 
161441d561cbSFan Zhang 	env->mbuf = rte_pktmbuf_alloc(env->mpool);
161541d561cbSFan Zhang 	if (!env->mbuf) {
161641d561cbSFan Zhang 		ret = -ENOMEM;
161741d561cbSFan Zhang 		goto error_exit;
161841d561cbSFan Zhang 	}
161941d561cbSFan Zhang 
162041d561cbSFan Zhang 	env->op = rte_crypto_op_alloc(env->op_pool,
162141d561cbSFan Zhang 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
162241d561cbSFan Zhang 	if (!env->op) {
162341d561cbSFan Zhang 		ret = -ENOMEM;
162441d561cbSFan Zhang 		goto error_exit;
162541d561cbSFan Zhang 	}
162641d561cbSFan Zhang 
162741d561cbSFan Zhang 	ret = rte_cryptodev_start(dev_id);
162841d561cbSFan Zhang 	if (ret < 0)
162941d561cbSFan Zhang 		goto error_exit;
163041d561cbSFan Zhang 
163141d561cbSFan Zhang 
163241d561cbSFan Zhang 	return 0;
163341d561cbSFan Zhang 
163441d561cbSFan Zhang error_exit:
163541d561cbSFan Zhang 
163641d561cbSFan Zhang 	fips_dev_auto_test_uninit(dev_id, env);
163741d561cbSFan Zhang 
163841d561cbSFan Zhang 	return ret;
163941d561cbSFan Zhang }
164041d561cbSFan Zhang 
164141d561cbSFan Zhang int
164241d561cbSFan Zhang fips_dev_self_test(uint8_t dev_id,
164341d561cbSFan Zhang 		struct fips_dev_broken_test_config *config)
164441d561cbSFan Zhang {
164541d561cbSFan Zhang 	struct fips_dev_self_test_ops test_ops = {0};
164641d561cbSFan Zhang 	struct fips_dev_auto_test_env env;
164741d561cbSFan Zhang 	uint32_t i, j, negative_test;
164841d561cbSFan Zhang 	int ret;
164941d561cbSFan Zhang 
165041d561cbSFan Zhang 	ret = fips_dev_auto_test_init(dev_id, &env);
165141d561cbSFan Zhang 	if (ret < 0) {
165241d561cbSFan Zhang 		RTE_LOG(ERR, PMD, "Failed to init self-test for PMD %u\n",
165341d561cbSFan Zhang 				dev_id);
165441d561cbSFan Zhang 		return ret;
165541d561cbSFan Zhang 	}
165641d561cbSFan Zhang 
165741d561cbSFan Zhang 	for (i = 0; i < RTE_DIM(self_test_vectors); i++) {
165841d561cbSFan Zhang 		struct fips_dev_self_test_vector *vec =
165941d561cbSFan Zhang 				self_test_vectors[i];
166041d561cbSFan Zhang 
166141d561cbSFan Zhang 		init_test_op(&test_ops, vec);
166241d561cbSFan Zhang 
166341d561cbSFan Zhang 		for (j = 0; j < self_test_dir_max; j++) {
166441d561cbSFan Zhang 			if (!config)
166541d561cbSFan Zhang 				negative_test = 0;
166641d561cbSFan Zhang 			else {
166741d561cbSFan Zhang 				if ((config->expect_fail_test_idx == i) &&
166841d561cbSFan Zhang 						(config->expect_fail_dir == j))
166941d561cbSFan Zhang 					negative_test = 1;
167041d561cbSFan Zhang 				else
167141d561cbSFan Zhang 					negative_test = 0;
167241d561cbSFan Zhang 			}
167341d561cbSFan Zhang 
167441d561cbSFan Zhang 			RTE_LOG(INFO, PMD, "Testing (ID %u) %s %s%s...\n",
167541d561cbSFan Zhang 					i,
167641d561cbSFan Zhang 					vec->name,
167741d561cbSFan Zhang 					j == self_test_dir_enc_auth_gen ?
167841d561cbSFan Zhang 							"Encrypt" : "Decrypt",
167941d561cbSFan Zhang 					negative_test ? " (Expect Fail)" : "");
168041d561cbSFan Zhang 
168141d561cbSFan Zhang 			ret = run_single_test(dev_id, vec, &test_ops,
168241d561cbSFan Zhang 						&env, j, negative_test);
168341d561cbSFan Zhang 			switch (ret) {
168441d561cbSFan Zhang 			case 0:
168541d561cbSFan Zhang 				if (!negative_test)
168641d561cbSFan Zhang 					break;
168741d561cbSFan Zhang 				ret = -1;
168841d561cbSFan Zhang 				RTE_LOG(ERR, PMD, "PMD %u Failed test %s %s\n",
168941d561cbSFan Zhang 					dev_id, vec->name,
169041d561cbSFan Zhang 					j == self_test_dir_enc_auth_gen ?
169141d561cbSFan Zhang 					"Encrypt" : "Decrypt");
169241d561cbSFan Zhang 				goto error_exit;
169341d561cbSFan Zhang 			case -EACCES:
169441d561cbSFan Zhang 				RTE_LOG(ERR, PMD, "Not supported by %s. Skip\n",
169541d561cbSFan Zhang 					rte_cryptodev_name_get(dev_id));
169641d561cbSFan Zhang 				ret = 0;
169741d561cbSFan Zhang 				break;
169841d561cbSFan Zhang 			default:
169941d561cbSFan Zhang 				RTE_LOG(ERR, PMD, "PMD %u Failed test %s %s\n",
170041d561cbSFan Zhang 					dev_id, vec->name,
170141d561cbSFan Zhang 					j == self_test_dir_enc_auth_gen ?
170241d561cbSFan Zhang 					"Encrypt" : "Decrypt");
170341d561cbSFan Zhang 				goto error_exit;
170441d561cbSFan Zhang 			}
170541d561cbSFan Zhang 		}
170641d561cbSFan Zhang 	}
170741d561cbSFan Zhang 
170841d561cbSFan Zhang error_exit:
170941d561cbSFan Zhang 	fips_dev_auto_test_uninit(dev_id, &env);
171041d561cbSFan Zhang 
171141d561cbSFan Zhang 	if (ret == 0) {
171241d561cbSFan Zhang 		RTE_LOG(INFO, PMD, "PMD %u finished self-test successfully\n",
171341d561cbSFan Zhang 				dev_id);
171441d561cbSFan Zhang 	}
171541d561cbSFan Zhang 
171641d561cbSFan Zhang 	return ret;
171741d561cbSFan Zhang }
1718