xref: /dpdk/examples/fips_validation/fips_validation.h (revision 527cbf3d5ee380f49db828957de4ba75f71e4311)
13d0fad56SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
23d0fad56SMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
33d0fad56SMarko Kovacevic  */
43d0fad56SMarko Kovacevic 
53d0fad56SMarko Kovacevic #ifndef _FIPS_VALIDATION_H_
63d0fad56SMarko Kovacevic #define _FIPS_VALIDATION_H_
73d0fad56SMarko Kovacevic 
83d0fad56SMarko Kovacevic #define FIPS_PARSE_ERR(fmt, args)					\
93d0fad56SMarko Kovacevic 	RTE_LOG(ERR, USER1, "FIPS parse error" ## fmt ## "\n", ## args)
103d0fad56SMarko Kovacevic 
113d0fad56SMarko Kovacevic #define ERR_MSG_SIZE		128
123d0fad56SMarko Kovacevic #define MAX_CASE_LINE		15
133d0fad56SMarko Kovacevic #define MAX_LINE_CHAR		204800 /*< max number of characters per line */
143d0fad56SMarko Kovacevic #define MAX_NB_TESTS		10240
153d0fad56SMarko Kovacevic #define MAX_BUF_SIZE		2048
163d0fad56SMarko Kovacevic #define MAX_STRING_SIZE		64
173d0fad56SMarko Kovacevic 
183d0fad56SMarko Kovacevic #define POSITIVE_TEST		0
193d0fad56SMarko Kovacevic #define NEGATIVE_TEST		-1
203d0fad56SMarko Kovacevic 
213d0fad56SMarko Kovacevic #define REQ_FILE_PERFIX		"req"
223d0fad56SMarko Kovacevic #define RSP_FILE_PERFIX		"rsp"
233d0fad56SMarko Kovacevic #define FAX_FILE_PERFIX		"fax"
243d0fad56SMarko Kovacevic 
253d0fad56SMarko Kovacevic enum fips_test_algorithms {
26cd255ccfSMarko Kovacevic 		FIPS_TEST_ALGO_AES = 0,
27f64adb67SMarko Kovacevic 		FIPS_TEST_ALGO_HMAC,
28*527cbf3dSMarko Kovacevic 		FIPS_TEST_ALGO_TDES,
293d0fad56SMarko Kovacevic 		FIPS_TEST_ALGO_MAX
303d0fad56SMarko Kovacevic };
313d0fad56SMarko Kovacevic 
323d0fad56SMarko Kovacevic enum file_types {
333d0fad56SMarko Kovacevic 	FIPS_TYPE_REQ = 1,
343d0fad56SMarko Kovacevic 	FIPS_TYPE_FAX,
353d0fad56SMarko Kovacevic 	FIPS_TYPE_RSP
363d0fad56SMarko Kovacevic };
373d0fad56SMarko Kovacevic 
383d0fad56SMarko Kovacevic enum fips_test_op {
393d0fad56SMarko Kovacevic 	FIPS_TEST_ENC_AUTH_GEN = 1,
403d0fad56SMarko Kovacevic 	FIPS_TEST_DEC_AUTH_VERIF,
413d0fad56SMarko Kovacevic };
423d0fad56SMarko Kovacevic 
433d0fad56SMarko Kovacevic #define MAX_LINE_PER_VECTOR            16
443d0fad56SMarko Kovacevic 
453d0fad56SMarko Kovacevic struct fips_val {
463d0fad56SMarko Kovacevic 	uint8_t *val;
473d0fad56SMarko Kovacevic 	uint32_t len;
483d0fad56SMarko Kovacevic };
493d0fad56SMarko Kovacevic 
503d0fad56SMarko Kovacevic struct fips_test_vector {
513d0fad56SMarko Kovacevic 	union {
523d0fad56SMarko Kovacevic 		struct {
533d0fad56SMarko Kovacevic 			struct fips_val key;
543d0fad56SMarko Kovacevic 			struct fips_val digest;
553d0fad56SMarko Kovacevic 			struct fips_val auth_aad;
563d0fad56SMarko Kovacevic 			struct fips_val aad;
573d0fad56SMarko Kovacevic 		} cipher_auth;
583d0fad56SMarko Kovacevic 		struct {
593d0fad56SMarko Kovacevic 			struct fips_val key;
603d0fad56SMarko Kovacevic 			struct fips_val digest;
613d0fad56SMarko Kovacevic 			struct fips_val aad;
623d0fad56SMarko Kovacevic 		} aead;
633d0fad56SMarko Kovacevic 	};
643d0fad56SMarko Kovacevic 
653d0fad56SMarko Kovacevic 	struct fips_val pt;
663d0fad56SMarko Kovacevic 	struct fips_val ct;
673d0fad56SMarko Kovacevic 	struct fips_val iv;
683d0fad56SMarko Kovacevic 
693d0fad56SMarko Kovacevic 	enum rte_crypto_op_status status;
703d0fad56SMarko Kovacevic };
713d0fad56SMarko Kovacevic 
723d0fad56SMarko Kovacevic typedef int (*post_prcess_t)(struct fips_val *val);
733d0fad56SMarko Kovacevic 
743d0fad56SMarko Kovacevic typedef int (*parse_callback_t)(const char *key, char *text,
753d0fad56SMarko Kovacevic 		struct fips_val *val);
763d0fad56SMarko Kovacevic 
773d0fad56SMarko Kovacevic struct fips_test_callback {
783d0fad56SMarko Kovacevic 	const char *key;
793d0fad56SMarko Kovacevic 	parse_callback_t cb;
803d0fad56SMarko Kovacevic 	struct fips_val *val;
813d0fad56SMarko Kovacevic };
823d0fad56SMarko Kovacevic 
83cd255ccfSMarko Kovacevic enum fips_aesavs_test_types {
84cd255ccfSMarko Kovacevic 	AESAVS_TYPE_GFXBOX = 1,
85cd255ccfSMarko Kovacevic 	AESAVS_TYPE_KEYSBOX,
86cd255ccfSMarko Kovacevic 	AESAVS_TYPE_VARKEY,
87cd255ccfSMarko Kovacevic 	AESAVS_TYPE_VARTXT,
88cd255ccfSMarko Kovacevic 	AESAVS_TYPE_MMT,
89cd255ccfSMarko Kovacevic 	AESAVS_TYPE_MCT,
90cd255ccfSMarko Kovacevic };
91cd255ccfSMarko Kovacevic 
92*527cbf3dSMarko Kovacevic enum fips_tdes_test_types {
93*527cbf3dSMarko Kovacevic 	TDES_INVERSE_PERMUTATION = 0,
94*527cbf3dSMarko Kovacevic 	TDES_PERMUTATION,
95*527cbf3dSMarko Kovacevic 	TDES_SUBSTITUTION_TABLE,
96*527cbf3dSMarko Kovacevic 	TDES_VARIABLE_KEY,
97*527cbf3dSMarko Kovacevic 	TDES_VARIABLE_TEXT,
98*527cbf3dSMarko Kovacevic 	TDES_KAT,
99*527cbf3dSMarko Kovacevic 	TDES_MCT, /* Monte Carlo (Modes) Test */
100*527cbf3dSMarko Kovacevic 	TDES_MMT /* Multi block Message Test */
101*527cbf3dSMarko Kovacevic };
102*527cbf3dSMarko Kovacevic 
103cd255ccfSMarko Kovacevic struct aesavs_interim_data {
104cd255ccfSMarko Kovacevic 	enum fips_aesavs_test_types test_type;
105cd255ccfSMarko Kovacevic 	uint32_t cipher_algo;
106cd255ccfSMarko Kovacevic 	uint32_t key_len;
107cd255ccfSMarko Kovacevic };
108cd255ccfSMarko Kovacevic 
109f64adb67SMarko Kovacevic struct hmac_interim_data {
110f64adb67SMarko Kovacevic 	enum rte_crypto_auth_algorithm algo;
111f64adb67SMarko Kovacevic };
112f64adb67SMarko Kovacevic 
113*527cbf3dSMarko Kovacevic struct tdes_interim_data {
114*527cbf3dSMarko Kovacevic 	enum fips_tdes_test_types test_type;
115*527cbf3dSMarko Kovacevic 	uint32_t nb_keys;
116*527cbf3dSMarko Kovacevic };
117*527cbf3dSMarko Kovacevic 
1183d0fad56SMarko Kovacevic struct fips_test_interim_info {
1193d0fad56SMarko Kovacevic 	FILE *fp_rd;
1203d0fad56SMarko Kovacevic 	FILE *fp_wr;
1213d0fad56SMarko Kovacevic 	enum file_types file_type;
1223d0fad56SMarko Kovacevic 	enum fips_test_algorithms algo;
1233d0fad56SMarko Kovacevic 	char *one_line_text;
1243d0fad56SMarko Kovacevic 	char *vec[MAX_LINE_PER_VECTOR];
1253d0fad56SMarko Kovacevic 	uint32_t nb_vec_lines;
1263d0fad56SMarko Kovacevic 	char device_name[MAX_STRING_SIZE];
1273d0fad56SMarko Kovacevic 
128cd255ccfSMarko Kovacevic 	union {
129cd255ccfSMarko Kovacevic 		struct aesavs_interim_data aes_data;
130f64adb67SMarko Kovacevic 		struct hmac_interim_data hmac_data;
131*527cbf3dSMarko Kovacevic 		struct tdes_interim_data tdes_data;
132cd255ccfSMarko Kovacevic 
133cd255ccfSMarko Kovacevic 	} interim_info;
134cd255ccfSMarko Kovacevic 
1353d0fad56SMarko Kovacevic 	enum fips_test_op op;
1363d0fad56SMarko Kovacevic 
1373d0fad56SMarko Kovacevic 	const struct fips_test_callback *callbacks;
1383d0fad56SMarko Kovacevic 	const struct fips_test_callback *interim_callbacks;
1393d0fad56SMarko Kovacevic 	const struct fips_test_callback *writeback_callbacks;
1403d0fad56SMarko Kovacevic 
1413d0fad56SMarko Kovacevic 	post_prcess_t parse_writeback;
1423d0fad56SMarko Kovacevic 	post_prcess_t kat_check;
1433d0fad56SMarko Kovacevic };
1443d0fad56SMarko Kovacevic 
1453d0fad56SMarko Kovacevic extern struct fips_test_vector vec;
1463d0fad56SMarko Kovacevic extern struct fips_test_interim_info info;
1473d0fad56SMarko Kovacevic 
1483d0fad56SMarko Kovacevic int
1493d0fad56SMarko Kovacevic fips_test_init(const char *req_file_path, const char *rsp_file_path,
1503d0fad56SMarko Kovacevic 		const char *device_name);
1513d0fad56SMarko Kovacevic 
1523d0fad56SMarko Kovacevic void
1533d0fad56SMarko Kovacevic fips_test_clear(void);
1543d0fad56SMarko Kovacevic 
1553d0fad56SMarko Kovacevic int
1563d0fad56SMarko Kovacevic fips_test_fetch_one_block(void);
1573d0fad56SMarko Kovacevic 
1583d0fad56SMarko Kovacevic int
1593d0fad56SMarko Kovacevic fips_test_parse_one_case(void);
1603d0fad56SMarko Kovacevic 
1613d0fad56SMarko Kovacevic void
1623d0fad56SMarko Kovacevic fips_test_write_one_case(void);
1633d0fad56SMarko Kovacevic 
1643d0fad56SMarko Kovacevic int
165cd255ccfSMarko Kovacevic parse_test_aes_init(void);
166cd255ccfSMarko Kovacevic 
167cd255ccfSMarko Kovacevic int
168*527cbf3dSMarko Kovacevic parse_test_tdes_init(void);
169*527cbf3dSMarko Kovacevic 
170*527cbf3dSMarko Kovacevic int
171f64adb67SMarko Kovacevic parse_test_hmac_init(void);
172f64adb67SMarko Kovacevic 
173f64adb67SMarko Kovacevic int
1743d0fad56SMarko Kovacevic parser_read_uint8_hex(uint8_t *value, const char *p);
1753d0fad56SMarko Kovacevic 
1763d0fad56SMarko Kovacevic int
1773d0fad56SMarko Kovacevic parse_uint8_hex_str(const char *key, char *src, struct fips_val *val);
1783d0fad56SMarko Kovacevic 
1793d0fad56SMarko Kovacevic int
1803d0fad56SMarko Kovacevic parse_uint8_known_len_hex_str(const char *key, char *src, struct fips_val *val);
1813d0fad56SMarko Kovacevic 
1823d0fad56SMarko Kovacevic int
1833d0fad56SMarko Kovacevic parser_read_uint32_val(const char *key, char *src, struct fips_val *val);
1843d0fad56SMarko Kovacevic 
1853d0fad56SMarko Kovacevic int
1863d0fad56SMarko Kovacevic parser_read_uint32_bit_val(const char *key, char *src, struct fips_val *val);
1873d0fad56SMarko Kovacevic 
1883d0fad56SMarko Kovacevic int
1893d0fad56SMarko Kovacevic parser_read_uint32(uint32_t *value, char *p);
1903d0fad56SMarko Kovacevic 
1913d0fad56SMarko Kovacevic int
1923d0fad56SMarko Kovacevic parser_read_uint32_val(const char *key, char *src, struct fips_val *val);
1933d0fad56SMarko Kovacevic 
1943d0fad56SMarko Kovacevic int
1953d0fad56SMarko Kovacevic writeback_hex_str(const char *key, char *dst, struct fips_val *val);
1963d0fad56SMarko Kovacevic 
1973d0fad56SMarko Kovacevic void
1983d0fad56SMarko Kovacevic parse_write_hex_str(struct fips_val *src);
1993d0fad56SMarko Kovacevic 
2003d0fad56SMarko Kovacevic int
2013d0fad56SMarko Kovacevic update_info_vec(uint32_t count);
2023d0fad56SMarko Kovacevic 
2033d0fad56SMarko Kovacevic #endif
204