1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2d30ea906Sjfb8856606 * Copyright(c) 2018 Intel Corporation 3d30ea906Sjfb8856606 */ 4d30ea906Sjfb8856606 5d30ea906Sjfb8856606 #ifndef _FIPS_VALIDATION_H_ 6d30ea906Sjfb8856606 #define _FIPS_VALIDATION_H_ 7d30ea906Sjfb8856606 8d30ea906Sjfb8856606 #define FIPS_PARSE_ERR(fmt, args) \ 9d30ea906Sjfb8856606 RTE_LOG(ERR, USER1, "FIPS parse error" ## fmt ## "\n", ## args) 10d30ea906Sjfb8856606 11d30ea906Sjfb8856606 #define ERR_MSG_SIZE 128 12d30ea906Sjfb8856606 #define MAX_CASE_LINE 15 13d30ea906Sjfb8856606 #define MAX_LINE_CHAR 204800 /*< max number of characters per line */ 14d30ea906Sjfb8856606 #define MAX_NB_TESTS 10240 15*2d9fd380Sjfb8856606 #define DEF_MBUF_SEG_SIZE (UINT16_MAX - sizeof(struct rte_mbuf) - \ 16*2d9fd380Sjfb8856606 RTE_PKTMBUF_HEADROOM) 17d30ea906Sjfb8856606 #define MAX_STRING_SIZE 64 180c6bd470Sfengbojiang #define MAX_FILE_NAME_SIZE 256 194418919fSjohnjiang #define MAX_DIGEST_SIZE 64 20d30ea906Sjfb8856606 21d30ea906Sjfb8856606 #define POSITIVE_TEST 0 22d30ea906Sjfb8856606 #define NEGATIVE_TEST -1 23d30ea906Sjfb8856606 24d30ea906Sjfb8856606 #define REQ_FILE_PERFIX "req" 25d30ea906Sjfb8856606 #define RSP_FILE_PERFIX "rsp" 26d30ea906Sjfb8856606 #define FAX_FILE_PERFIX "fax" 27d30ea906Sjfb8856606 28d30ea906Sjfb8856606 enum fips_test_algorithms { 29d30ea906Sjfb8856606 FIPS_TEST_ALGO_AES = 0, 30d30ea906Sjfb8856606 FIPS_TEST_ALGO_AES_GCM, 31d30ea906Sjfb8856606 FIPS_TEST_ALGO_AES_CMAC, 32d30ea906Sjfb8856606 FIPS_TEST_ALGO_AES_CCM, 33d30ea906Sjfb8856606 FIPS_TEST_ALGO_HMAC, 34d30ea906Sjfb8856606 FIPS_TEST_ALGO_TDES, 354418919fSjohnjiang FIPS_TEST_ALGO_SHA, 36*2d9fd380Sjfb8856606 FIPS_TEST_ALGO_AES_XTS, 37d30ea906Sjfb8856606 FIPS_TEST_ALGO_MAX 38d30ea906Sjfb8856606 }; 39d30ea906Sjfb8856606 40d30ea906Sjfb8856606 enum file_types { 41d30ea906Sjfb8856606 FIPS_TYPE_REQ = 1, 42d30ea906Sjfb8856606 FIPS_TYPE_FAX, 43d30ea906Sjfb8856606 FIPS_TYPE_RSP 44d30ea906Sjfb8856606 }; 45d30ea906Sjfb8856606 46d30ea906Sjfb8856606 enum fips_test_op { 47d30ea906Sjfb8856606 FIPS_TEST_ENC_AUTH_GEN = 1, 48d30ea906Sjfb8856606 FIPS_TEST_DEC_AUTH_VERIF, 49d30ea906Sjfb8856606 }; 50d30ea906Sjfb8856606 51d30ea906Sjfb8856606 #define MAX_LINE_PER_VECTOR 16 52d30ea906Sjfb8856606 53d30ea906Sjfb8856606 struct fips_val { 54d30ea906Sjfb8856606 uint8_t *val; 55d30ea906Sjfb8856606 uint32_t len; 56d30ea906Sjfb8856606 }; 57d30ea906Sjfb8856606 58d30ea906Sjfb8856606 struct fips_test_vector { 59d30ea906Sjfb8856606 union { 60d30ea906Sjfb8856606 struct { 61d30ea906Sjfb8856606 struct fips_val key; 62d30ea906Sjfb8856606 struct fips_val digest; 63d30ea906Sjfb8856606 struct fips_val auth_aad; 64d30ea906Sjfb8856606 struct fips_val aad; 65d30ea906Sjfb8856606 } cipher_auth; 66d30ea906Sjfb8856606 struct { 67d30ea906Sjfb8856606 struct fips_val key; 68d30ea906Sjfb8856606 struct fips_val digest; 69d30ea906Sjfb8856606 struct fips_val aad; 70d30ea906Sjfb8856606 } aead; 71d30ea906Sjfb8856606 }; 72d30ea906Sjfb8856606 73d30ea906Sjfb8856606 struct fips_val pt; 74d30ea906Sjfb8856606 struct fips_val ct; 75d30ea906Sjfb8856606 struct fips_val iv; 76d30ea906Sjfb8856606 77d30ea906Sjfb8856606 enum rte_crypto_op_status status; 78d30ea906Sjfb8856606 }; 79d30ea906Sjfb8856606 80d30ea906Sjfb8856606 typedef int (*post_prcess_t)(struct fips_val *val); 81d30ea906Sjfb8856606 82d30ea906Sjfb8856606 typedef int (*parse_callback_t)(const char *key, char *text, 83d30ea906Sjfb8856606 struct fips_val *val); 84d30ea906Sjfb8856606 85d30ea906Sjfb8856606 struct fips_test_callback { 86d30ea906Sjfb8856606 const char *key; 87d30ea906Sjfb8856606 parse_callback_t cb; 88d30ea906Sjfb8856606 struct fips_val *val; 89d30ea906Sjfb8856606 }; 90d30ea906Sjfb8856606 91d30ea906Sjfb8856606 enum fips_aesavs_test_types { 92d30ea906Sjfb8856606 AESAVS_TYPE_GFXBOX = 1, 93d30ea906Sjfb8856606 AESAVS_TYPE_KEYSBOX, 94d30ea906Sjfb8856606 AESAVS_TYPE_VARKEY, 95d30ea906Sjfb8856606 AESAVS_TYPE_VARTXT, 96d30ea906Sjfb8856606 AESAVS_TYPE_MMT, 97d30ea906Sjfb8856606 AESAVS_TYPE_MCT, 98d30ea906Sjfb8856606 }; 99d30ea906Sjfb8856606 100d30ea906Sjfb8856606 enum fips_tdes_test_types { 101d30ea906Sjfb8856606 TDES_INVERSE_PERMUTATION = 0, 102d30ea906Sjfb8856606 TDES_PERMUTATION, 103d30ea906Sjfb8856606 TDES_SUBSTITUTION_TABLE, 104d30ea906Sjfb8856606 TDES_VARIABLE_KEY, 105d30ea906Sjfb8856606 TDES_VARIABLE_TEXT, 106d30ea906Sjfb8856606 TDES_KAT, 107d30ea906Sjfb8856606 TDES_MCT, /* Monte Carlo (Modes) Test */ 108d30ea906Sjfb8856606 TDES_MMT /* Multi block Message Test */ 109d30ea906Sjfb8856606 }; 110d30ea906Sjfb8856606 1114418919fSjohnjiang enum fips_tdes_test_mode { 1124418919fSjohnjiang TDES_MODE_CBC = 0, 1134418919fSjohnjiang TDES_MODE_ECB 1144418919fSjohnjiang }; 1154418919fSjohnjiang 116d30ea906Sjfb8856606 enum fips_ccm_test_types { 117d30ea906Sjfb8856606 CCM_VADT = 1, /* Variable Associated Data Test */ 118d30ea906Sjfb8856606 CCM_VPT, /* Variable Payload Test */ 119d30ea906Sjfb8856606 CCM_VNT, /* Variable Nonce Test */ 120d30ea906Sjfb8856606 CCM_VTT, /* Variable Tag Test */ 121d30ea906Sjfb8856606 CCM_DVPT, /* Decryption-Verification Process Test */ 122d30ea906Sjfb8856606 }; 123d30ea906Sjfb8856606 1244418919fSjohnjiang enum fips_sha_test_types { 1254418919fSjohnjiang SHA_KAT = 0, 1264418919fSjohnjiang SHA_MCT 1274418919fSjohnjiang }; 1284418919fSjohnjiang 129d30ea906Sjfb8856606 struct aesavs_interim_data { 130d30ea906Sjfb8856606 enum fips_aesavs_test_types test_type; 131d30ea906Sjfb8856606 uint32_t cipher_algo; 132d30ea906Sjfb8856606 uint32_t key_len; 133d30ea906Sjfb8856606 }; 134d30ea906Sjfb8856606 135d30ea906Sjfb8856606 struct hmac_interim_data { 136d30ea906Sjfb8856606 enum rte_crypto_auth_algorithm algo; 137d30ea906Sjfb8856606 }; 138d30ea906Sjfb8856606 139d30ea906Sjfb8856606 struct tdes_interim_data { 140d30ea906Sjfb8856606 enum fips_tdes_test_types test_type; 1414418919fSjohnjiang enum fips_tdes_test_mode test_mode; 142d30ea906Sjfb8856606 uint32_t nb_keys; 143d30ea906Sjfb8856606 }; 144d30ea906Sjfb8856606 145d30ea906Sjfb8856606 struct ccm_interim_data { 146d30ea906Sjfb8856606 enum fips_ccm_test_types test_type; 147d30ea906Sjfb8856606 uint32_t aad_len; 148d30ea906Sjfb8856606 uint32_t pt_len; 149d30ea906Sjfb8856606 uint32_t digest_len; 150d30ea906Sjfb8856606 uint32_t key_len; 151d30ea906Sjfb8856606 uint32_t iv_len; 152d30ea906Sjfb8856606 }; 153d30ea906Sjfb8856606 1544418919fSjohnjiang struct sha_interim_data { 1554418919fSjohnjiang enum fips_sha_test_types test_type; 1564418919fSjohnjiang enum rte_crypto_auth_algorithm algo; 1574418919fSjohnjiang }; 1584418919fSjohnjiang 159*2d9fd380Sjfb8856606 struct gcm_interim_data { 160*2d9fd380Sjfb8856606 uint8_t is_gmac; 161*2d9fd380Sjfb8856606 uint8_t gen_iv; 162*2d9fd380Sjfb8856606 }; 163*2d9fd380Sjfb8856606 164d30ea906Sjfb8856606 struct fips_test_interim_info { 165d30ea906Sjfb8856606 FILE *fp_rd; 166d30ea906Sjfb8856606 FILE *fp_wr; 167d30ea906Sjfb8856606 enum file_types file_type; 168d30ea906Sjfb8856606 enum fips_test_algorithms algo; 169d30ea906Sjfb8856606 char *one_line_text; 170d30ea906Sjfb8856606 char *vec[MAX_LINE_PER_VECTOR]; 1710c6bd470Sfengbojiang uint32_t vec_start_off; 172d30ea906Sjfb8856606 uint32_t nb_vec_lines; 173d30ea906Sjfb8856606 char device_name[MAX_STRING_SIZE]; 1740c6bd470Sfengbojiang char file_name[MAX_FILE_NAME_SIZE]; 1750c6bd470Sfengbojiang float version; 176d30ea906Sjfb8856606 177d30ea906Sjfb8856606 union { 178d30ea906Sjfb8856606 struct aesavs_interim_data aes_data; 179d30ea906Sjfb8856606 struct hmac_interim_data hmac_data; 180d30ea906Sjfb8856606 struct tdes_interim_data tdes_data; 181d30ea906Sjfb8856606 struct ccm_interim_data ccm_data; 1824418919fSjohnjiang struct sha_interim_data sha_data; 183*2d9fd380Sjfb8856606 struct gcm_interim_data gcm_data; 184d30ea906Sjfb8856606 } interim_info; 185d30ea906Sjfb8856606 186d30ea906Sjfb8856606 enum fips_test_op op; 187d30ea906Sjfb8856606 188d30ea906Sjfb8856606 const struct fips_test_callback *callbacks; 189d30ea906Sjfb8856606 const struct fips_test_callback *interim_callbacks; 190d30ea906Sjfb8856606 const struct fips_test_callback *writeback_callbacks; 191d30ea906Sjfb8856606 192d30ea906Sjfb8856606 post_prcess_t parse_writeback; 193d30ea906Sjfb8856606 post_prcess_t kat_check; 194d30ea906Sjfb8856606 }; 195d30ea906Sjfb8856606 196d30ea906Sjfb8856606 extern struct fips_test_vector vec; 197d30ea906Sjfb8856606 extern struct fips_test_interim_info info; 198d30ea906Sjfb8856606 199d30ea906Sjfb8856606 int 200d30ea906Sjfb8856606 fips_test_init(const char *req_file_path, const char *rsp_file_path, 201d30ea906Sjfb8856606 const char *device_name); 202d30ea906Sjfb8856606 203d30ea906Sjfb8856606 void 204d30ea906Sjfb8856606 fips_test_clear(void); 205d30ea906Sjfb8856606 206d30ea906Sjfb8856606 int 207d30ea906Sjfb8856606 fips_test_fetch_one_block(void); 208d30ea906Sjfb8856606 209d30ea906Sjfb8856606 int 210d30ea906Sjfb8856606 fips_test_parse_one_case(void); 211d30ea906Sjfb8856606 212d30ea906Sjfb8856606 void 213d30ea906Sjfb8856606 fips_test_write_one_case(void); 214d30ea906Sjfb8856606 215d30ea906Sjfb8856606 int 216d30ea906Sjfb8856606 parse_test_aes_init(void); 217d30ea906Sjfb8856606 218d30ea906Sjfb8856606 int 219d30ea906Sjfb8856606 parse_test_tdes_init(void); 220d30ea906Sjfb8856606 221d30ea906Sjfb8856606 int 222d30ea906Sjfb8856606 parse_test_hmac_init(void); 223d30ea906Sjfb8856606 224d30ea906Sjfb8856606 int 225d30ea906Sjfb8856606 parse_test_gcm_init(void); 226d30ea906Sjfb8856606 227d30ea906Sjfb8856606 int 228d30ea906Sjfb8856606 parse_test_cmac_init(void); 229d30ea906Sjfb8856606 230d30ea906Sjfb8856606 int 231d30ea906Sjfb8856606 parse_test_ccm_init(void); 232d30ea906Sjfb8856606 233d30ea906Sjfb8856606 int 2344418919fSjohnjiang parse_test_sha_init(void); 2354418919fSjohnjiang 2364418919fSjohnjiang int 237*2d9fd380Sjfb8856606 parse_test_xts_init(void); 238*2d9fd380Sjfb8856606 239*2d9fd380Sjfb8856606 int 240d30ea906Sjfb8856606 parser_read_uint8_hex(uint8_t *value, const char *p); 241d30ea906Sjfb8856606 242d30ea906Sjfb8856606 int 243d30ea906Sjfb8856606 parse_uint8_hex_str(const char *key, char *src, struct fips_val *val); 244d30ea906Sjfb8856606 245d30ea906Sjfb8856606 int 246d30ea906Sjfb8856606 parse_uint8_known_len_hex_str(const char *key, char *src, struct fips_val *val); 247d30ea906Sjfb8856606 248d30ea906Sjfb8856606 int 249d30ea906Sjfb8856606 parser_read_uint32_val(const char *key, char *src, struct fips_val *val); 250d30ea906Sjfb8856606 251d30ea906Sjfb8856606 int 252d30ea906Sjfb8856606 parser_read_uint32_bit_val(const char *key, char *src, struct fips_val *val); 253d30ea906Sjfb8856606 254d30ea906Sjfb8856606 int 255d30ea906Sjfb8856606 parser_read_uint32(uint32_t *value, char *p); 256d30ea906Sjfb8856606 257d30ea906Sjfb8856606 int 258d30ea906Sjfb8856606 parser_read_uint32_val(const char *key, char *src, struct fips_val *val); 259d30ea906Sjfb8856606 260d30ea906Sjfb8856606 int 261d30ea906Sjfb8856606 writeback_hex_str(const char *key, char *dst, struct fips_val *val); 262d30ea906Sjfb8856606 263d30ea906Sjfb8856606 void 264d30ea906Sjfb8856606 parse_write_hex_str(struct fips_val *src); 265d30ea906Sjfb8856606 266d30ea906Sjfb8856606 int 267d30ea906Sjfb8856606 update_info_vec(uint32_t count); 268d30ea906Sjfb8856606 269*2d9fd380Sjfb8856606 typedef int (*fips_test_one_case_t)(void); 270*2d9fd380Sjfb8856606 typedef int (*fips_prepare_op_t)(void); 271*2d9fd380Sjfb8856606 typedef int (*fips_prepare_xform_t)(struct rte_crypto_sym_xform *); 272*2d9fd380Sjfb8856606 273*2d9fd380Sjfb8856606 struct fips_test_ops { 274*2d9fd380Sjfb8856606 fips_prepare_xform_t prepare_xform; 275*2d9fd380Sjfb8856606 fips_prepare_op_t prepare_op; 276*2d9fd380Sjfb8856606 fips_test_one_case_t test; 277*2d9fd380Sjfb8856606 }; 278*2d9fd380Sjfb8856606 279*2d9fd380Sjfb8856606 extern struct fips_test_ops test_ops; 280*2d9fd380Sjfb8856606 281*2d9fd380Sjfb8856606 int prepare_aead_op(void); 282*2d9fd380Sjfb8856606 283*2d9fd380Sjfb8856606 int prepare_auth_op(void); 284*2d9fd380Sjfb8856606 285*2d9fd380Sjfb8856606 int prepare_gcm_xform(struct rte_crypto_sym_xform *xform); 286*2d9fd380Sjfb8856606 287*2d9fd380Sjfb8856606 int prepare_gmac_xform(struct rte_crypto_sym_xform *xform); 288*2d9fd380Sjfb8856606 289d30ea906Sjfb8856606 #endif 290