13d0fad56SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause 23d0fad56SMarko Kovacevic * Copyright(c) 2018 Intel Corporation 33d0fad56SMarko Kovacevic */ 43d0fad56SMarko Kovacevic 53d0fad56SMarko Kovacevic #include <sys/stat.h> 63d0fad56SMarko Kovacevic #include <getopt.h> 73d0fad56SMarko Kovacevic #include <dirent.h> 872b452c5SDmitry Kozlyuk #include <stdlib.h> 93d0fad56SMarko Kovacevic 103d0fad56SMarko Kovacevic #include <rte_cryptodev.h> 1174645f64SAkhil Goyal #include <rte_malloc.h> 123d0fad56SMarko Kovacevic #include <rte_mempool.h> 133d0fad56SMarko Kovacevic #include <rte_mbuf.h> 143d0fad56SMarko Kovacevic #include <rte_string_fns.h> 15b7ceea22SBrian Dooley #include <rte_random.h> 163d0fad56SMarko Kovacevic 173d0fad56SMarko Kovacevic #include "fips_validation.h" 1841d561cbSFan Zhang #include "fips_dev_self_test.h" 193d0fad56SMarko Kovacevic 20fc6e6515SIbtisam Tariq enum { 21fc6e6515SIbtisam Tariq #define OPT_REQ_FILE_PATH "req-file" 22fc6e6515SIbtisam Tariq OPT_REQ_FILE_PATH_NUM = 256, 23fc6e6515SIbtisam Tariq #define OPT_RSP_FILE_PATH "rsp-file" 24fc6e6515SIbtisam Tariq OPT_RSP_FILE_PATH_NUM, 25fc6e6515SIbtisam Tariq #define OPT_MBUF_DATAROOM "mbuf-dataroom" 26fc6e6515SIbtisam Tariq OPT_MBUF_DATAROOM_NUM, 27fc6e6515SIbtisam Tariq #define OPT_FOLDER "path-is-folder" 28fc6e6515SIbtisam Tariq OPT_FOLDER_NUM, 29fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV "cryptodev" 30fc6e6515SIbtisam Tariq OPT_CRYPTODEV_NUM, 31fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_ID "cryptodev-id" 32fc6e6515SIbtisam Tariq OPT_CRYPTODEV_ID_NUM, 33fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_ST "self-test" 34fc6e6515SIbtisam Tariq OPT_CRYPTODEV_ST_NUM, 35fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_BK_ID "broken-test-id" 36fc6e6515SIbtisam Tariq OPT_CRYPTODEV_BK_ID_NUM, 37fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_BK_DIR_KEY "broken-test-dir" 38fc6e6515SIbtisam Tariq OPT_CRYPTODEV_BK_DIR_KEY_NUM, 3989be27e3SBrandon Lo #define OPT_USE_JSON "use-json" 4089be27e3SBrandon Lo OPT_USE_JSON_NUM, 4136128a67SGowrishankar Muthukrishnan #define OPT_CRYPTODEV_ASYM "asymmetric" 4236128a67SGowrishankar Muthukrishnan OPT_CRYPTODEV_ASYM_NUM, 43fc6e6515SIbtisam Tariq }; 443d0fad56SMarko Kovacevic 453d0fad56SMarko Kovacevic struct fips_test_vector vec; 463d0fad56SMarko Kovacevic struct fips_test_interim_info info; 473d0fad56SMarko Kovacevic 488d70a194SDavid Marchand #ifdef USE_JANSSON 4958cc9880SBrandon Lo struct fips_test_json_info json_info; 508d70a194SDavid Marchand #endif /* USE_JANSSON */ 5158cc9880SBrandon Lo 523d0fad56SMarko Kovacevic struct cryptodev_fips_validate_env { 533d0fad56SMarko Kovacevic const char *req_path; 543d0fad56SMarko Kovacevic const char *rsp_path; 553d0fad56SMarko Kovacevic uint32_t is_path_folder; 56952e10cdSFan Zhang uint8_t dev_id; 573d0fad56SMarko Kovacevic struct rte_mempool *mpool; 5836128a67SGowrishankar Muthukrishnan struct fips_sym_env { 59261bbff7SFan Zhang struct rte_mempool *sess_mpool; 603d0fad56SMarko Kovacevic struct rte_mempool *op_pool; 6136128a67SGowrishankar Muthukrishnan struct rte_cryptodev_sym_session *sess; 6236128a67SGowrishankar Muthukrishnan struct rte_crypto_op *op; 6336128a67SGowrishankar Muthukrishnan } sym; 6436128a67SGowrishankar Muthukrishnan struct fips_asym_env { 6536128a67SGowrishankar Muthukrishnan struct rte_mempool *sess_mpool; 6636128a67SGowrishankar Muthukrishnan struct rte_mempool *op_pool; 6736128a67SGowrishankar Muthukrishnan struct rte_cryptodev_asym_session *sess; 6836128a67SGowrishankar Muthukrishnan struct rte_crypto_op *op; 6936128a67SGowrishankar Muthukrishnan } asym; 7036128a67SGowrishankar Muthukrishnan struct rte_crypto_op *op; 7136128a67SGowrishankar Muthukrishnan uint8_t dev_support_sgl; 7236128a67SGowrishankar Muthukrishnan uint16_t mbuf_data_room; 733d0fad56SMarko Kovacevic struct rte_mbuf *mbuf; 74952e10cdSFan Zhang uint8_t *digest; 75952e10cdSFan Zhang uint16_t digest_len; 7636128a67SGowrishankar Muthukrishnan bool is_asym_test; 77952e10cdSFan Zhang uint16_t self_test; 7841d561cbSFan Zhang struct fips_dev_broken_test_config *broken_test_config; 793d0fad56SMarko Kovacevic } env; 803d0fad56SMarko Kovacevic 813d0fad56SMarko Kovacevic static int 8236128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_sym_init(void) 8336128a67SGowrishankar Muthukrishnan { 8436128a67SGowrishankar Muthukrishnan uint32_t sess_sz = rte_cryptodev_sym_get_private_session_size( 8536128a67SGowrishankar Muthukrishnan env.dev_id); 8636128a67SGowrishankar Muthukrishnan struct rte_cryptodev_info dev_info; 8736128a67SGowrishankar Muthukrishnan struct fips_sym_env *sym = &env.sym; 8836128a67SGowrishankar Muthukrishnan int ret; 8936128a67SGowrishankar Muthukrishnan 9036128a67SGowrishankar Muthukrishnan rte_cryptodev_info_get(env.dev_id, &dev_info); 9136128a67SGowrishankar Muthukrishnan if (dev_info.feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL) 9236128a67SGowrishankar Muthukrishnan env.dev_support_sgl = 1; 9336128a67SGowrishankar Muthukrishnan else 9436128a67SGowrishankar Muthukrishnan env.dev_support_sgl = 0; 9536128a67SGowrishankar Muthukrishnan 9636128a67SGowrishankar Muthukrishnan ret = -ENOMEM; 9736128a67SGowrishankar Muthukrishnan sym->sess_mpool = rte_cryptodev_sym_session_pool_create( 9836128a67SGowrishankar Muthukrishnan "FIPS_SYM_SESS_MEMPOOL", 16, sess_sz, 0, 0, rte_socket_id()); 9936128a67SGowrishankar Muthukrishnan if (!sym->sess_mpool) 10036128a67SGowrishankar Muthukrishnan goto error_exit; 10136128a67SGowrishankar Muthukrishnan 10236128a67SGowrishankar Muthukrishnan sym->op_pool = rte_crypto_op_pool_create( 10336128a67SGowrishankar Muthukrishnan "FIPS_OP_SYM_POOL", 10436128a67SGowrishankar Muthukrishnan RTE_CRYPTO_OP_TYPE_SYMMETRIC, 10536128a67SGowrishankar Muthukrishnan 1, 0, 10636128a67SGowrishankar Muthukrishnan 16, 10736128a67SGowrishankar Muthukrishnan rte_socket_id()); 10836128a67SGowrishankar Muthukrishnan if (!sym->op_pool) 10936128a67SGowrishankar Muthukrishnan goto error_exit; 11036128a67SGowrishankar Muthukrishnan 11136128a67SGowrishankar Muthukrishnan sym->op = rte_crypto_op_alloc(sym->op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11236128a67SGowrishankar Muthukrishnan if (!sym->op) 11336128a67SGowrishankar Muthukrishnan goto error_exit; 11436128a67SGowrishankar Muthukrishnan 11536128a67SGowrishankar Muthukrishnan return 0; 11636128a67SGowrishankar Muthukrishnan 11736128a67SGowrishankar Muthukrishnan error_exit: 11836128a67SGowrishankar Muthukrishnan rte_mempool_free(sym->sess_mpool); 11936128a67SGowrishankar Muthukrishnan rte_mempool_free(sym->op_pool); 12036128a67SGowrishankar Muthukrishnan return ret; 12136128a67SGowrishankar Muthukrishnan } 12236128a67SGowrishankar Muthukrishnan 12336128a67SGowrishankar Muthukrishnan static void 12436128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_sym_uninit(void) 12536128a67SGowrishankar Muthukrishnan { 12636128a67SGowrishankar Muthukrishnan struct fips_sym_env *sym = &env.sym; 12736128a67SGowrishankar Muthukrishnan 12836128a67SGowrishankar Muthukrishnan rte_pktmbuf_free(env.mbuf); 12936128a67SGowrishankar Muthukrishnan rte_crypto_op_free(sym->op); 13036128a67SGowrishankar Muthukrishnan rte_cryptodev_sym_session_free(env.dev_id, sym->sess); 13136128a67SGowrishankar Muthukrishnan rte_mempool_free(sym->sess_mpool); 13236128a67SGowrishankar Muthukrishnan rte_mempool_free(sym->op_pool); 13336128a67SGowrishankar Muthukrishnan } 13436128a67SGowrishankar Muthukrishnan 13536128a67SGowrishankar Muthukrishnan static int 13636128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_asym_init(void) 13736128a67SGowrishankar Muthukrishnan { 13836128a67SGowrishankar Muthukrishnan struct fips_asym_env *asym = &env.asym; 13936128a67SGowrishankar Muthukrishnan int ret; 14036128a67SGowrishankar Muthukrishnan 14136128a67SGowrishankar Muthukrishnan ret = -ENOMEM; 14236128a67SGowrishankar Muthukrishnan asym->sess_mpool = rte_cryptodev_asym_session_pool_create( 14336128a67SGowrishankar Muthukrishnan "FIPS_ASYM_SESS_MEMPOOL", 16, 0, 0, rte_socket_id()); 14436128a67SGowrishankar Muthukrishnan if (!asym->sess_mpool) 14536128a67SGowrishankar Muthukrishnan goto error_exit; 14636128a67SGowrishankar Muthukrishnan 14736128a67SGowrishankar Muthukrishnan asym->op_pool = rte_crypto_op_pool_create( 14836128a67SGowrishankar Muthukrishnan "FIPS_OP_ASYM_POOL", 14936128a67SGowrishankar Muthukrishnan RTE_CRYPTO_OP_TYPE_ASYMMETRIC, 15036128a67SGowrishankar Muthukrishnan 1, 0, 15136128a67SGowrishankar Muthukrishnan 16, 15236128a67SGowrishankar Muthukrishnan rte_socket_id()); 15336128a67SGowrishankar Muthukrishnan if (!asym->op_pool) 15436128a67SGowrishankar Muthukrishnan goto error_exit; 15536128a67SGowrishankar Muthukrishnan 15636128a67SGowrishankar Muthukrishnan asym->op = rte_crypto_op_alloc(asym->op_pool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC); 15736128a67SGowrishankar Muthukrishnan if (!asym->op) 15836128a67SGowrishankar Muthukrishnan goto error_exit; 15936128a67SGowrishankar Muthukrishnan 16036128a67SGowrishankar Muthukrishnan return 0; 16136128a67SGowrishankar Muthukrishnan 16236128a67SGowrishankar Muthukrishnan error_exit: 16336128a67SGowrishankar Muthukrishnan rte_mempool_free(asym->sess_mpool); 16436128a67SGowrishankar Muthukrishnan rte_mempool_free(asym->op_pool); 16536128a67SGowrishankar Muthukrishnan return ret; 16636128a67SGowrishankar Muthukrishnan } 16736128a67SGowrishankar Muthukrishnan 16836128a67SGowrishankar Muthukrishnan static void 16936128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_asym_uninit(void) 17036128a67SGowrishankar Muthukrishnan { 17136128a67SGowrishankar Muthukrishnan struct fips_asym_env *asym = &env.asym; 17236128a67SGowrishankar Muthukrishnan 17336128a67SGowrishankar Muthukrishnan rte_crypto_op_free(asym->op); 17436128a67SGowrishankar Muthukrishnan rte_cryptodev_asym_session_free(env.dev_id, asym->sess); 17536128a67SGowrishankar Muthukrishnan rte_mempool_free(asym->sess_mpool); 17636128a67SGowrishankar Muthukrishnan rte_mempool_free(asym->op_pool); 17736128a67SGowrishankar Muthukrishnan } 17836128a67SGowrishankar Muthukrishnan 17936128a67SGowrishankar Muthukrishnan static int 18036128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_init(void) 1813d0fad56SMarko Kovacevic { 182c9030ae3SAnoob Joseph struct rte_cryptodev_config conf = {rte_socket_id(), 1, 0}; 183bdce2564SAkhil Goyal struct rte_cryptodev_qp_conf qp_conf = {128, NULL}; 184952e10cdSFan Zhang uint32_t nb_mbufs = UINT16_MAX / env.mbuf_data_room + 1; 1853d0fad56SMarko Kovacevic int ret; 1863d0fad56SMarko Kovacevic 18741d561cbSFan Zhang if (env.self_test) { 18841d561cbSFan Zhang ret = fips_dev_self_test(env.dev_id, env.broken_test_config); 18941d561cbSFan Zhang if (ret < 0) { 19036128a67SGowrishankar Muthukrishnan rte_cryptodev_stop(env.dev_id); 19174645f64SAkhil Goyal rte_cryptodev_close(env.dev_id); 19241d561cbSFan Zhang 19341d561cbSFan Zhang return ret; 19441d561cbSFan Zhang } 19541d561cbSFan Zhang } 19641d561cbSFan Zhang 1973d0fad56SMarko Kovacevic ret = rte_cryptodev_configure(env.dev_id, &conf); 1983d0fad56SMarko Kovacevic if (ret < 0) 1993d0fad56SMarko Kovacevic return ret; 2003d0fad56SMarko Kovacevic 20136128a67SGowrishankar Muthukrishnan ret = -ENOMEM; 202952e10cdSFan Zhang env.mpool = rte_pktmbuf_pool_create("FIPS_MEMPOOL", nb_mbufs, 203952e10cdSFan Zhang 0, 0, sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM + 204952e10cdSFan Zhang env.mbuf_data_room, rte_socket_id()); 2053d0fad56SMarko Kovacevic if (!env.mpool) 2063d0fad56SMarko Kovacevic return ret; 2073d0fad56SMarko Kovacevic 20836128a67SGowrishankar Muthukrishnan ret = cryptodev_fips_validate_app_sym_init(); 2093d0fad56SMarko Kovacevic if (ret < 0) 210261bbff7SFan Zhang goto error_exit; 211261bbff7SFan Zhang 21236128a67SGowrishankar Muthukrishnan if (env.is_asym_test) { 21336128a67SGowrishankar Muthukrishnan ret = cryptodev_fips_validate_app_asym_init(); 21436128a67SGowrishankar Muthukrishnan if (ret < 0) 2153d0fad56SMarko Kovacevic goto error_exit; 21636128a67SGowrishankar Muthukrishnan } 2173d0fad56SMarko Kovacevic 21836128a67SGowrishankar Muthukrishnan qp_conf.mp_session = env.sym.sess_mpool; 219261bbff7SFan Zhang 220261bbff7SFan Zhang ret = rte_cryptodev_queue_pair_setup(env.dev_id, 0, &qp_conf, 221261bbff7SFan Zhang rte_socket_id()); 222261bbff7SFan Zhang if (ret < 0) 223261bbff7SFan Zhang goto error_exit; 224261bbff7SFan Zhang 2253b2311ccSFan Zhang ret = rte_cryptodev_start(env.dev_id); 2263b2311ccSFan Zhang if (ret < 0) 2273b2311ccSFan Zhang goto error_exit; 2283b2311ccSFan Zhang 2293d0fad56SMarko Kovacevic return 0; 2303d0fad56SMarko Kovacevic 2313d0fad56SMarko Kovacevic error_exit: 2323d0fad56SMarko Kovacevic rte_mempool_free(env.mpool); 2333d0fad56SMarko Kovacevic return ret; 2343d0fad56SMarko Kovacevic } 2353d0fad56SMarko Kovacevic 2363d0fad56SMarko Kovacevic static void 2373d0fad56SMarko Kovacevic cryptodev_fips_validate_app_uninit(void) 2383d0fad56SMarko Kovacevic { 23936128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_sym_uninit(); 24036128a67SGowrishankar Muthukrishnan 24136128a67SGowrishankar Muthukrishnan if (env.is_asym_test) 24236128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_asym_uninit(); 24336128a67SGowrishankar Muthukrishnan 2443d0fad56SMarko Kovacevic rte_mempool_free(env.mpool); 24536128a67SGowrishankar Muthukrishnan rte_cryptodev_stop(env.dev_id); 24636128a67SGowrishankar Muthukrishnan rte_cryptodev_close(env.dev_id); 2473d0fad56SMarko Kovacevic } 2483d0fad56SMarko Kovacevic 2493d0fad56SMarko Kovacevic static int 2503d0fad56SMarko Kovacevic fips_test_one_file(void); 2513d0fad56SMarko Kovacevic 2528d70a194SDavid Marchand #ifdef USE_JANSSON 25389be27e3SBrandon Lo static int 25489be27e3SBrandon Lo fips_test_one_json_file(void); 2558d70a194SDavid Marchand #endif /* USE_JANSSON */ 25689be27e3SBrandon Lo 2573d0fad56SMarko Kovacevic static int 2583d0fad56SMarko Kovacevic parse_cryptodev_arg(char *arg) 2593d0fad56SMarko Kovacevic { 2603d0fad56SMarko Kovacevic int id = rte_cryptodev_get_dev_id(arg); 2613d0fad56SMarko Kovacevic 2623d0fad56SMarko Kovacevic if (id < 0) { 2633d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev name %s\n", 2643d0fad56SMarko Kovacevic id, arg); 2653d0fad56SMarko Kovacevic return id; 2663d0fad56SMarko Kovacevic } 2673d0fad56SMarko Kovacevic 268952e10cdSFan Zhang env.dev_id = (uint8_t)id; 2693d0fad56SMarko Kovacevic 2703d0fad56SMarko Kovacevic return 0; 2713d0fad56SMarko Kovacevic } 2723d0fad56SMarko Kovacevic 2733d0fad56SMarko Kovacevic static int 2743d0fad56SMarko Kovacevic parse_cryptodev_id_arg(char *arg) 2753d0fad56SMarko Kovacevic { 2763d0fad56SMarko Kovacevic uint32_t cryptodev_id; 2773d0fad56SMarko Kovacevic 2783d0fad56SMarko Kovacevic if (parser_read_uint32(&cryptodev_id, arg) < 0) { 2793d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n", 2803d0fad56SMarko Kovacevic -EINVAL, arg); 2813d0fad56SMarko Kovacevic return -1; 2823d0fad56SMarko Kovacevic } 2833d0fad56SMarko Kovacevic 2843d0fad56SMarko Kovacevic 285e74abd48SAkhil Goyal if (!rte_cryptodev_is_valid_dev(cryptodev_id)) { 2863d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n", 2873d0fad56SMarko Kovacevic cryptodev_id, arg); 2883d0fad56SMarko Kovacevic return -1; 2893d0fad56SMarko Kovacevic } 2903d0fad56SMarko Kovacevic 291952e10cdSFan Zhang env.dev_id = (uint8_t)cryptodev_id; 2923d0fad56SMarko Kovacevic 2933d0fad56SMarko Kovacevic return 0; 2943d0fad56SMarko Kovacevic } 2953d0fad56SMarko Kovacevic 2963d0fad56SMarko Kovacevic static void 2973d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(const char *prgname) 2983d0fad56SMarko Kovacevic { 299952e10cdSFan Zhang uint32_t def_mbuf_seg_size = DEF_MBUF_SEG_SIZE; 3003d0fad56SMarko Kovacevic printf("%s [EAL options] --\n" 3013d0fad56SMarko Kovacevic " --%s: REQUEST-FILE-PATH\n" 3023d0fad56SMarko Kovacevic " --%s: RESPONSE-FILE-PATH\n" 3033d0fad56SMarko Kovacevic " --%s: indicating both paths are folders\n" 304952e10cdSFan Zhang " --%s: mbuf dataroom size (default %u bytes)\n" 3053d0fad56SMarko Kovacevic " --%s: CRYPTODEV-NAME\n" 30641d561cbSFan Zhang " --%s: CRYPTODEV-ID-NAME\n" 30741d561cbSFan Zhang " --%s: self test indicator\n" 30841d561cbSFan Zhang " --%s: self broken test ID\n" 30941d561cbSFan Zhang " --%s: self broken test direction\n", 310fc6e6515SIbtisam Tariq prgname, OPT_REQ_FILE_PATH, OPT_RSP_FILE_PATH, 311fc6e6515SIbtisam Tariq OPT_FOLDER, OPT_MBUF_DATAROOM, def_mbuf_seg_size, 312fc6e6515SIbtisam Tariq OPT_CRYPTODEV, OPT_CRYPTODEV_ID, OPT_CRYPTODEV_ST, 313fc6e6515SIbtisam Tariq OPT_CRYPTODEV_BK_ID, OPT_CRYPTODEV_BK_DIR_KEY); 3143d0fad56SMarko Kovacevic } 3153d0fad56SMarko Kovacevic 3163d0fad56SMarko Kovacevic static int 3173d0fad56SMarko Kovacevic cryptodev_fips_validate_parse_args(int argc, char **argv) 3183d0fad56SMarko Kovacevic { 3193d0fad56SMarko Kovacevic int opt, ret; 3203d0fad56SMarko Kovacevic char *prgname = argv[0]; 3213d0fad56SMarko Kovacevic char **argvopt; 3223d0fad56SMarko Kovacevic int option_index; 3233d0fad56SMarko Kovacevic struct option lgopts[] = { 324fc6e6515SIbtisam Tariq {OPT_REQ_FILE_PATH, required_argument, 325fc6e6515SIbtisam Tariq NULL, OPT_REQ_FILE_PATH_NUM}, 326fc6e6515SIbtisam Tariq {OPT_RSP_FILE_PATH, required_argument, 327fc6e6515SIbtisam Tariq NULL, OPT_RSP_FILE_PATH_NUM}, 328fc6e6515SIbtisam Tariq {OPT_FOLDER, no_argument, 329fc6e6515SIbtisam Tariq NULL, OPT_FOLDER_NUM}, 330fc6e6515SIbtisam Tariq {OPT_MBUF_DATAROOM, required_argument, 331fc6e6515SIbtisam Tariq NULL, OPT_MBUF_DATAROOM_NUM}, 332fc6e6515SIbtisam Tariq {OPT_CRYPTODEV, required_argument, 333fc6e6515SIbtisam Tariq NULL, OPT_CRYPTODEV_NUM}, 334fc6e6515SIbtisam Tariq {OPT_CRYPTODEV_ID, required_argument, 335fc6e6515SIbtisam Tariq NULL, OPT_CRYPTODEV_ID_NUM}, 336fc6e6515SIbtisam Tariq {OPT_CRYPTODEV_ST, no_argument, 337fc6e6515SIbtisam Tariq NULL, OPT_CRYPTODEV_ST_NUM}, 338fc6e6515SIbtisam Tariq {OPT_CRYPTODEV_BK_ID, required_argument, 339fc6e6515SIbtisam Tariq NULL, OPT_CRYPTODEV_BK_ID_NUM}, 340fc6e6515SIbtisam Tariq {OPT_CRYPTODEV_BK_DIR_KEY, required_argument, 341fc6e6515SIbtisam Tariq NULL, OPT_CRYPTODEV_BK_DIR_KEY_NUM}, 34236128a67SGowrishankar Muthukrishnan {OPT_CRYPTODEV_ASYM, no_argument, 34336128a67SGowrishankar Muthukrishnan NULL, OPT_CRYPTODEV_ASYM_NUM}, 3443d0fad56SMarko Kovacevic {NULL, 0, 0, 0} 3453d0fad56SMarko Kovacevic }; 3463d0fad56SMarko Kovacevic 3473d0fad56SMarko Kovacevic argvopt = argv; 3483d0fad56SMarko Kovacevic 349952e10cdSFan Zhang env.mbuf_data_room = DEF_MBUF_SEG_SIZE; 350952e10cdSFan Zhang if (rte_cryptodev_count()) 351952e10cdSFan Zhang env.dev_id = 0; 352952e10cdSFan Zhang else { 353952e10cdSFan Zhang cryptodev_fips_validate_usage(prgname); 354952e10cdSFan Zhang return -EINVAL; 355952e10cdSFan Zhang } 356952e10cdSFan Zhang 3573d0fad56SMarko Kovacevic while ((opt = getopt_long(argc, argvopt, "s:", 3583d0fad56SMarko Kovacevic lgopts, &option_index)) != EOF) { 3593d0fad56SMarko Kovacevic 3603d0fad56SMarko Kovacevic switch (opt) { 361fc6e6515SIbtisam Tariq case OPT_REQ_FILE_PATH_NUM: 3623d0fad56SMarko Kovacevic env.req_path = optarg; 363fc6e6515SIbtisam Tariq break; 364fc6e6515SIbtisam Tariq 365fc6e6515SIbtisam Tariq case OPT_RSP_FILE_PATH_NUM: 3663d0fad56SMarko Kovacevic env.rsp_path = optarg; 367fc6e6515SIbtisam Tariq break; 368fc6e6515SIbtisam Tariq 369fc6e6515SIbtisam Tariq case OPT_FOLDER_NUM: 3703d0fad56SMarko Kovacevic env.is_path_folder = 1; 371fc6e6515SIbtisam Tariq break; 372fc6e6515SIbtisam Tariq 373fc6e6515SIbtisam Tariq case OPT_CRYPTODEV_NUM: 3743d0fad56SMarko Kovacevic ret = parse_cryptodev_arg(optarg); 3753d0fad56SMarko Kovacevic if (ret < 0) { 3763d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(prgname); 3773d0fad56SMarko Kovacevic return -EINVAL; 3783d0fad56SMarko Kovacevic } 379fc6e6515SIbtisam Tariq break; 380fc6e6515SIbtisam Tariq 381fc6e6515SIbtisam Tariq case OPT_CRYPTODEV_ID_NUM: 3823d0fad56SMarko Kovacevic ret = parse_cryptodev_id_arg(optarg); 3833d0fad56SMarko Kovacevic if (ret < 0) { 3843d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(prgname); 3853d0fad56SMarko Kovacevic return -EINVAL; 3863d0fad56SMarko Kovacevic } 387fc6e6515SIbtisam Tariq break; 388fc6e6515SIbtisam Tariq 389fc6e6515SIbtisam Tariq case OPT_CRYPTODEV_ST_NUM: 39041d561cbSFan Zhang env.self_test = 1; 391fc6e6515SIbtisam Tariq break; 392fc6e6515SIbtisam Tariq 393fc6e6515SIbtisam Tariq case OPT_CRYPTODEV_BK_ID_NUM: 39441d561cbSFan Zhang if (!env.broken_test_config) { 39541d561cbSFan Zhang env.broken_test_config = rte_malloc( 39641d561cbSFan Zhang NULL, 39741d561cbSFan Zhang sizeof(*env.broken_test_config), 39841d561cbSFan Zhang 0); 39941d561cbSFan Zhang if (!env.broken_test_config) 40041d561cbSFan Zhang return -ENOMEM; 40141d561cbSFan Zhang 40241d561cbSFan Zhang env.broken_test_config->expect_fail_dir = 40341d561cbSFan Zhang self_test_dir_enc_auth_gen; 40441d561cbSFan Zhang } 40541d561cbSFan Zhang 40641d561cbSFan Zhang if (parser_read_uint32( 40741d561cbSFan Zhang &env.broken_test_config->expect_fail_test_idx, 40841d561cbSFan Zhang optarg) < 0) { 40941d561cbSFan Zhang rte_free(env.broken_test_config); 41041d561cbSFan Zhang cryptodev_fips_validate_usage(prgname); 41141d561cbSFan Zhang return -EINVAL; 41241d561cbSFan Zhang } 413fc6e6515SIbtisam Tariq break; 414fc6e6515SIbtisam Tariq 415fc6e6515SIbtisam Tariq case OPT_CRYPTODEV_BK_DIR_KEY_NUM: 41641d561cbSFan Zhang if (!env.broken_test_config) { 41741d561cbSFan Zhang env.broken_test_config = rte_malloc( 41841d561cbSFan Zhang NULL, 41941d561cbSFan Zhang sizeof(*env.broken_test_config), 42041d561cbSFan Zhang 0); 42141d561cbSFan Zhang if (!env.broken_test_config) 42241d561cbSFan Zhang return -ENOMEM; 42341d561cbSFan Zhang 424fc6e6515SIbtisam Tariq env.broken_test_config->expect_fail_test_idx = 425fc6e6515SIbtisam Tariq 0; 42641d561cbSFan Zhang } 42741d561cbSFan Zhang 428fc6e6515SIbtisam Tariq if (strcmp(optarg, "enc") == 0) 42941d561cbSFan Zhang env.broken_test_config->expect_fail_dir = 43041d561cbSFan Zhang self_test_dir_enc_auth_gen; 431fc6e6515SIbtisam Tariq else if (strcmp(optarg, "dec") 43241d561cbSFan Zhang == 0) 43341d561cbSFan Zhang env.broken_test_config->expect_fail_dir = 43441d561cbSFan Zhang self_test_dir_dec_auth_verify; 43541d561cbSFan Zhang else { 43641d561cbSFan Zhang rte_free(env.broken_test_config); 43741d561cbSFan Zhang cryptodev_fips_validate_usage(prgname); 43841d561cbSFan Zhang return -EINVAL; 43941d561cbSFan Zhang } 440fc6e6515SIbtisam Tariq break; 441952e10cdSFan Zhang 442fc6e6515SIbtisam Tariq 443fc6e6515SIbtisam Tariq case OPT_MBUF_DATAROOM_NUM: 444fc6e6515SIbtisam Tariq if (parser_read_uint16(&env.mbuf_data_room, 445952e10cdSFan Zhang optarg) < 0) { 446952e10cdSFan Zhang cryptodev_fips_validate_usage(prgname); 447952e10cdSFan Zhang return -EINVAL; 448952e10cdSFan Zhang } 449952e10cdSFan Zhang 450fc6e6515SIbtisam Tariq if (env.mbuf_data_room == 0) { 4513d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(prgname); 4523d0fad56SMarko Kovacevic return -EINVAL; 4533d0fad56SMarko Kovacevic } 4543d0fad56SMarko Kovacevic break; 455fc6e6515SIbtisam Tariq 45636128a67SGowrishankar Muthukrishnan case OPT_CRYPTODEV_ASYM_NUM: 45736128a67SGowrishankar Muthukrishnan env.is_asym_test = true; 45836128a67SGowrishankar Muthukrishnan break; 45936128a67SGowrishankar Muthukrishnan 4603d0fad56SMarko Kovacevic default: 461fc6e6515SIbtisam Tariq cryptodev_fips_validate_usage(prgname); 462fc6e6515SIbtisam Tariq return -EINVAL; 4633d0fad56SMarko Kovacevic } 4643d0fad56SMarko Kovacevic } 4653d0fad56SMarko Kovacevic 4661442ab1aSOlivier Matz if ((env.req_path == NULL && env.rsp_path != NULL) || 4671442ab1aSOlivier Matz (env.req_path != NULL && env.rsp_path == NULL)) { 4681442ab1aSOlivier Matz RTE_LOG(ERR, USER1, "Missing req path or rsp path\n"); 4691442ab1aSOlivier Matz cryptodev_fips_validate_usage(prgname); 4701442ab1aSOlivier Matz return -EINVAL; 4711442ab1aSOlivier Matz } 4721442ab1aSOlivier Matz 4731442ab1aSOlivier Matz if (env.req_path == NULL && env.self_test == 0) { 4741442ab1aSOlivier Matz RTE_LOG(ERR, USER1, "--self-test must be set if req path is missing\n"); 4753d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(prgname); 4763d0fad56SMarko Kovacevic return -EINVAL; 4773d0fad56SMarko Kovacevic } 4783d0fad56SMarko Kovacevic 4793d0fad56SMarko Kovacevic return 0; 4803d0fad56SMarko Kovacevic } 4813d0fad56SMarko Kovacevic 4823d0fad56SMarko Kovacevic int 4833d0fad56SMarko Kovacevic main(int argc, char *argv[]) 4843d0fad56SMarko Kovacevic { 4853d0fad56SMarko Kovacevic int ret; 4863d0fad56SMarko Kovacevic 4873d0fad56SMarko Kovacevic ret = rte_eal_init(argc, argv); 4883d0fad56SMarko Kovacevic if (ret < 0) { 4893d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret); 4903d0fad56SMarko Kovacevic return -1; 4913d0fad56SMarko Kovacevic } 4923d0fad56SMarko Kovacevic 4933d0fad56SMarko Kovacevic argc -= ret; 4943d0fad56SMarko Kovacevic argv += ret; 4953d0fad56SMarko Kovacevic 4963d0fad56SMarko Kovacevic ret = cryptodev_fips_validate_parse_args(argc, argv); 4973d0fad56SMarko Kovacevic if (ret < 0) 4983d0fad56SMarko Kovacevic rte_exit(EXIT_FAILURE, "Failed to parse arguments!\n"); 4993d0fad56SMarko Kovacevic 50036128a67SGowrishankar Muthukrishnan ret = cryptodev_fips_validate_app_init(); 5013d0fad56SMarko Kovacevic if (ret < 0) { 5023d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret); 5033d0fad56SMarko Kovacevic return -1; 5043d0fad56SMarko Kovacevic } 5053d0fad56SMarko Kovacevic 5061442ab1aSOlivier Matz if (env.req_path == NULL || env.rsp_path == NULL) { 5071442ab1aSOlivier Matz printf("No request, exit.\n"); 5081442ab1aSOlivier Matz goto exit; 5091442ab1aSOlivier Matz } 5101442ab1aSOlivier Matz 5113d0fad56SMarko Kovacevic if (!env.is_path_folder) { 5123d0fad56SMarko Kovacevic printf("Processing file %s... ", env.req_path); 5133d0fad56SMarko Kovacevic 5143d0fad56SMarko Kovacevic ret = fips_test_init(env.req_path, env.rsp_path, 5153d0fad56SMarko Kovacevic rte_cryptodev_name_get(env.dev_id)); 5163d0fad56SMarko Kovacevic if (ret < 0) { 5173d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n", 5183d0fad56SMarko Kovacevic ret, env.req_path); 5193d0fad56SMarko Kovacevic goto exit; 5203d0fad56SMarko Kovacevic } 5213d0fad56SMarko Kovacevic 5228d70a194SDavid Marchand #ifdef USE_JANSSON 52389be27e3SBrandon Lo if (info.file_type == FIPS_TYPE_JSON) { 52489be27e3SBrandon Lo ret = fips_test_one_json_file(); 52589be27e3SBrandon Lo json_decref(json_info.json_root); 52689be27e3SBrandon Lo } else { 5273d0fad56SMarko Kovacevic ret = fips_test_one_file(); 52889be27e3SBrandon Lo } 5298d70a194SDavid Marchand #else /* USE_JANSSON */ 53089be27e3SBrandon Lo ret = fips_test_one_file(); 5318d70a194SDavid Marchand #endif /* USE_JANSSON */ 53289be27e3SBrandon Lo 5333d0fad56SMarko Kovacevic if (ret < 0) { 5343d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n", 5353d0fad56SMarko Kovacevic ret, env.req_path); 5363d0fad56SMarko Kovacevic goto exit; 5373d0fad56SMarko Kovacevic } 5383d0fad56SMarko Kovacevic 5393d0fad56SMarko Kovacevic printf("Done\n"); 5403d0fad56SMarko Kovacevic 5413d0fad56SMarko Kovacevic } else { 5423d0fad56SMarko Kovacevic struct dirent *dir; 5433d0fad56SMarko Kovacevic DIR *d_req, *d_rsp; 5443d0fad56SMarko Kovacevic char req_path[1024]; 5453d0fad56SMarko Kovacevic char rsp_path[1024]; 5463d0fad56SMarko Kovacevic 5473d0fad56SMarko Kovacevic d_req = opendir(env.req_path); 5483d0fad56SMarko Kovacevic if (!d_req) { 5493d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Path %s not exist\n", 5503d0fad56SMarko Kovacevic -EINVAL, env.req_path); 5513d0fad56SMarko Kovacevic goto exit; 5523d0fad56SMarko Kovacevic } 5533d0fad56SMarko Kovacevic 5543d0fad56SMarko Kovacevic d_rsp = opendir(env.rsp_path); 5553d0fad56SMarko Kovacevic if (!d_rsp) { 5563d0fad56SMarko Kovacevic ret = mkdir(env.rsp_path, 0700); 5573d0fad56SMarko Kovacevic if (ret == 0) 5583d0fad56SMarko Kovacevic d_rsp = opendir(env.rsp_path); 5593d0fad56SMarko Kovacevic else { 5603d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Invalid %s\n", 5613d0fad56SMarko Kovacevic -EINVAL, env.rsp_path); 5623d0fad56SMarko Kovacevic goto exit; 5633d0fad56SMarko Kovacevic } 5643d0fad56SMarko Kovacevic } 5653d0fad56SMarko Kovacevic closedir(d_rsp); 5663d0fad56SMarko Kovacevic 5673d0fad56SMarko Kovacevic while ((dir = readdir(d_req)) != NULL) { 5683d0fad56SMarko Kovacevic if (strstr(dir->d_name, "req") == NULL) 5693d0fad56SMarko Kovacevic continue; 5703d0fad56SMarko Kovacevic 5713d0fad56SMarko Kovacevic snprintf(req_path, 1023, "%s/%s", env.req_path, 5723d0fad56SMarko Kovacevic dir->d_name); 5733d0fad56SMarko Kovacevic snprintf(rsp_path, 1023, "%s/%s", env.rsp_path, 5743d0fad56SMarko Kovacevic dir->d_name); 5753d0fad56SMarko Kovacevic strlcpy(strstr(rsp_path, "req"), "rsp", 4); 5763d0fad56SMarko Kovacevic 5773d0fad56SMarko Kovacevic printf("Processing file %s... ", req_path); 5783d0fad56SMarko Kovacevic 5793d0fad56SMarko Kovacevic ret = fips_test_init(req_path, rsp_path, 5803d0fad56SMarko Kovacevic rte_cryptodev_name_get(env.dev_id)); 5813d0fad56SMarko Kovacevic if (ret < 0) { 5823d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n", 5833d0fad56SMarko Kovacevic ret, req_path); 5843d0fad56SMarko Kovacevic break; 5853d0fad56SMarko Kovacevic } 5863d0fad56SMarko Kovacevic 5878d70a194SDavid Marchand #ifdef USE_JANSSON 58889be27e3SBrandon Lo if (info.file_type == FIPS_TYPE_JSON) { 58989be27e3SBrandon Lo ret = fips_test_one_json_file(); 59089be27e3SBrandon Lo json_decref(json_info.json_root); 59189be27e3SBrandon Lo } else { 5923d0fad56SMarko Kovacevic ret = fips_test_one_file(); 59389be27e3SBrandon Lo } 5948d70a194SDavid Marchand #else /* USE_JANSSON */ 59589be27e3SBrandon Lo ret = fips_test_one_file(); 5968d70a194SDavid Marchand #endif /* USE_JANSSON */ 59789be27e3SBrandon Lo 5983d0fad56SMarko Kovacevic if (ret < 0) { 5993d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n", 6003d0fad56SMarko Kovacevic ret, req_path); 6013d0fad56SMarko Kovacevic break; 6023d0fad56SMarko Kovacevic } 6033d0fad56SMarko Kovacevic 6043d0fad56SMarko Kovacevic printf("Done\n"); 6053d0fad56SMarko Kovacevic } 6063d0fad56SMarko Kovacevic 6073d0fad56SMarko Kovacevic closedir(d_req); 6083d0fad56SMarko Kovacevic } 6093d0fad56SMarko Kovacevic 6103d0fad56SMarko Kovacevic 6113d0fad56SMarko Kovacevic exit: 6123d0fad56SMarko Kovacevic fips_test_clear(); 6133d0fad56SMarko Kovacevic cryptodev_fips_validate_app_uninit(); 6143d0fad56SMarko Kovacevic 61510aa3757SChengchang Tang /* clean up the EAL */ 61610aa3757SChengchang Tang rte_eal_cleanup(); 61710aa3757SChengchang Tang 6183d0fad56SMarko Kovacevic return ret; 6193d0fad56SMarko Kovacevic 6203d0fad56SMarko Kovacevic } 6213d0fad56SMarko Kovacevic 622cd255ccfSMarko Kovacevic #define IV_OFF (sizeof(struct rte_crypto_op) + sizeof(struct rte_crypto_sym_op)) 623cd255ccfSMarko Kovacevic #define CRYPTODEV_FIPS_MAX_RETRIES 16 624cd255ccfSMarko Kovacevic 625d09abf2dSFan Zhang struct fips_test_ops test_ops; 626cd255ccfSMarko Kovacevic 627cd255ccfSMarko Kovacevic static int 628952e10cdSFan Zhang prepare_data_mbufs(struct fips_val *val) 629952e10cdSFan Zhang { 630952e10cdSFan Zhang struct rte_mbuf *m, *head = 0; 631952e10cdSFan Zhang uint8_t *src = val->val; 632952e10cdSFan Zhang uint32_t total_len = val->len; 633952e10cdSFan Zhang uint16_t nb_seg; 634952e10cdSFan Zhang int ret = 0; 635952e10cdSFan Zhang 636952e10cdSFan Zhang rte_pktmbuf_free(env.mbuf); 637952e10cdSFan Zhang 638952e10cdSFan Zhang if (total_len > RTE_MBUF_MAX_NB_SEGS) { 639952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Data len %u too big\n", total_len); 640952e10cdSFan Zhang return -EPERM; 641952e10cdSFan Zhang } 642952e10cdSFan Zhang 643952e10cdSFan Zhang nb_seg = total_len / env.mbuf_data_room; 644952e10cdSFan Zhang if (total_len % env.mbuf_data_room) 645952e10cdSFan Zhang nb_seg++; 646952e10cdSFan Zhang 647952e10cdSFan Zhang m = rte_pktmbuf_alloc(env.mpool); 648952e10cdSFan Zhang if (!m) { 649952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Error %i: Not enough mbuf\n", 650952e10cdSFan Zhang -ENOMEM); 651952e10cdSFan Zhang return -ENOMEM; 652952e10cdSFan Zhang } 653952e10cdSFan Zhang head = m; 654952e10cdSFan Zhang 655952e10cdSFan Zhang while (nb_seg) { 656952e10cdSFan Zhang uint16_t len = RTE_MIN(total_len, env.mbuf_data_room); 657952e10cdSFan Zhang uint8_t *dst = (uint8_t *)rte_pktmbuf_append(m, len); 658952e10cdSFan Zhang 659952e10cdSFan Zhang if (!dst) { 660952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Error %i: MBUF too small\n", 661952e10cdSFan Zhang -ENOMEM); 662952e10cdSFan Zhang ret = -ENOMEM; 663952e10cdSFan Zhang goto error_exit; 664952e10cdSFan Zhang } 665952e10cdSFan Zhang 666952e10cdSFan Zhang memcpy(dst, src, len); 667952e10cdSFan Zhang 668952e10cdSFan Zhang if (head != m) { 669952e10cdSFan Zhang ret = rte_pktmbuf_chain(head, m); 670952e10cdSFan Zhang if (ret) { 671952e10cdSFan Zhang rte_pktmbuf_free(m); 672952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Error %i: SGL build\n", 673952e10cdSFan Zhang ret); 674952e10cdSFan Zhang goto error_exit; 675952e10cdSFan Zhang } 676952e10cdSFan Zhang } 677952e10cdSFan Zhang total_len -= len; 678952e10cdSFan Zhang 679952e10cdSFan Zhang if (total_len) { 680952e10cdSFan Zhang if (!env.dev_support_sgl) { 681952e10cdSFan Zhang RTE_LOG(ERR, USER1, "SGL not supported\n"); 682952e10cdSFan Zhang ret = -EPERM; 683952e10cdSFan Zhang goto error_exit; 684952e10cdSFan Zhang } 685952e10cdSFan Zhang 686952e10cdSFan Zhang m = rte_pktmbuf_alloc(env.mpool); 687952e10cdSFan Zhang if (!m) { 688952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Error %i: No memory\n", 689952e10cdSFan Zhang -ENOMEM); 690952e10cdSFan Zhang goto error_exit; 691952e10cdSFan Zhang } 692952e10cdSFan Zhang } else 693952e10cdSFan Zhang break; 694952e10cdSFan Zhang 695952e10cdSFan Zhang src += len; 696952e10cdSFan Zhang nb_seg--; 697952e10cdSFan Zhang } 698952e10cdSFan Zhang 699952e10cdSFan Zhang if (total_len) { 700952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Error %i: Failed to store all data\n", 701952e10cdSFan Zhang -ENOMEM); 702952e10cdSFan Zhang goto error_exit; 703952e10cdSFan Zhang } 704952e10cdSFan Zhang 705952e10cdSFan Zhang env.mbuf = head; 706952e10cdSFan Zhang 707952e10cdSFan Zhang return 0; 708952e10cdSFan Zhang 709952e10cdSFan Zhang error_exit: 710952e10cdSFan Zhang rte_pktmbuf_free(head); 711952e10cdSFan Zhang return ret; 712952e10cdSFan Zhang } 713952e10cdSFan Zhang 714952e10cdSFan Zhang static int 715cd255ccfSMarko Kovacevic prepare_cipher_op(void) 716cd255ccfSMarko Kovacevic { 717cd255ccfSMarko Kovacevic struct rte_crypto_sym_op *sym = env.op->sym; 718cd255ccfSMarko Kovacevic uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF); 719952e10cdSFan Zhang int ret; 720cd255ccfSMarko Kovacevic 721cd255ccfSMarko Kovacevic __rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC); 722cd255ccfSMarko Kovacevic 723cd255ccfSMarko Kovacevic memcpy(iv, vec.iv.val, vec.iv.len); 724cd255ccfSMarko Kovacevic 725cd255ccfSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) { 726952e10cdSFan Zhang ret = prepare_data_mbufs(&vec.pt); 727952e10cdSFan Zhang if (ret < 0) 728952e10cdSFan Zhang return ret; 729cd255ccfSMarko Kovacevic 730cd255ccfSMarko Kovacevic sym->cipher.data.length = vec.pt.len; 731cd255ccfSMarko Kovacevic } else { 732952e10cdSFan Zhang ret = prepare_data_mbufs(&vec.ct); 733952e10cdSFan Zhang if (ret < 0) 734952e10cdSFan Zhang return ret; 735cd255ccfSMarko Kovacevic 736cd255ccfSMarko Kovacevic sym->cipher.data.length = vec.ct.len; 737cd255ccfSMarko Kovacevic } 738cd255ccfSMarko Kovacevic 73936128a67SGowrishankar Muthukrishnan rte_crypto_op_attach_sym_session(env.op, env.sym.sess); 740cd255ccfSMarko Kovacevic 741952e10cdSFan Zhang sym->m_src = env.mbuf; 742952e10cdSFan Zhang sym->cipher.data.offset = 0; 743952e10cdSFan Zhang 744cd255ccfSMarko Kovacevic return 0; 745cd255ccfSMarko Kovacevic } 746cd255ccfSMarko Kovacevic 747d09abf2dSFan Zhang int 748f64adb67SMarko Kovacevic prepare_auth_op(void) 749f64adb67SMarko Kovacevic { 750f64adb67SMarko Kovacevic struct rte_crypto_sym_op *sym = env.op->sym; 751952e10cdSFan Zhang int ret; 752f64adb67SMarko Kovacevic 753f64adb67SMarko Kovacevic __rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC); 754952e10cdSFan Zhang 755e27268bdSBrian Dooley if (info.interim_info.gcm_data.gen_iv == 1) { 756e27268bdSBrian Dooley uint32_t i; 757e27268bdSBrian Dooley 758e27268bdSBrian Dooley if (!vec.iv.val) { 759e27268bdSBrian Dooley vec.iv.val = rte_malloc(0, vec.iv.len, 0); 760e27268bdSBrian Dooley if (!vec.iv.val) 761e27268bdSBrian Dooley return -ENOMEM; 762e27268bdSBrian Dooley } 763e27268bdSBrian Dooley 764e27268bdSBrian Dooley for (i = 0; i < vec.iv.len; i++) { 765b7ceea22SBrian Dooley int random = rte_rand(); 766e27268bdSBrian Dooley vec.iv.val[i] = (uint8_t)random; 767e27268bdSBrian Dooley } 768e27268bdSBrian Dooley } 769e27268bdSBrian Dooley 770d09abf2dSFan Zhang if (vec.iv.len) { 771d09abf2dSFan Zhang uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, 772d09abf2dSFan Zhang IV_OFF); 773d09abf2dSFan Zhang memset(iv, 0, vec.iv.len); 774d09abf2dSFan Zhang if (vec.iv.val) 775d09abf2dSFan Zhang memcpy(iv, vec.iv.val, vec.iv.len); 776d09abf2dSFan Zhang } 777d09abf2dSFan Zhang 778952e10cdSFan Zhang ret = prepare_data_mbufs(&vec.pt); 779952e10cdSFan Zhang if (ret < 0) 780952e10cdSFan Zhang return ret; 781952e10cdSFan Zhang 782952e10cdSFan Zhang rte_free(env.digest); 783952e10cdSFan Zhang 784952e10cdSFan Zhang env.digest = rte_zmalloc(NULL, vec.cipher_auth.digest.len, 785952e10cdSFan Zhang RTE_CACHE_LINE_SIZE); 786952e10cdSFan Zhang if (!env.digest) { 787952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Not enough memory\n"); 788952e10cdSFan Zhang return -ENOMEM; 789952e10cdSFan Zhang } 790952e10cdSFan Zhang env.digest_len = vec.cipher_auth.digest.len; 791f64adb67SMarko Kovacevic 792f64adb67SMarko Kovacevic sym->m_src = env.mbuf; 793f64adb67SMarko Kovacevic sym->auth.data.offset = 0; 794f64adb67SMarko Kovacevic sym->auth.data.length = vec.pt.len; 795952e10cdSFan Zhang sym->auth.digest.data = env.digest; 796952e10cdSFan Zhang sym->auth.digest.phys_addr = rte_malloc_virt2iova(env.digest); 797f64adb67SMarko Kovacevic 79882cfb9c2SFan Zhang if (info.op == FIPS_TEST_DEC_AUTH_VERIF) 799952e10cdSFan Zhang memcpy(env.digest, vec.cipher_auth.digest.val, 80082cfb9c2SFan Zhang vec.cipher_auth.digest.len); 801f64adb67SMarko Kovacevic 80236128a67SGowrishankar Muthukrishnan rte_crypto_op_attach_sym_session(env.op, env.sym.sess); 803c05e4ab7SThomas Monjalon 804c05e4ab7SThomas Monjalon return 0; 805f64adb67SMarko Kovacevic } 806f64adb67SMarko Kovacevic 807d09abf2dSFan Zhang int 8084aaad299SMarko Kovacevic prepare_aead_op(void) 8094aaad299SMarko Kovacevic { 8104aaad299SMarko Kovacevic struct rte_crypto_sym_op *sym = env.op->sym; 8114aaad299SMarko Kovacevic uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF); 812952e10cdSFan Zhang int ret; 8134aaad299SMarko Kovacevic 8144aaad299SMarko Kovacevic __rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8154aaad299SMarko Kovacevic 816305921f4SMarko Kovacevic if (info.algo == FIPS_TEST_ALGO_AES_CCM) 817952e10cdSFan Zhang iv++; 8184aaad299SMarko Kovacevic 819952e10cdSFan Zhang if (vec.iv.val) 820952e10cdSFan Zhang memcpy(iv, vec.iv.val, vec.iv.len); 821952e10cdSFan Zhang else 822952e10cdSFan Zhang /* if REQ file has iv length but not data, default as all 0 */ 823952e10cdSFan Zhang memset(iv, 0, vec.iv.len); 8244aaad299SMarko Kovacevic 8254aaad299SMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) { 826952e10cdSFan Zhang ret = prepare_data_mbufs(&vec.pt); 827952e10cdSFan Zhang if (ret < 0) 828952e10cdSFan Zhang return ret; 8294aaad299SMarko Kovacevic 830952e10cdSFan Zhang rte_free(env.digest); 831952e10cdSFan Zhang env.digest = rte_zmalloc(NULL, vec.aead.digest.len, 832952e10cdSFan Zhang RTE_CACHE_LINE_SIZE); 833952e10cdSFan Zhang if (!env.digest) { 834952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Not enough memory\n"); 8354aaad299SMarko Kovacevic return -ENOMEM; 8364aaad299SMarko Kovacevic } 83794dfc563SSamina Arshad env.digest_len = vec.aead.digest.len; 8384aaad299SMarko Kovacevic 8394aaad299SMarko Kovacevic sym->aead.data.length = vec.pt.len; 840952e10cdSFan Zhang sym->aead.digest.data = env.digest; 841952e10cdSFan Zhang sym->aead.digest.phys_addr = rte_malloc_virt2iova(env.digest); 8424aaad299SMarko Kovacevic } else { 843952e10cdSFan Zhang ret = prepare_data_mbufs(&vec.ct); 844952e10cdSFan Zhang if (ret < 0) 845952e10cdSFan Zhang return ret; 84694dfc563SSamina Arshad env.digest_len = vec.aead.digest.len; 8474aaad299SMarko Kovacevic sym->aead.data.length = vec.ct.len; 8484aaad299SMarko Kovacevic sym->aead.digest.data = vec.aead.digest.val; 8494aaad299SMarko Kovacevic sym->aead.digest.phys_addr = rte_malloc_virt2iova( 8504aaad299SMarko Kovacevic sym->aead.digest.data); 8514aaad299SMarko Kovacevic } 8524aaad299SMarko Kovacevic 853952e10cdSFan Zhang sym->m_src = env.mbuf; 854952e10cdSFan Zhang sym->aead.data.offset = 0; 855952e10cdSFan Zhang sym->aead.aad.data = vec.aead.aad.val; 856952e10cdSFan Zhang sym->aead.aad.phys_addr = rte_malloc_virt2iova(sym->aead.aad.data); 857952e10cdSFan Zhang 85836128a67SGowrishankar Muthukrishnan rte_crypto_op_attach_sym_session(env.op, env.sym.sess); 85936128a67SGowrishankar Muthukrishnan 86036128a67SGowrishankar Muthukrishnan return 0; 86136128a67SGowrishankar Muthukrishnan } 86236128a67SGowrishankar Muthukrishnan 86336128a67SGowrishankar Muthukrishnan static int 864ae5ae3bfSGowrishankar Muthukrishnan get_hash_oid(enum rte_crypto_auth_algorithm hash, uint8_t *buf) 865ae5ae3bfSGowrishankar Muthukrishnan { 866ae5ae3bfSGowrishankar Muthukrishnan uint8_t id_sha512[] = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 867ae5ae3bfSGowrishankar Muthukrishnan 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 868ae5ae3bfSGowrishankar Muthukrishnan 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 869ae5ae3bfSGowrishankar Muthukrishnan 0x40}; 870ae5ae3bfSGowrishankar Muthukrishnan uint8_t id_sha384[] = {0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 871ae5ae3bfSGowrishankar Muthukrishnan 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 872ae5ae3bfSGowrishankar Muthukrishnan 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 873ae5ae3bfSGowrishankar Muthukrishnan 0x30}; 874ae5ae3bfSGowrishankar Muthukrishnan uint8_t id_sha256[] = {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 875ae5ae3bfSGowrishankar Muthukrishnan 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 876ae5ae3bfSGowrishankar Muthukrishnan 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 877ae5ae3bfSGowrishankar Muthukrishnan 0x20}; 878ae5ae3bfSGowrishankar Muthukrishnan uint8_t id_sha224[] = {0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 879ae5ae3bfSGowrishankar Muthukrishnan 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 880ae5ae3bfSGowrishankar Muthukrishnan 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 881ae5ae3bfSGowrishankar Muthukrishnan 0x1c}; 882ae5ae3bfSGowrishankar Muthukrishnan uint8_t id_sha1[] = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 883ae5ae3bfSGowrishankar Muthukrishnan 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 884ae5ae3bfSGowrishankar Muthukrishnan 0x00, 0x04, 0x14}; 885ae5ae3bfSGowrishankar Muthukrishnan uint8_t *id = NULL; 886ae5ae3bfSGowrishankar Muthukrishnan int id_len = 0; 887ae5ae3bfSGowrishankar Muthukrishnan 888ae5ae3bfSGowrishankar Muthukrishnan switch (hash) { 889ae5ae3bfSGowrishankar Muthukrishnan case RTE_CRYPTO_AUTH_SHA1: 890ae5ae3bfSGowrishankar Muthukrishnan id = id_sha1; 891ae5ae3bfSGowrishankar Muthukrishnan id_len = sizeof(id_sha1); 892ae5ae3bfSGowrishankar Muthukrishnan break; 893ae5ae3bfSGowrishankar Muthukrishnan case RTE_CRYPTO_AUTH_SHA224: 894ae5ae3bfSGowrishankar Muthukrishnan id = id_sha224; 895ae5ae3bfSGowrishankar Muthukrishnan id_len = sizeof(id_sha224); 896ae5ae3bfSGowrishankar Muthukrishnan break; 897ae5ae3bfSGowrishankar Muthukrishnan case RTE_CRYPTO_AUTH_SHA256: 898ae5ae3bfSGowrishankar Muthukrishnan id = id_sha256; 899ae5ae3bfSGowrishankar Muthukrishnan id_len = sizeof(id_sha256); 900ae5ae3bfSGowrishankar Muthukrishnan break; 901ae5ae3bfSGowrishankar Muthukrishnan case RTE_CRYPTO_AUTH_SHA384: 902ae5ae3bfSGowrishankar Muthukrishnan id = id_sha384; 903ae5ae3bfSGowrishankar Muthukrishnan id_len = sizeof(id_sha384); 904ae5ae3bfSGowrishankar Muthukrishnan break; 905ae5ae3bfSGowrishankar Muthukrishnan case RTE_CRYPTO_AUTH_SHA512: 906ae5ae3bfSGowrishankar Muthukrishnan id = id_sha512; 907ae5ae3bfSGowrishankar Muthukrishnan id_len = sizeof(id_sha512); 908ae5ae3bfSGowrishankar Muthukrishnan break; 909ae5ae3bfSGowrishankar Muthukrishnan default: 910ae5ae3bfSGowrishankar Muthukrishnan id_len = -1; 911ae5ae3bfSGowrishankar Muthukrishnan break; 912ae5ae3bfSGowrishankar Muthukrishnan } 913ae5ae3bfSGowrishankar Muthukrishnan 914ae5ae3bfSGowrishankar Muthukrishnan if (id != NULL) 915ae5ae3bfSGowrishankar Muthukrishnan rte_memcpy(buf, id, id_len); 916ae5ae3bfSGowrishankar Muthukrishnan 917ae5ae3bfSGowrishankar Muthukrishnan return id_len; 918ae5ae3bfSGowrishankar Muthukrishnan } 919ae5ae3bfSGowrishankar Muthukrishnan 920ae5ae3bfSGowrishankar Muthukrishnan static int 92136128a67SGowrishankar Muthukrishnan prepare_rsa_op(void) 92236128a67SGowrishankar Muthukrishnan { 92336128a67SGowrishankar Muthukrishnan struct rte_crypto_asym_op *asym; 92436128a67SGowrishankar Muthukrishnan struct fips_val msg; 92536128a67SGowrishankar Muthukrishnan 92636128a67SGowrishankar Muthukrishnan __rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC); 92736128a67SGowrishankar Muthukrishnan 92836128a67SGowrishankar Muthukrishnan asym = env.op->asym; 92936128a67SGowrishankar Muthukrishnan if (env.digest) { 93036128a67SGowrishankar Muthukrishnan msg.val = env.digest; 93136128a67SGowrishankar Muthukrishnan msg.len = env.digest_len; 93236128a67SGowrishankar Muthukrishnan } else { 93336128a67SGowrishankar Muthukrishnan msg.val = vec.pt.val; 93436128a67SGowrishankar Muthukrishnan msg.len = vec.pt.len; 93536128a67SGowrishankar Muthukrishnan } 93636128a67SGowrishankar Muthukrishnan 93736128a67SGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_SIGGEN) { 93836128a67SGowrishankar Muthukrishnan asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN; 93936128a67SGowrishankar Muthukrishnan asym->rsa.message.data = msg.val; 94036128a67SGowrishankar Muthukrishnan asym->rsa.message.length = msg.len; 94136128a67SGowrishankar Muthukrishnan 94236128a67SGowrishankar Muthukrishnan rte_free(vec.rsa.signature.val); 94336128a67SGowrishankar Muthukrishnan 94436128a67SGowrishankar Muthukrishnan vec.rsa.signature.val = rte_zmalloc(NULL, vec.rsa.n.len, 0); 94536128a67SGowrishankar Muthukrishnan vec.rsa.signature.len = vec.rsa.n.len; 94636128a67SGowrishankar Muthukrishnan asym->rsa.sign.data = vec.rsa.signature.val; 94736128a67SGowrishankar Muthukrishnan asym->rsa.sign.length = 0; 94836128a67SGowrishankar Muthukrishnan } else if (info.op == FIPS_TEST_ASYM_SIGVER) { 94936128a67SGowrishankar Muthukrishnan asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY; 95036128a67SGowrishankar Muthukrishnan asym->rsa.message.data = msg.val; 95136128a67SGowrishankar Muthukrishnan asym->rsa.message.length = msg.len; 95236128a67SGowrishankar Muthukrishnan asym->rsa.sign.data = vec.rsa.signature.val; 95336128a67SGowrishankar Muthukrishnan asym->rsa.sign.length = vec.rsa.signature.len; 95436128a67SGowrishankar Muthukrishnan } else { 95536128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op); 95636128a67SGowrishankar Muthukrishnan return -EINVAL; 95736128a67SGowrishankar Muthukrishnan } 95836128a67SGowrishankar Muthukrishnan 95936128a67SGowrishankar Muthukrishnan rte_crypto_op_attach_asym_session(env.op, env.asym.sess); 960c05e4ab7SThomas Monjalon 961c05e4ab7SThomas Monjalon return 0; 9624aaad299SMarko Kovacevic } 9634aaad299SMarko Kovacevic 9644aaad299SMarko Kovacevic static int 965b455d261SGowrishankar Muthukrishnan prepare_ecdsa_op(void) 966b455d261SGowrishankar Muthukrishnan { 967b455d261SGowrishankar Muthukrishnan struct rte_crypto_asym_op *asym; 968b455d261SGowrishankar Muthukrishnan struct fips_val msg; 969b455d261SGowrishankar Muthukrishnan 970b455d261SGowrishankar Muthukrishnan __rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC); 971b455d261SGowrishankar Muthukrishnan 972b455d261SGowrishankar Muthukrishnan asym = env.op->asym; 973b455d261SGowrishankar Muthukrishnan if (env.digest) { 974b455d261SGowrishankar Muthukrishnan msg.val = env.digest; 975b455d261SGowrishankar Muthukrishnan msg.len = env.digest_len; 976b455d261SGowrishankar Muthukrishnan } else { 977b455d261SGowrishankar Muthukrishnan msg.val = vec.pt.val; 978b455d261SGowrishankar Muthukrishnan msg.len = vec.pt.len; 979b455d261SGowrishankar Muthukrishnan } 980b455d261SGowrishankar Muthukrishnan 981b455d261SGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_SIGGEN) { 982b455d261SGowrishankar Muthukrishnan asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN; 983b455d261SGowrishankar Muthukrishnan asym->ecdsa.message.data = msg.val; 984b455d261SGowrishankar Muthukrishnan asym->ecdsa.message.length = msg.len; 985b455d261SGowrishankar Muthukrishnan asym->ecdsa.k.data = vec.ecdsa.k.val; 986b455d261SGowrishankar Muthukrishnan asym->ecdsa.k.length = vec.ecdsa.k.len; 987b455d261SGowrishankar Muthukrishnan 988b455d261SGowrishankar Muthukrishnan rte_free(vec.ecdsa.r.val); 989b455d261SGowrishankar Muthukrishnan 990b455d261SGowrishankar Muthukrishnan rte_free(vec.ecdsa.s.val); 991b455d261SGowrishankar Muthukrishnan 992b455d261SGowrishankar Muthukrishnan vec.ecdsa.r.len = info.interim_info.ecdsa_data.curve_len; 993b455d261SGowrishankar Muthukrishnan vec.ecdsa.r.val = rte_zmalloc(NULL, vec.ecdsa.r.len, 0); 994b455d261SGowrishankar Muthukrishnan 995b455d261SGowrishankar Muthukrishnan vec.ecdsa.s.len = vec.ecdsa.r.len; 996b455d261SGowrishankar Muthukrishnan vec.ecdsa.s.val = rte_zmalloc(NULL, vec.ecdsa.s.len, 0); 997b455d261SGowrishankar Muthukrishnan 998b455d261SGowrishankar Muthukrishnan asym->ecdsa.r.data = vec.ecdsa.r.val; 999b455d261SGowrishankar Muthukrishnan asym->ecdsa.r.length = 0; 1000b455d261SGowrishankar Muthukrishnan asym->ecdsa.s.data = vec.ecdsa.s.val; 1001b455d261SGowrishankar Muthukrishnan asym->ecdsa.s.length = 0; 1002b455d261SGowrishankar Muthukrishnan } else if (info.op == FIPS_TEST_ASYM_SIGVER) { 1003b455d261SGowrishankar Muthukrishnan asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY; 1004b455d261SGowrishankar Muthukrishnan asym->ecdsa.message.data = msg.val; 1005b455d261SGowrishankar Muthukrishnan asym->ecdsa.message.length = msg.len; 1006b455d261SGowrishankar Muthukrishnan asym->ecdsa.r.data = vec.ecdsa.r.val; 1007b455d261SGowrishankar Muthukrishnan asym->ecdsa.r.length = vec.ecdsa.r.len; 1008b455d261SGowrishankar Muthukrishnan asym->ecdsa.s.data = vec.ecdsa.s.val; 1009b455d261SGowrishankar Muthukrishnan asym->ecdsa.s.length = vec.ecdsa.s.len; 1010b455d261SGowrishankar Muthukrishnan } else { 1011b455d261SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op); 1012b455d261SGowrishankar Muthukrishnan return -EINVAL; 1013b455d261SGowrishankar Muthukrishnan } 1014b455d261SGowrishankar Muthukrishnan 1015b455d261SGowrishankar Muthukrishnan rte_crypto_op_attach_asym_session(env.op, env.asym.sess); 1016b455d261SGowrishankar Muthukrishnan 1017b455d261SGowrishankar Muthukrishnan return 0; 1018b455d261SGowrishankar Muthukrishnan } 1019b455d261SGowrishankar Muthukrishnan 1020b455d261SGowrishankar Muthukrishnan static int 102112ede9acSGowrishankar Muthukrishnan prepare_eddsa_op(void) 102212ede9acSGowrishankar Muthukrishnan { 102312ede9acSGowrishankar Muthukrishnan struct rte_crypto_asym_op *asym; 102412ede9acSGowrishankar Muthukrishnan struct fips_val msg; 102512ede9acSGowrishankar Muthukrishnan 102612ede9acSGowrishankar Muthukrishnan __rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC); 102712ede9acSGowrishankar Muthukrishnan 102812ede9acSGowrishankar Muthukrishnan asym = env.op->asym; 102912ede9acSGowrishankar Muthukrishnan if (env.digest) { 103012ede9acSGowrishankar Muthukrishnan msg.val = env.digest; 103112ede9acSGowrishankar Muthukrishnan msg.len = env.digest_len; 103212ede9acSGowrishankar Muthukrishnan } else { 103312ede9acSGowrishankar Muthukrishnan msg.val = vec.pt.val; 103412ede9acSGowrishankar Muthukrishnan msg.len = vec.pt.len; 103512ede9acSGowrishankar Muthukrishnan } 103612ede9acSGowrishankar Muthukrishnan 103712ede9acSGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_SIGGEN) { 103812ede9acSGowrishankar Muthukrishnan asym->eddsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN; 103912ede9acSGowrishankar Muthukrishnan asym->eddsa.message.data = msg.val; 104012ede9acSGowrishankar Muthukrishnan asym->eddsa.message.length = msg.len; 104112ede9acSGowrishankar Muthukrishnan asym->eddsa.context.data = vec.eddsa.ctx.val; 104212ede9acSGowrishankar Muthukrishnan asym->eddsa.context.length = vec.eddsa.ctx.len; 104312ede9acSGowrishankar Muthukrishnan 104412ede9acSGowrishankar Muthukrishnan rte_free(vec.eddsa.sign.val); 104512ede9acSGowrishankar Muthukrishnan 104612ede9acSGowrishankar Muthukrishnan vec.eddsa.sign.len = info.interim_info.eddsa_data.curve_len; 104712ede9acSGowrishankar Muthukrishnan vec.eddsa.sign.val = rte_zmalloc(NULL, vec.eddsa.sign.len, 0); 104812ede9acSGowrishankar Muthukrishnan 104912ede9acSGowrishankar Muthukrishnan asym->eddsa.sign.data = vec.eddsa.sign.val; 105012ede9acSGowrishankar Muthukrishnan asym->eddsa.sign.length = 0; 105112ede9acSGowrishankar Muthukrishnan } else if (info.op == FIPS_TEST_ASYM_SIGVER) { 105212ede9acSGowrishankar Muthukrishnan asym->eddsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY; 105312ede9acSGowrishankar Muthukrishnan asym->eddsa.message.data = msg.val; 105412ede9acSGowrishankar Muthukrishnan asym->eddsa.message.length = msg.len; 105512ede9acSGowrishankar Muthukrishnan asym->eddsa.sign.data = vec.eddsa.sign.val; 105612ede9acSGowrishankar Muthukrishnan asym->eddsa.sign.length = vec.eddsa.sign.len; 105712ede9acSGowrishankar Muthukrishnan } else { 105812ede9acSGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op); 105912ede9acSGowrishankar Muthukrishnan return -EINVAL; 106012ede9acSGowrishankar Muthukrishnan } 106112ede9acSGowrishankar Muthukrishnan 106212ede9acSGowrishankar Muthukrishnan if (info.interim_info.eddsa_data.curve_id == RTE_CRYPTO_EC_GROUP_ED25519) { 106312ede9acSGowrishankar Muthukrishnan asym->eddsa.instance = RTE_CRYPTO_EDCURVE_25519; 106412ede9acSGowrishankar Muthukrishnan if (info.interim_info.eddsa_data.prehash) 106512ede9acSGowrishankar Muthukrishnan asym->eddsa.instance = RTE_CRYPTO_EDCURVE_25519PH; 106612ede9acSGowrishankar Muthukrishnan if (vec.eddsa.ctx.len > 0) 106712ede9acSGowrishankar Muthukrishnan asym->eddsa.instance = RTE_CRYPTO_EDCURVE_25519CTX; 106812ede9acSGowrishankar Muthukrishnan } else { 106912ede9acSGowrishankar Muthukrishnan asym->eddsa.instance = RTE_CRYPTO_EDCURVE_448; 107012ede9acSGowrishankar Muthukrishnan if (info.interim_info.eddsa_data.prehash) 107112ede9acSGowrishankar Muthukrishnan asym->eddsa.instance = RTE_CRYPTO_EDCURVE_448PH; 107212ede9acSGowrishankar Muthukrishnan } 107312ede9acSGowrishankar Muthukrishnan rte_crypto_op_attach_asym_session(env.op, env.asym.sess); 107412ede9acSGowrishankar Muthukrishnan 107512ede9acSGowrishankar Muthukrishnan return 0; 107612ede9acSGowrishankar Muthukrishnan } 107712ede9acSGowrishankar Muthukrishnan 107812ede9acSGowrishankar Muthukrishnan static int 1079b455d261SGowrishankar Muthukrishnan prepare_ecfpm_op(void) 1080b455d261SGowrishankar Muthukrishnan { 1081b455d261SGowrishankar Muthukrishnan struct rte_crypto_asym_op *asym; 1082b455d261SGowrishankar Muthukrishnan 1083b455d261SGowrishankar Muthukrishnan __rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC); 1084b455d261SGowrishankar Muthukrishnan 1085b455d261SGowrishankar Muthukrishnan asym = env.op->asym; 1086b455d261SGowrishankar Muthukrishnan asym->ecpm.scalar.data = vec.ecdsa.pkey.val; 1087b455d261SGowrishankar Muthukrishnan asym->ecpm.scalar.length = vec.ecdsa.pkey.len; 1088b455d261SGowrishankar Muthukrishnan 1089b455d261SGowrishankar Muthukrishnan rte_free(vec.ecdsa.qx.val); 1090b455d261SGowrishankar Muthukrishnan 1091b455d261SGowrishankar Muthukrishnan rte_free(vec.ecdsa.qy.val); 1092b455d261SGowrishankar Muthukrishnan 1093b455d261SGowrishankar Muthukrishnan vec.ecdsa.qx.len = info.interim_info.ecdsa_data.curve_len; 1094b455d261SGowrishankar Muthukrishnan vec.ecdsa.qx.val = rte_zmalloc(NULL, vec.ecdsa.qx.len, 0); 1095b455d261SGowrishankar Muthukrishnan 1096b455d261SGowrishankar Muthukrishnan vec.ecdsa.qy.len = vec.ecdsa.qx.len; 1097b455d261SGowrishankar Muthukrishnan vec.ecdsa.qy.val = rte_zmalloc(NULL, vec.ecdsa.qy.len, 0); 1098b455d261SGowrishankar Muthukrishnan 1099b455d261SGowrishankar Muthukrishnan asym->ecpm.r.x.data = vec.ecdsa.qx.val; 1100b455d261SGowrishankar Muthukrishnan asym->ecpm.r.x.length = 0; 1101b455d261SGowrishankar Muthukrishnan asym->ecpm.r.y.data = vec.ecdsa.qy.val; 1102b455d261SGowrishankar Muthukrishnan asym->ecpm.r.y.length = 0; 1103b455d261SGowrishankar Muthukrishnan 1104b455d261SGowrishankar Muthukrishnan rte_crypto_op_attach_asym_session(env.op, env.asym.sess); 1105b455d261SGowrishankar Muthukrishnan 1106b455d261SGowrishankar Muthukrishnan return 0; 1107b455d261SGowrishankar Muthukrishnan } 1108b455d261SGowrishankar Muthukrishnan 1109b455d261SGowrishankar Muthukrishnan static int 111012ede9acSGowrishankar Muthukrishnan prepare_edfpm_op(void) 111112ede9acSGowrishankar Muthukrishnan { 111212ede9acSGowrishankar Muthukrishnan struct rte_crypto_asym_op *asym; 111312ede9acSGowrishankar Muthukrishnan 111412ede9acSGowrishankar Muthukrishnan __rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC); 111512ede9acSGowrishankar Muthukrishnan 111612ede9acSGowrishankar Muthukrishnan asym = env.op->asym; 111712ede9acSGowrishankar Muthukrishnan asym->ecpm.scalar.data = vec.eddsa.pkey.val; 111812ede9acSGowrishankar Muthukrishnan asym->ecpm.scalar.length = vec.eddsa.pkey.len; 111912ede9acSGowrishankar Muthukrishnan 112012ede9acSGowrishankar Muthukrishnan rte_free(vec.eddsa.q.val); 112112ede9acSGowrishankar Muthukrishnan 112212ede9acSGowrishankar Muthukrishnan vec.eddsa.q.len = info.interim_info.eddsa_data.curve_len; 112312ede9acSGowrishankar Muthukrishnan vec.eddsa.q.val = rte_zmalloc(NULL, vec.eddsa.q.len, 0); 112412ede9acSGowrishankar Muthukrishnan 112512ede9acSGowrishankar Muthukrishnan asym->ecpm.r.x.data = vec.eddsa.q.val; 112612ede9acSGowrishankar Muthukrishnan asym->ecpm.r.x.length = 0; 112712ede9acSGowrishankar Muthukrishnan asym->flags |= RTE_CRYPTO_ASYM_FLAG_PUB_KEY_COMPRESSED; 112812ede9acSGowrishankar Muthukrishnan 112912ede9acSGowrishankar Muthukrishnan rte_crypto_op_attach_asym_session(env.op, env.asym.sess); 113012ede9acSGowrishankar Muthukrishnan 113112ede9acSGowrishankar Muthukrishnan return 0; 113212ede9acSGowrishankar Muthukrishnan } 113312ede9acSGowrishankar Muthukrishnan 113412ede9acSGowrishankar Muthukrishnan static int 1135cd255ccfSMarko Kovacevic prepare_aes_xform(struct rte_crypto_sym_xform *xform) 1136cd255ccfSMarko Kovacevic { 1137cd255ccfSMarko Kovacevic const struct rte_cryptodev_symmetric_capability *cap; 1138cd255ccfSMarko Kovacevic struct rte_cryptodev_sym_capability_idx cap_idx; 1139cd255ccfSMarko Kovacevic struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher; 1140cd255ccfSMarko Kovacevic 1141cd255ccfSMarko Kovacevic xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1142d3190431SMichael Shamis if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_CBC) 1143cd255ccfSMarko Kovacevic cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CBC; 1144c8956fd2SBrian Dooley else if (info.interim_info.aes_data.cipher_algo == 1145c8956fd2SBrian Dooley RTE_CRYPTO_CIPHER_AES_CTR) 1146c8956fd2SBrian Dooley cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CTR; 1147d3190431SMichael Shamis else 1148d3190431SMichael Shamis cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_ECB; 1149d3190431SMichael Shamis 1150cd255ccfSMarko Kovacevic cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ? 1151cd255ccfSMarko Kovacevic RTE_CRYPTO_CIPHER_OP_ENCRYPT : 1152cd255ccfSMarko Kovacevic RTE_CRYPTO_CIPHER_OP_DECRYPT; 1153cd255ccfSMarko Kovacevic cipher_xform->key.data = vec.cipher_auth.key.val; 1154cd255ccfSMarko Kovacevic cipher_xform->key.length = vec.cipher_auth.key.len; 1155c8956fd2SBrian Dooley if (cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CBC || 1156c8956fd2SBrian Dooley cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CTR) { 1157cd255ccfSMarko Kovacevic cipher_xform->iv.length = vec.iv.len; 1158cd255ccfSMarko Kovacevic cipher_xform->iv.offset = IV_OFF; 1159d3190431SMichael Shamis } else { 1160d3190431SMichael Shamis cipher_xform->iv.length = 0; 1161d3190431SMichael Shamis cipher_xform->iv.offset = 0; 1162d3190431SMichael Shamis } 1163d3190431SMichael Shamis cap_idx.algo.cipher = cipher_xform->algo; 1164cd255ccfSMarko Kovacevic cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1165cd255ccfSMarko Kovacevic 1166cd255ccfSMarko Kovacevic cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx); 1167cd255ccfSMarko Kovacevic if (!cap) { 1168cd255ccfSMarko Kovacevic RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1169cd255ccfSMarko Kovacevic env.dev_id); 1170cd255ccfSMarko Kovacevic return -EINVAL; 1171cd255ccfSMarko Kovacevic } 1172cd255ccfSMarko Kovacevic 1173cd255ccfSMarko Kovacevic if (rte_cryptodev_sym_capability_check_cipher(cap, 1174cd255ccfSMarko Kovacevic cipher_xform->key.length, 1175cd255ccfSMarko Kovacevic cipher_xform->iv.length) != 0) { 1176cd255ccfSMarko Kovacevic RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n", 1177cd255ccfSMarko Kovacevic info.device_name, cipher_xform->key.length, 1178cd255ccfSMarko Kovacevic cipher_xform->iv.length); 1179cd255ccfSMarko Kovacevic return -EPERM; 1180cd255ccfSMarko Kovacevic } 1181cd255ccfSMarko Kovacevic 1182cd255ccfSMarko Kovacevic return 0; 1183cd255ccfSMarko Kovacevic } 1184cd255ccfSMarko Kovacevic 1185f64adb67SMarko Kovacevic static int 1186527cbf3dSMarko Kovacevic prepare_tdes_xform(struct rte_crypto_sym_xform *xform) 1187527cbf3dSMarko Kovacevic { 1188527cbf3dSMarko Kovacevic const struct rte_cryptodev_symmetric_capability *cap; 1189527cbf3dSMarko Kovacevic struct rte_cryptodev_sym_capability_idx cap_idx; 1190527cbf3dSMarko Kovacevic struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher; 1191527cbf3dSMarko Kovacevic 1192527cbf3dSMarko Kovacevic xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1193527cbf3dSMarko Kovacevic 1194efe3a8dbSMichael Shamis if (info.interim_info.tdes_data.test_mode == TDES_MODE_CBC) 1195527cbf3dSMarko Kovacevic cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_CBC; 1196efe3a8dbSMichael Shamis else 1197efe3a8dbSMichael Shamis cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_ECB; 1198527cbf3dSMarko Kovacevic cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ? 1199527cbf3dSMarko Kovacevic RTE_CRYPTO_CIPHER_OP_ENCRYPT : 1200527cbf3dSMarko Kovacevic RTE_CRYPTO_CIPHER_OP_DECRYPT; 1201527cbf3dSMarko Kovacevic cipher_xform->key.data = vec.cipher_auth.key.val; 1202527cbf3dSMarko Kovacevic cipher_xform->key.length = vec.cipher_auth.key.len; 1203efe3a8dbSMichael Shamis 1204efe3a8dbSMichael Shamis if (cipher_xform->algo == RTE_CRYPTO_CIPHER_3DES_CBC) { 1205527cbf3dSMarko Kovacevic cipher_xform->iv.length = vec.iv.len; 1206527cbf3dSMarko Kovacevic cipher_xform->iv.offset = IV_OFF; 1207efe3a8dbSMichael Shamis } else { 1208efe3a8dbSMichael Shamis cipher_xform->iv.length = 0; 1209efe3a8dbSMichael Shamis cipher_xform->iv.offset = 0; 1210efe3a8dbSMichael Shamis } 1211efe3a8dbSMichael Shamis cap_idx.algo.cipher = cipher_xform->algo; 1212527cbf3dSMarko Kovacevic cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1213527cbf3dSMarko Kovacevic 1214527cbf3dSMarko Kovacevic cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx); 1215527cbf3dSMarko Kovacevic if (!cap) { 1216527cbf3dSMarko Kovacevic RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1217527cbf3dSMarko Kovacevic env.dev_id); 1218527cbf3dSMarko Kovacevic return -EINVAL; 1219527cbf3dSMarko Kovacevic } 1220527cbf3dSMarko Kovacevic 1221527cbf3dSMarko Kovacevic if (rte_cryptodev_sym_capability_check_cipher(cap, 1222527cbf3dSMarko Kovacevic cipher_xform->key.length, 1223527cbf3dSMarko Kovacevic cipher_xform->iv.length) != 0) { 1224527cbf3dSMarko Kovacevic RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n", 1225527cbf3dSMarko Kovacevic info.device_name, cipher_xform->key.length, 1226527cbf3dSMarko Kovacevic cipher_xform->iv.length); 1227527cbf3dSMarko Kovacevic return -EPERM; 1228527cbf3dSMarko Kovacevic } 1229527cbf3dSMarko Kovacevic 1230527cbf3dSMarko Kovacevic return 0; 1231527cbf3dSMarko Kovacevic } 1232527cbf3dSMarko Kovacevic 1233527cbf3dSMarko Kovacevic static int 1234f64adb67SMarko Kovacevic prepare_hmac_xform(struct rte_crypto_sym_xform *xform) 1235f64adb67SMarko Kovacevic { 1236f64adb67SMarko Kovacevic const struct rte_cryptodev_symmetric_capability *cap; 1237f64adb67SMarko Kovacevic struct rte_cryptodev_sym_capability_idx cap_idx; 1238f64adb67SMarko Kovacevic struct rte_crypto_auth_xform *auth_xform = &xform->auth; 1239f64adb67SMarko Kovacevic 1240f64adb67SMarko Kovacevic xform->type = RTE_CRYPTO_SYM_XFORM_AUTH; 1241f64adb67SMarko Kovacevic 1242f64adb67SMarko Kovacevic auth_xform->algo = info.interim_info.hmac_data.algo; 1243f64adb67SMarko Kovacevic auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE; 1244f64adb67SMarko Kovacevic auth_xform->digest_length = vec.cipher_auth.digest.len; 1245f64adb67SMarko Kovacevic auth_xform->key.data = vec.cipher_auth.key.val; 1246f64adb67SMarko Kovacevic auth_xform->key.length = vec.cipher_auth.key.len; 1247f64adb67SMarko Kovacevic 1248f64adb67SMarko Kovacevic cap_idx.algo.auth = auth_xform->algo; 1249f64adb67SMarko Kovacevic cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1250f64adb67SMarko Kovacevic 1251f64adb67SMarko Kovacevic cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx); 1252f64adb67SMarko Kovacevic if (!cap) { 1253f64adb67SMarko Kovacevic RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1254f64adb67SMarko Kovacevic env.dev_id); 1255f64adb67SMarko Kovacevic return -EINVAL; 1256f64adb67SMarko Kovacevic } 1257f64adb67SMarko Kovacevic 1258f64adb67SMarko Kovacevic if (rte_cryptodev_sym_capability_check_auth(cap, 1259f64adb67SMarko Kovacevic auth_xform->key.length, 1260f64adb67SMarko Kovacevic auth_xform->digest_length, 0) != 0) { 12618782b3b6SPablo de Lara RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n", 1262f64adb67SMarko Kovacevic info.device_name, auth_xform->key.length, 1263f64adb67SMarko Kovacevic auth_xform->digest_length); 1264f64adb67SMarko Kovacevic return -EPERM; 1265f64adb67SMarko Kovacevic } 1266f64adb67SMarko Kovacevic 1267f64adb67SMarko Kovacevic return 0; 1268f64adb67SMarko Kovacevic } 1269f64adb67SMarko Kovacevic 1270d09abf2dSFan Zhang int 12714aaad299SMarko Kovacevic prepare_gcm_xform(struct rte_crypto_sym_xform *xform) 12724aaad299SMarko Kovacevic { 12734aaad299SMarko Kovacevic const struct rte_cryptodev_symmetric_capability *cap; 12744aaad299SMarko Kovacevic struct rte_cryptodev_sym_capability_idx cap_idx; 12754aaad299SMarko Kovacevic struct rte_crypto_aead_xform *aead_xform = &xform->aead; 12764aaad299SMarko Kovacevic 12774aaad299SMarko Kovacevic xform->type = RTE_CRYPTO_SYM_XFORM_AEAD; 12784aaad299SMarko Kovacevic 12794aaad299SMarko Kovacevic aead_xform->algo = RTE_CRYPTO_AEAD_AES_GCM; 12804aaad299SMarko Kovacevic aead_xform->aad_length = vec.aead.aad.len; 12814aaad299SMarko Kovacevic aead_xform->digest_length = vec.aead.digest.len; 12824aaad299SMarko Kovacevic aead_xform->iv.offset = IV_OFF; 12834aaad299SMarko Kovacevic aead_xform->iv.length = vec.iv.len; 12844aaad299SMarko Kovacevic aead_xform->key.data = vec.aead.key.val; 12854aaad299SMarko Kovacevic aead_xform->key.length = vec.aead.key.len; 12864aaad299SMarko Kovacevic aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ? 12874aaad299SMarko Kovacevic RTE_CRYPTO_AEAD_OP_ENCRYPT : 12884aaad299SMarko Kovacevic RTE_CRYPTO_AEAD_OP_DECRYPT; 12894aaad299SMarko Kovacevic 12904aaad299SMarko Kovacevic cap_idx.algo.aead = aead_xform->algo; 12914aaad299SMarko Kovacevic cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 12924aaad299SMarko Kovacevic 12934aaad299SMarko Kovacevic cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx); 12944aaad299SMarko Kovacevic if (!cap) { 12954aaad299SMarko Kovacevic RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 12964aaad299SMarko Kovacevic env.dev_id); 12974aaad299SMarko Kovacevic return -EINVAL; 12984aaad299SMarko Kovacevic } 12994aaad299SMarko Kovacevic 13004aaad299SMarko Kovacevic if (rte_cryptodev_sym_capability_check_aead(cap, 13014aaad299SMarko Kovacevic aead_xform->key.length, 13024aaad299SMarko Kovacevic aead_xform->digest_length, aead_xform->aad_length, 13034aaad299SMarko Kovacevic aead_xform->iv.length) != 0) { 13044aaad299SMarko Kovacevic RTE_LOG(ERR, USER1, 13054aaad299SMarko Kovacevic "PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n", 13064aaad299SMarko Kovacevic info.device_name, aead_xform->key.length, 13074aaad299SMarko Kovacevic aead_xform->digest_length, 13084aaad299SMarko Kovacevic aead_xform->aad_length, 13094aaad299SMarko Kovacevic aead_xform->iv.length); 13104aaad299SMarko Kovacevic return -EPERM; 13114aaad299SMarko Kovacevic } 13124aaad299SMarko Kovacevic 13134aaad299SMarko Kovacevic return 0; 13144aaad299SMarko Kovacevic } 13154aaad299SMarko Kovacevic 1316d09abf2dSFan Zhang int 1317d09abf2dSFan Zhang prepare_gmac_xform(struct rte_crypto_sym_xform *xform) 1318d09abf2dSFan Zhang { 1319d09abf2dSFan Zhang const struct rte_cryptodev_symmetric_capability *cap; 1320d09abf2dSFan Zhang struct rte_cryptodev_sym_capability_idx cap_idx; 1321d09abf2dSFan Zhang struct rte_crypto_auth_xform *auth_xform = &xform->auth; 1322d09abf2dSFan Zhang 1323d09abf2dSFan Zhang xform->type = RTE_CRYPTO_SYM_XFORM_AUTH; 1324d09abf2dSFan Zhang 1325d09abf2dSFan Zhang auth_xform->algo = RTE_CRYPTO_AUTH_AES_GMAC; 1326d09abf2dSFan Zhang auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ? 1327d09abf2dSFan Zhang RTE_CRYPTO_AUTH_OP_GENERATE : 1328d09abf2dSFan Zhang RTE_CRYPTO_AUTH_OP_VERIFY; 1329d09abf2dSFan Zhang auth_xform->iv.offset = IV_OFF; 1330d09abf2dSFan Zhang auth_xform->iv.length = vec.iv.len; 1331d09abf2dSFan Zhang auth_xform->digest_length = vec.aead.digest.len; 1332d09abf2dSFan Zhang auth_xform->key.data = vec.aead.key.val; 1333d09abf2dSFan Zhang auth_xform->key.length = vec.aead.key.len; 1334d09abf2dSFan Zhang 1335d09abf2dSFan Zhang cap_idx.algo.auth = auth_xform->algo; 1336d09abf2dSFan Zhang cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1337d09abf2dSFan Zhang 1338d09abf2dSFan Zhang cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx); 1339d09abf2dSFan Zhang if (!cap) { 1340d09abf2dSFan Zhang RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1341d09abf2dSFan Zhang env.dev_id); 1342d09abf2dSFan Zhang return -EINVAL; 1343d09abf2dSFan Zhang } 1344d09abf2dSFan Zhang 1345d09abf2dSFan Zhang if (rte_cryptodev_sym_capability_check_auth(cap, 1346d09abf2dSFan Zhang auth_xform->key.length, 1347601b8a54SFan Zhang auth_xform->digest_length, 1348601b8a54SFan Zhang auth_xform->iv.length) != 0) { 1349601b8a54SFan Zhang 1350601b8a54SFan Zhang RTE_LOG(ERR, USER1, 1351601b8a54SFan Zhang "PMD %s key length %u Digest length %u IV length %u\n", 1352d09abf2dSFan Zhang info.device_name, auth_xform->key.length, 1353601b8a54SFan Zhang auth_xform->digest_length, 1354601b8a54SFan Zhang auth_xform->iv.length); 1355d09abf2dSFan Zhang return -EPERM; 1356d09abf2dSFan Zhang } 1357d09abf2dSFan Zhang 1358d09abf2dSFan Zhang return 0; 1359d09abf2dSFan Zhang } 1360d09abf2dSFan Zhang 1361ac026f46SMarko Kovacevic static int 1362ac026f46SMarko Kovacevic prepare_cmac_xform(struct rte_crypto_sym_xform *xform) 1363ac026f46SMarko Kovacevic { 1364ac026f46SMarko Kovacevic const struct rte_cryptodev_symmetric_capability *cap; 1365ac026f46SMarko Kovacevic struct rte_cryptodev_sym_capability_idx cap_idx; 1366ac026f46SMarko Kovacevic struct rte_crypto_auth_xform *auth_xform = &xform->auth; 1367ac026f46SMarko Kovacevic 1368ac026f46SMarko Kovacevic xform->type = RTE_CRYPTO_SYM_XFORM_AUTH; 1369ac026f46SMarko Kovacevic 1370ac026f46SMarko Kovacevic auth_xform->algo = RTE_CRYPTO_AUTH_AES_CMAC; 1371ac026f46SMarko Kovacevic auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ? 1372ac026f46SMarko Kovacevic RTE_CRYPTO_AUTH_OP_GENERATE : RTE_CRYPTO_AUTH_OP_VERIFY; 1373ac026f46SMarko Kovacevic auth_xform->digest_length = vec.cipher_auth.digest.len; 1374ac026f46SMarko Kovacevic auth_xform->key.data = vec.cipher_auth.key.val; 1375ac026f46SMarko Kovacevic auth_xform->key.length = vec.cipher_auth.key.len; 1376ac026f46SMarko Kovacevic 1377ac026f46SMarko Kovacevic cap_idx.algo.auth = auth_xform->algo; 1378ac026f46SMarko Kovacevic cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1379ac026f46SMarko Kovacevic 1380ac026f46SMarko Kovacevic cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx); 1381ac026f46SMarko Kovacevic if (!cap) { 1382ac026f46SMarko Kovacevic RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1383ac026f46SMarko Kovacevic env.dev_id); 1384ac026f46SMarko Kovacevic return -EINVAL; 1385ac026f46SMarko Kovacevic } 1386ac026f46SMarko Kovacevic 1387ac026f46SMarko Kovacevic if (rte_cryptodev_sym_capability_check_auth(cap, 1388ac026f46SMarko Kovacevic auth_xform->key.length, 1389ac026f46SMarko Kovacevic auth_xform->digest_length, 0) != 0) { 13908782b3b6SPablo de Lara RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n", 1391ac026f46SMarko Kovacevic info.device_name, auth_xform->key.length, 1392ac026f46SMarko Kovacevic auth_xform->digest_length); 1393ac026f46SMarko Kovacevic return -EPERM; 1394ac026f46SMarko Kovacevic } 1395ac026f46SMarko Kovacevic 1396ac026f46SMarko Kovacevic return 0; 1397ac026f46SMarko Kovacevic } 1398ac026f46SMarko Kovacevic 1399305921f4SMarko Kovacevic static int 1400305921f4SMarko Kovacevic prepare_ccm_xform(struct rte_crypto_sym_xform *xform) 1401305921f4SMarko Kovacevic { 1402305921f4SMarko Kovacevic const struct rte_cryptodev_symmetric_capability *cap; 1403305921f4SMarko Kovacevic struct rte_cryptodev_sym_capability_idx cap_idx; 1404305921f4SMarko Kovacevic struct rte_crypto_aead_xform *aead_xform = &xform->aead; 1405305921f4SMarko Kovacevic 1406305921f4SMarko Kovacevic xform->type = RTE_CRYPTO_SYM_XFORM_AEAD; 1407305921f4SMarko Kovacevic 1408305921f4SMarko Kovacevic aead_xform->algo = RTE_CRYPTO_AEAD_AES_CCM; 1409305921f4SMarko Kovacevic aead_xform->aad_length = vec.aead.aad.len; 1410305921f4SMarko Kovacevic aead_xform->digest_length = vec.aead.digest.len; 1411305921f4SMarko Kovacevic aead_xform->iv.offset = IV_OFF; 1412305921f4SMarko Kovacevic aead_xform->iv.length = vec.iv.len; 1413305921f4SMarko Kovacevic aead_xform->key.data = vec.aead.key.val; 1414305921f4SMarko Kovacevic aead_xform->key.length = vec.aead.key.len; 1415305921f4SMarko Kovacevic aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ? 1416305921f4SMarko Kovacevic RTE_CRYPTO_AEAD_OP_ENCRYPT : 1417305921f4SMarko Kovacevic RTE_CRYPTO_AEAD_OP_DECRYPT; 1418305921f4SMarko Kovacevic 1419305921f4SMarko Kovacevic cap_idx.algo.aead = aead_xform->algo; 1420305921f4SMarko Kovacevic cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 1421305921f4SMarko Kovacevic 1422305921f4SMarko Kovacevic cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx); 1423305921f4SMarko Kovacevic if (!cap) { 1424305921f4SMarko Kovacevic RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1425305921f4SMarko Kovacevic env.dev_id); 1426305921f4SMarko Kovacevic return -EINVAL; 1427305921f4SMarko Kovacevic } 1428305921f4SMarko Kovacevic 1429305921f4SMarko Kovacevic if (rte_cryptodev_sym_capability_check_aead(cap, 1430305921f4SMarko Kovacevic aead_xform->key.length, 1431305921f4SMarko Kovacevic aead_xform->digest_length, aead_xform->aad_length, 1432305921f4SMarko Kovacevic aead_xform->iv.length) != 0) { 1433305921f4SMarko Kovacevic RTE_LOG(ERR, USER1, 1434305921f4SMarko Kovacevic "PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n", 1435305921f4SMarko Kovacevic info.device_name, aead_xform->key.length, 1436305921f4SMarko Kovacevic aead_xform->digest_length, 1437305921f4SMarko Kovacevic aead_xform->aad_length, 1438305921f4SMarko Kovacevic aead_xform->iv.length); 1439305921f4SMarko Kovacevic return -EPERM; 1440305921f4SMarko Kovacevic } 1441305921f4SMarko Kovacevic 1442305921f4SMarko Kovacevic return 0; 1443305921f4SMarko Kovacevic } 1444305921f4SMarko Kovacevic 1445f4797baeSDamian Nowak static int 1446f4797baeSDamian Nowak prepare_sha_xform(struct rte_crypto_sym_xform *xform) 1447f4797baeSDamian Nowak { 1448f4797baeSDamian Nowak const struct rte_cryptodev_symmetric_capability *cap; 1449f4797baeSDamian Nowak struct rte_cryptodev_sym_capability_idx cap_idx; 1450f4797baeSDamian Nowak struct rte_crypto_auth_xform *auth_xform = &xform->auth; 1451f4797baeSDamian Nowak 1452f4797baeSDamian Nowak xform->type = RTE_CRYPTO_SYM_XFORM_AUTH; 1453f4797baeSDamian Nowak 1454f4797baeSDamian Nowak auth_xform->algo = info.interim_info.sha_data.algo; 1455f4797baeSDamian Nowak auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE; 1456f4797baeSDamian Nowak auth_xform->digest_length = vec.cipher_auth.digest.len; 1457f4797baeSDamian Nowak 1458f4797baeSDamian Nowak cap_idx.algo.auth = auth_xform->algo; 1459f4797baeSDamian Nowak cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1460f4797baeSDamian Nowak 1461f4797baeSDamian Nowak cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx); 1462f4797baeSDamian Nowak if (!cap) { 1463f4797baeSDamian Nowak RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1464f4797baeSDamian Nowak env.dev_id); 1465f4797baeSDamian Nowak return -EINVAL; 1466f4797baeSDamian Nowak } 1467f4797baeSDamian Nowak 1468f4797baeSDamian Nowak if (rte_cryptodev_sym_capability_check_auth(cap, 1469f4797baeSDamian Nowak auth_xform->key.length, 1470f4797baeSDamian Nowak auth_xform->digest_length, 0) != 0) { 1471f4797baeSDamian Nowak RTE_LOG(ERR, USER1, "PMD %s key length %u digest length %u\n", 1472f4797baeSDamian Nowak info.device_name, auth_xform->key.length, 1473f4797baeSDamian Nowak auth_xform->digest_length); 1474f4797baeSDamian Nowak return -EPERM; 1475f4797baeSDamian Nowak } 1476f4797baeSDamian Nowak 1477f4797baeSDamian Nowak return 0; 1478f4797baeSDamian Nowak } 1479f4797baeSDamian Nowak 1480d5a9ea55SSucharitha Sarananaga static int 1481d5a9ea55SSucharitha Sarananaga prepare_xts_xform(struct rte_crypto_sym_xform *xform) 1482d5a9ea55SSucharitha Sarananaga { 1483d5a9ea55SSucharitha Sarananaga const struct rte_cryptodev_symmetric_capability *cap; 1484d5a9ea55SSucharitha Sarananaga struct rte_cryptodev_sym_capability_idx cap_idx; 1485d5a9ea55SSucharitha Sarananaga struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher; 1486d5a9ea55SSucharitha Sarananaga 1487d5a9ea55SSucharitha Sarananaga xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1488d5a9ea55SSucharitha Sarananaga 1489d5a9ea55SSucharitha Sarananaga cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_XTS; 1490d5a9ea55SSucharitha Sarananaga cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ? 1491d5a9ea55SSucharitha Sarananaga RTE_CRYPTO_CIPHER_OP_ENCRYPT : 1492d5a9ea55SSucharitha Sarananaga RTE_CRYPTO_CIPHER_OP_DECRYPT; 1493d5a9ea55SSucharitha Sarananaga cipher_xform->key.data = vec.cipher_auth.key.val; 1494d5a9ea55SSucharitha Sarananaga cipher_xform->key.length = vec.cipher_auth.key.len; 1495d5a9ea55SSucharitha Sarananaga cipher_xform->iv.length = vec.iv.len; 1496d5a9ea55SSucharitha Sarananaga cipher_xform->iv.offset = IV_OFF; 1497d5a9ea55SSucharitha Sarananaga 1498d5a9ea55SSucharitha Sarananaga cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_XTS; 1499d5a9ea55SSucharitha Sarananaga cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1500d5a9ea55SSucharitha Sarananaga 1501d5a9ea55SSucharitha Sarananaga cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx); 1502d5a9ea55SSucharitha Sarananaga if (!cap) { 1503d5a9ea55SSucharitha Sarananaga RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1504d5a9ea55SSucharitha Sarananaga env.dev_id); 1505d5a9ea55SSucharitha Sarananaga return -EINVAL; 1506d5a9ea55SSucharitha Sarananaga } 1507d5a9ea55SSucharitha Sarananaga 1508d5a9ea55SSucharitha Sarananaga if (rte_cryptodev_sym_capability_check_cipher(cap, 1509d5a9ea55SSucharitha Sarananaga cipher_xform->key.length, 1510d5a9ea55SSucharitha Sarananaga cipher_xform->iv.length) != 0) { 1511d5a9ea55SSucharitha Sarananaga RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n", 1512d5a9ea55SSucharitha Sarananaga info.device_name, cipher_xform->key.length, 1513d5a9ea55SSucharitha Sarananaga cipher_xform->iv.length); 1514d5a9ea55SSucharitha Sarananaga return -EPERM; 1515d5a9ea55SSucharitha Sarananaga } 1516d5a9ea55SSucharitha Sarananaga 1517d5a9ea55SSucharitha Sarananaga return 0; 1518d5a9ea55SSucharitha Sarananaga } 1519d5a9ea55SSucharitha Sarananaga 1520952e10cdSFan Zhang static int 152136128a67SGowrishankar Muthukrishnan prepare_rsa_xform(struct rte_crypto_asym_xform *xform) 152236128a67SGowrishankar Muthukrishnan { 152336128a67SGowrishankar Muthukrishnan const struct rte_cryptodev_asymmetric_xform_capability *cap; 152436128a67SGowrishankar Muthukrishnan struct rte_cryptodev_asym_capability_idx cap_idx; 152536128a67SGowrishankar Muthukrishnan struct rte_cryptodev_info dev_info; 152636128a67SGowrishankar Muthukrishnan 152736128a67SGowrishankar Muthukrishnan xform->xform_type = RTE_CRYPTO_ASYM_XFORM_RSA; 152836128a67SGowrishankar Muthukrishnan xform->next = NULL; 152936128a67SGowrishankar Muthukrishnan 153036128a67SGowrishankar Muthukrishnan cap_idx.type = xform->xform_type; 153136128a67SGowrishankar Muthukrishnan cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx); 153236128a67SGowrishankar Muthukrishnan if (!cap) { 153336128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 153436128a67SGowrishankar Muthukrishnan env.dev_id); 153536128a67SGowrishankar Muthukrishnan return -EINVAL; 153636128a67SGowrishankar Muthukrishnan } 153736128a67SGowrishankar Muthukrishnan 153836128a67SGowrishankar Muthukrishnan switch (info.op) { 153936128a67SGowrishankar Muthukrishnan case FIPS_TEST_ASYM_SIGGEN: 154036128a67SGowrishankar Muthukrishnan if (!rte_cryptodev_asym_xform_capability_check_optype(cap, 154136128a67SGowrishankar Muthukrishnan RTE_CRYPTO_ASYM_OP_SIGN)) { 154236128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n", 154336128a67SGowrishankar Muthukrishnan info.device_name, RTE_CRYPTO_ASYM_OP_SIGN); 154436128a67SGowrishankar Muthukrishnan return -EPERM; 154536128a67SGowrishankar Muthukrishnan } 154636128a67SGowrishankar Muthukrishnan break; 154736128a67SGowrishankar Muthukrishnan case FIPS_TEST_ASYM_SIGVER: 154836128a67SGowrishankar Muthukrishnan if (!rte_cryptodev_asym_xform_capability_check_optype(cap, 154936128a67SGowrishankar Muthukrishnan RTE_CRYPTO_ASYM_OP_VERIFY)) { 155036128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n", 155136128a67SGowrishankar Muthukrishnan info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY); 155236128a67SGowrishankar Muthukrishnan return -EPERM; 155336128a67SGowrishankar Muthukrishnan } 155436128a67SGowrishankar Muthukrishnan break; 155536128a67SGowrishankar Muthukrishnan case FIPS_TEST_ASYM_KEYGEN: 155636128a67SGowrishankar Muthukrishnan break; 155736128a67SGowrishankar Muthukrishnan default: 155836128a67SGowrishankar Muthukrishnan break; 155936128a67SGowrishankar Muthukrishnan } 156036128a67SGowrishankar Muthukrishnan 156136128a67SGowrishankar Muthukrishnan rte_cryptodev_info_get(env.dev_id, &dev_info); 156236128a67SGowrishankar Muthukrishnan xform->rsa.key_type = info.interim_info.rsa_data.privkey; 156336128a67SGowrishankar Muthukrishnan switch (xform->rsa.key_type) { 156436128a67SGowrishankar Muthukrishnan case RTE_RSA_KEY_TYPE_QT: 156536128a67SGowrishankar Muthukrishnan if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT)) { 156636128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "PMD %s does not support QT key type\n", 156736128a67SGowrishankar Muthukrishnan info.device_name); 156836128a67SGowrishankar Muthukrishnan return -EPERM; 156936128a67SGowrishankar Muthukrishnan } 157036128a67SGowrishankar Muthukrishnan xform->rsa.qt.p.data = vec.rsa.p.val; 157136128a67SGowrishankar Muthukrishnan xform->rsa.qt.p.length = vec.rsa.p.len; 157236128a67SGowrishankar Muthukrishnan xform->rsa.qt.q.data = vec.rsa.q.val; 157336128a67SGowrishankar Muthukrishnan xform->rsa.qt.q.length = vec.rsa.q.len; 157436128a67SGowrishankar Muthukrishnan xform->rsa.qt.dP.data = vec.rsa.dp.val; 157536128a67SGowrishankar Muthukrishnan xform->rsa.qt.dP.length = vec.rsa.dp.len; 157636128a67SGowrishankar Muthukrishnan xform->rsa.qt.dQ.data = vec.rsa.dq.val; 157736128a67SGowrishankar Muthukrishnan xform->rsa.qt.dQ.length = vec.rsa.dq.len; 157836128a67SGowrishankar Muthukrishnan xform->rsa.qt.qInv.data = vec.rsa.qinv.val; 157936128a67SGowrishankar Muthukrishnan xform->rsa.qt.qInv.length = vec.rsa.qinv.len; 158036128a67SGowrishankar Muthukrishnan break; 158136128a67SGowrishankar Muthukrishnan case RTE_RSA_KEY_TYPE_EXP: 158236128a67SGowrishankar Muthukrishnan if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP)) { 158336128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "PMD %s does not support EXP key type\n", 158436128a67SGowrishankar Muthukrishnan info.device_name); 158536128a67SGowrishankar Muthukrishnan return -EPERM; 158636128a67SGowrishankar Muthukrishnan } 158736128a67SGowrishankar Muthukrishnan xform->rsa.d.data = vec.rsa.d.val; 158836128a67SGowrishankar Muthukrishnan xform->rsa.d.length = vec.rsa.d.len; 158936128a67SGowrishankar Muthukrishnan break; 159036128a67SGowrishankar Muthukrishnan default: 159136128a67SGowrishankar Muthukrishnan break; 159236128a67SGowrishankar Muthukrishnan } 159336128a67SGowrishankar Muthukrishnan 159436128a67SGowrishankar Muthukrishnan xform->rsa.e.data = vec.rsa.e.val; 159536128a67SGowrishankar Muthukrishnan xform->rsa.e.length = vec.rsa.e.len; 159636128a67SGowrishankar Muthukrishnan xform->rsa.n.data = vec.rsa.n.val; 159736128a67SGowrishankar Muthukrishnan xform->rsa.n.length = vec.rsa.n.len; 15988a97564bSGowrishankar Muthukrishnan 15998a97564bSGowrishankar Muthukrishnan xform->rsa.padding.type = info.interim_info.rsa_data.padding; 16008a97564bSGowrishankar Muthukrishnan xform->rsa.padding.hash = info.interim_info.rsa_data.auth; 16018a97564bSGowrishankar Muthukrishnan if (env.digest) { 16028a97564bSGowrishankar Muthukrishnan if (xform->rsa.padding.type == RTE_CRYPTO_RSA_PADDING_PKCS1_5) { 16038a97564bSGowrishankar Muthukrishnan struct fips_val msg; 16048a97564bSGowrishankar Muthukrishnan int b_len = 0; 16058a97564bSGowrishankar Muthukrishnan uint8_t b[32]; 16068a97564bSGowrishankar Muthukrishnan 16078a97564bSGowrishankar Muthukrishnan b_len = get_hash_oid(xform->rsa.padding.hash, b); 16088a97564bSGowrishankar Muthukrishnan if (b_len < 0) { 16098a97564bSGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Failed to get digest info for hash %d\n", 16108a97564bSGowrishankar Muthukrishnan xform->rsa.padding.hash); 16118a97564bSGowrishankar Muthukrishnan return -EINVAL; 16128a97564bSGowrishankar Muthukrishnan } 16138a97564bSGowrishankar Muthukrishnan 16148a97564bSGowrishankar Muthukrishnan if (b_len) { 16158a97564bSGowrishankar Muthukrishnan msg.len = env.digest_len + b_len; 16168a97564bSGowrishankar Muthukrishnan msg.val = rte_zmalloc(NULL, msg.len, 0); 16178a97564bSGowrishankar Muthukrishnan rte_memcpy(msg.val, b, b_len); 16188a97564bSGowrishankar Muthukrishnan rte_memcpy(msg.val + b_len, env.digest, env.digest_len); 16198a97564bSGowrishankar Muthukrishnan rte_free(env.digest); 16208a97564bSGowrishankar Muthukrishnan env.digest = msg.val; 16218a97564bSGowrishankar Muthukrishnan env.digest_len = msg.len; 16228a97564bSGowrishankar Muthukrishnan } 16238a97564bSGowrishankar Muthukrishnan } 16248a97564bSGowrishankar Muthukrishnan } 16258a97564bSGowrishankar Muthukrishnan 162636128a67SGowrishankar Muthukrishnan return 0; 162736128a67SGowrishankar Muthukrishnan } 162836128a67SGowrishankar Muthukrishnan 162936128a67SGowrishankar Muthukrishnan static int 1630b455d261SGowrishankar Muthukrishnan prepare_ecdsa_xform(struct rte_crypto_asym_xform *xform) 1631b455d261SGowrishankar Muthukrishnan { 1632b455d261SGowrishankar Muthukrishnan const struct rte_cryptodev_asymmetric_xform_capability *cap; 1633b455d261SGowrishankar Muthukrishnan struct rte_cryptodev_asym_capability_idx cap_idx; 1634b455d261SGowrishankar Muthukrishnan 1635b455d261SGowrishankar Muthukrishnan xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA; 1636b455d261SGowrishankar Muthukrishnan xform->next = NULL; 1637b455d261SGowrishankar Muthukrishnan 1638b455d261SGowrishankar Muthukrishnan cap_idx.type = xform->xform_type; 1639b455d261SGowrishankar Muthukrishnan cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx); 1640b455d261SGowrishankar Muthukrishnan if (!cap) { 1641b455d261SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1642b455d261SGowrishankar Muthukrishnan env.dev_id); 1643b455d261SGowrishankar Muthukrishnan return -EINVAL; 1644b455d261SGowrishankar Muthukrishnan } 1645b455d261SGowrishankar Muthukrishnan 1646b455d261SGowrishankar Muthukrishnan switch (info.op) { 1647b455d261SGowrishankar Muthukrishnan case FIPS_TEST_ASYM_SIGGEN: 1648b455d261SGowrishankar Muthukrishnan if (!rte_cryptodev_asym_xform_capability_check_optype(cap, 1649b455d261SGowrishankar Muthukrishnan RTE_CRYPTO_ASYM_OP_SIGN)) { 1650b455d261SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n", 1651b455d261SGowrishankar Muthukrishnan info.device_name, RTE_CRYPTO_ASYM_OP_SIGN); 1652b455d261SGowrishankar Muthukrishnan return -EPERM; 1653b455d261SGowrishankar Muthukrishnan } 1654badc0c6fSGowrishankar Muthukrishnan 1655badc0c6fSGowrishankar Muthukrishnan xform->ec.pkey.data = vec.ecdsa.pkey.val; 1656badc0c6fSGowrishankar Muthukrishnan xform->ec.pkey.length = vec.ecdsa.pkey.len; 1657b455d261SGowrishankar Muthukrishnan break; 1658b455d261SGowrishankar Muthukrishnan case FIPS_TEST_ASYM_SIGVER: 1659b455d261SGowrishankar Muthukrishnan if (!rte_cryptodev_asym_xform_capability_check_optype(cap, 1660b455d261SGowrishankar Muthukrishnan RTE_CRYPTO_ASYM_OP_VERIFY)) { 1661b455d261SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n", 1662b455d261SGowrishankar Muthukrishnan info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY); 1663b455d261SGowrishankar Muthukrishnan return -EPERM; 1664b455d261SGowrishankar Muthukrishnan } 1665badc0c6fSGowrishankar Muthukrishnan 1666badc0c6fSGowrishankar Muthukrishnan xform->ec.q.x.data = vec.ecdsa.qx.val; 1667badc0c6fSGowrishankar Muthukrishnan xform->ec.q.x.length = vec.ecdsa.qx.len; 1668badc0c6fSGowrishankar Muthukrishnan xform->ec.q.y.data = vec.ecdsa.qy.val; 1669badc0c6fSGowrishankar Muthukrishnan xform->ec.q.y.length = vec.ecdsa.qy.len; 1670b455d261SGowrishankar Muthukrishnan break; 1671b455d261SGowrishankar Muthukrishnan default: 1672b455d261SGowrishankar Muthukrishnan break; 1673b455d261SGowrishankar Muthukrishnan } 1674b455d261SGowrishankar Muthukrishnan 1675b455d261SGowrishankar Muthukrishnan xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id; 1676b455d261SGowrishankar Muthukrishnan return 0; 1677b455d261SGowrishankar Muthukrishnan } 1678b455d261SGowrishankar Muthukrishnan 1679b455d261SGowrishankar Muthukrishnan static int 168012ede9acSGowrishankar Muthukrishnan prepare_eddsa_xform(struct rte_crypto_asym_xform *xform) 168112ede9acSGowrishankar Muthukrishnan { 168212ede9acSGowrishankar Muthukrishnan const struct rte_cryptodev_asymmetric_xform_capability *cap; 168312ede9acSGowrishankar Muthukrishnan struct rte_cryptodev_asym_capability_idx cap_idx; 168412ede9acSGowrishankar Muthukrishnan 168512ede9acSGowrishankar Muthukrishnan xform->xform_type = RTE_CRYPTO_ASYM_XFORM_EDDSA; 168612ede9acSGowrishankar Muthukrishnan xform->next = NULL; 168712ede9acSGowrishankar Muthukrishnan 168812ede9acSGowrishankar Muthukrishnan cap_idx.type = xform->xform_type; 168912ede9acSGowrishankar Muthukrishnan cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx); 169012ede9acSGowrishankar Muthukrishnan if (!cap) { 169112ede9acSGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 169212ede9acSGowrishankar Muthukrishnan env.dev_id); 169312ede9acSGowrishankar Muthukrishnan return -EINVAL; 169412ede9acSGowrishankar Muthukrishnan } 169512ede9acSGowrishankar Muthukrishnan 169612ede9acSGowrishankar Muthukrishnan switch (info.op) { 169712ede9acSGowrishankar Muthukrishnan case FIPS_TEST_ASYM_SIGGEN: 169812ede9acSGowrishankar Muthukrishnan if (!rte_cryptodev_asym_xform_capability_check_optype(cap, 169912ede9acSGowrishankar Muthukrishnan RTE_CRYPTO_ASYM_OP_SIGN)) { 170012ede9acSGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n", 170112ede9acSGowrishankar Muthukrishnan info.device_name, RTE_CRYPTO_ASYM_OP_SIGN); 170212ede9acSGowrishankar Muthukrishnan return -EPERM; 170312ede9acSGowrishankar Muthukrishnan } 170412ede9acSGowrishankar Muthukrishnan 170512ede9acSGowrishankar Muthukrishnan xform->ec.pkey.data = vec.eddsa.pkey.val; 170612ede9acSGowrishankar Muthukrishnan xform->ec.pkey.length = vec.eddsa.pkey.len; 170712ede9acSGowrishankar Muthukrishnan xform->ec.q.x.data = vec.eddsa.q.val; 170812ede9acSGowrishankar Muthukrishnan xform->ec.q.x.length = vec.eddsa.q.len; 170912ede9acSGowrishankar Muthukrishnan break; 171012ede9acSGowrishankar Muthukrishnan case FIPS_TEST_ASYM_SIGVER: 171112ede9acSGowrishankar Muthukrishnan if (!rte_cryptodev_asym_xform_capability_check_optype(cap, 171212ede9acSGowrishankar Muthukrishnan RTE_CRYPTO_ASYM_OP_VERIFY)) { 171312ede9acSGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n", 171412ede9acSGowrishankar Muthukrishnan info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY); 171512ede9acSGowrishankar Muthukrishnan return -EPERM; 171612ede9acSGowrishankar Muthukrishnan } 171712ede9acSGowrishankar Muthukrishnan 171812ede9acSGowrishankar Muthukrishnan xform->ec.q.x.data = vec.eddsa.q.val; 171912ede9acSGowrishankar Muthukrishnan xform->ec.q.x.length = vec.eddsa.q.len; 172012ede9acSGowrishankar Muthukrishnan break; 172112ede9acSGowrishankar Muthukrishnan default: 172212ede9acSGowrishankar Muthukrishnan break; 172312ede9acSGowrishankar Muthukrishnan } 172412ede9acSGowrishankar Muthukrishnan 172512ede9acSGowrishankar Muthukrishnan xform->ec.curve_id = info.interim_info.eddsa_data.curve_id; 172612ede9acSGowrishankar Muthukrishnan return 0; 172712ede9acSGowrishankar Muthukrishnan } 172812ede9acSGowrishankar Muthukrishnan 172912ede9acSGowrishankar Muthukrishnan static int 1730b455d261SGowrishankar Muthukrishnan prepare_ecfpm_xform(struct rte_crypto_asym_xform *xform) 1731b455d261SGowrishankar Muthukrishnan { 1732b455d261SGowrishankar Muthukrishnan const struct rte_cryptodev_asymmetric_xform_capability *cap; 1733b455d261SGowrishankar Muthukrishnan struct rte_cryptodev_asym_capability_idx cap_idx; 1734b455d261SGowrishankar Muthukrishnan 1735b455d261SGowrishankar Muthukrishnan xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM; 1736b455d261SGowrishankar Muthukrishnan xform->next = NULL; 1737b455d261SGowrishankar Muthukrishnan 1738b455d261SGowrishankar Muthukrishnan cap_idx.type = xform->xform_type; 1739b455d261SGowrishankar Muthukrishnan cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx); 1740b455d261SGowrishankar Muthukrishnan if (!cap) { 1741b455d261SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 1742b455d261SGowrishankar Muthukrishnan env.dev_id); 1743b455d261SGowrishankar Muthukrishnan return -EINVAL; 1744b455d261SGowrishankar Muthukrishnan } 1745b455d261SGowrishankar Muthukrishnan 1746b455d261SGowrishankar Muthukrishnan xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id; 1747b455d261SGowrishankar Muthukrishnan return 0; 1748b455d261SGowrishankar Muthukrishnan } 1749b455d261SGowrishankar Muthukrishnan 1750b455d261SGowrishankar Muthukrishnan static int 175112ede9acSGowrishankar Muthukrishnan prepare_edfpm_xform(struct rte_crypto_asym_xform *xform) 175212ede9acSGowrishankar Muthukrishnan { 175312ede9acSGowrishankar Muthukrishnan const struct rte_cryptodev_asymmetric_xform_capability *cap; 175412ede9acSGowrishankar Muthukrishnan struct rte_cryptodev_asym_capability_idx cap_idx; 175512ede9acSGowrishankar Muthukrishnan 175612ede9acSGowrishankar Muthukrishnan xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM; 175712ede9acSGowrishankar Muthukrishnan xform->next = NULL; 175812ede9acSGowrishankar Muthukrishnan 175912ede9acSGowrishankar Muthukrishnan cap_idx.type = xform->xform_type; 176012ede9acSGowrishankar Muthukrishnan cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx); 176112ede9acSGowrishankar Muthukrishnan if (!cap) { 176212ede9acSGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 176312ede9acSGowrishankar Muthukrishnan env.dev_id); 176412ede9acSGowrishankar Muthukrishnan return -EINVAL; 176512ede9acSGowrishankar Muthukrishnan } 176612ede9acSGowrishankar Muthukrishnan 176712ede9acSGowrishankar Muthukrishnan xform->ec.curve_id = info.interim_info.eddsa_data.curve_id; 176812ede9acSGowrishankar Muthukrishnan return 0; 176912ede9acSGowrishankar Muthukrishnan } 177012ede9acSGowrishankar Muthukrishnan 177112ede9acSGowrishankar Muthukrishnan static int 1772cd255ccfSMarko Kovacevic get_writeback_data(struct fips_val *val) 1773cd255ccfSMarko Kovacevic { 1774952e10cdSFan Zhang struct rte_mbuf *m = env.mbuf; 1775952e10cdSFan Zhang uint16_t data_len = rte_pktmbuf_pkt_len(m); 1776952e10cdSFan Zhang uint16_t total_len = data_len + env.digest_len; 1777952e10cdSFan Zhang uint8_t *src, *dst, *wb_data; 1778952e10cdSFan Zhang 1779952e10cdSFan Zhang /* in case val is reused for MCT test, try to free the buffer first */ 1780952e10cdSFan Zhang if (val->val) { 17813d3408ddSGowrishankar Muthukrishnan rte_free(val->val); 1782952e10cdSFan Zhang val->val = NULL; 1783952e10cdSFan Zhang } 1784952e10cdSFan Zhang 17853d3408ddSGowrishankar Muthukrishnan wb_data = dst = rte_malloc(NULL, total_len, 0); 1786952e10cdSFan Zhang if (!dst) { 1787952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Error %i: Not enough memory\n", -ENOMEM); 1788952e10cdSFan Zhang return -ENOMEM; 1789952e10cdSFan Zhang } 1790952e10cdSFan Zhang 1791952e10cdSFan Zhang while (m && data_len) { 1792952e10cdSFan Zhang uint16_t seg_len = RTE_MIN(rte_pktmbuf_data_len(m), data_len); 1793952e10cdSFan Zhang 1794952e10cdSFan Zhang src = rte_pktmbuf_mtod(m, uint8_t *); 1795952e10cdSFan Zhang memcpy(dst, src, seg_len); 1796952e10cdSFan Zhang m = m->next; 1797952e10cdSFan Zhang data_len -= seg_len; 1798952e10cdSFan Zhang dst += seg_len; 1799952e10cdSFan Zhang } 1800952e10cdSFan Zhang 1801952e10cdSFan Zhang if (data_len) { 1802952e10cdSFan Zhang RTE_LOG(ERR, USER1, "Error -1: write back data\n"); 18033d3408ddSGowrishankar Muthukrishnan rte_free(wb_data); 1804952e10cdSFan Zhang return -1; 1805952e10cdSFan Zhang } 1806952e10cdSFan Zhang 1807952e10cdSFan Zhang if (env.digest) 1808952e10cdSFan Zhang memcpy(dst, env.digest, env.digest_len); 1809952e10cdSFan Zhang 1810952e10cdSFan Zhang val->val = wb_data; 1811952e10cdSFan Zhang val->len = total_len; 1812952e10cdSFan Zhang 1813952e10cdSFan Zhang return 0; 1814cd255ccfSMarko Kovacevic } 1815cd255ccfSMarko Kovacevic 1816cd255ccfSMarko Kovacevic static int 181736128a67SGowrishankar Muthukrishnan fips_run_sym_test(void) 1818cd255ccfSMarko Kovacevic { 1819cd255ccfSMarko Kovacevic struct rte_crypto_sym_xform xform = {0}; 1820cd255ccfSMarko Kovacevic uint16_t n_deqd; 1821cd255ccfSMarko Kovacevic int ret; 1822cd255ccfSMarko Kovacevic 182336128a67SGowrishankar Muthukrishnan if (!test_ops.prepare_sym_xform || !test_ops.prepare_sym_op) 182436128a67SGowrishankar Muthukrishnan return -EINVAL; 182536128a67SGowrishankar Muthukrishnan 182636128a67SGowrishankar Muthukrishnan ret = test_ops.prepare_sym_xform(&xform); 1827cd255ccfSMarko Kovacevic if (ret < 0) 1828cd255ccfSMarko Kovacevic return ret; 1829cd255ccfSMarko Kovacevic 183036128a67SGowrishankar Muthukrishnan env.sym.sess = rte_cryptodev_sym_session_create(env.dev_id, &xform, 183136128a67SGowrishankar Muthukrishnan env.sym.sess_mpool); 183236128a67SGowrishankar Muthukrishnan if (!env.sym.sess) 183336128a67SGowrishankar Muthukrishnan return -ENOMEM; 1834cd255ccfSMarko Kovacevic 183536128a67SGowrishankar Muthukrishnan ret = test_ops.prepare_sym_op(); 1836cd255ccfSMarko Kovacevic if (ret < 0) { 1837cd255ccfSMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Prepare op\n", 1838cd255ccfSMarko Kovacevic ret); 1839083a2777SMarko Kovacevic goto exit; 1840cd255ccfSMarko Kovacevic } 1841cd255ccfSMarko Kovacevic 1842cd255ccfSMarko Kovacevic if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) { 1843cd255ccfSMarko Kovacevic RTE_LOG(ERR, USER1, "Error: Failed enqueue\n"); 1844083a2777SMarko Kovacevic ret = -1; 1845083a2777SMarko Kovacevic goto exit; 1846cd255ccfSMarko Kovacevic } 1847cd255ccfSMarko Kovacevic 1848cd255ccfSMarko Kovacevic do { 1849cd255ccfSMarko Kovacevic struct rte_crypto_op *deqd_op; 1850cd255ccfSMarko Kovacevic 185136128a67SGowrishankar Muthukrishnan n_deqd = rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1); 1852cd255ccfSMarko Kovacevic } while (n_deqd == 0); 1853cd255ccfSMarko Kovacevic 1854cd255ccfSMarko Kovacevic vec.status = env.op->status; 1855cd255ccfSMarko Kovacevic 1856083a2777SMarko Kovacevic exit: 185736128a67SGowrishankar Muthukrishnan rte_cryptodev_sym_session_free(env.dev_id, env.sym.sess); 185836128a67SGowrishankar Muthukrishnan env.sym.sess = NULL; 185936128a67SGowrishankar Muthukrishnan return ret; 1860bdce2564SAkhil Goyal } 1861cd255ccfSMarko Kovacevic 186236128a67SGowrishankar Muthukrishnan static int 186336128a67SGowrishankar Muthukrishnan fips_run_asym_test(void) 186436128a67SGowrishankar Muthukrishnan { 186536128a67SGowrishankar Muthukrishnan struct rte_crypto_asym_xform xform = {0}; 186636128a67SGowrishankar Muthukrishnan struct rte_crypto_asym_op *asym; 186736128a67SGowrishankar Muthukrishnan struct rte_crypto_op *deqd_op; 186836128a67SGowrishankar Muthukrishnan int ret; 186936128a67SGowrishankar Muthukrishnan 187012ede9acSGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_KEYGEN && 187112ede9acSGowrishankar Muthukrishnan (info.algo != FIPS_TEST_ALGO_ECDSA && 187212ede9acSGowrishankar Muthukrishnan info.algo != FIPS_TEST_ALGO_EDDSA)) { 187336128a67SGowrishankar Muthukrishnan RTE_SET_USED(asym); 187436128a67SGowrishankar Muthukrishnan ret = 0; 187536128a67SGowrishankar Muthukrishnan goto exit; 187636128a67SGowrishankar Muthukrishnan } 187736128a67SGowrishankar Muthukrishnan 187836128a67SGowrishankar Muthukrishnan if (!test_ops.prepare_asym_xform || !test_ops.prepare_asym_op) 187936128a67SGowrishankar Muthukrishnan return -EINVAL; 188036128a67SGowrishankar Muthukrishnan 188136128a67SGowrishankar Muthukrishnan asym = env.op->asym; 188236128a67SGowrishankar Muthukrishnan ret = test_ops.prepare_asym_xform(&xform); 188336128a67SGowrishankar Muthukrishnan if (ret < 0) 1884cd255ccfSMarko Kovacevic return ret; 188536128a67SGowrishankar Muthukrishnan 188636128a67SGowrishankar Muthukrishnan ret = rte_cryptodev_asym_session_create(env.dev_id, &xform, env.asym.sess_mpool, 188736128a67SGowrishankar Muthukrishnan (void *)&env.asym.sess); 188836128a67SGowrishankar Muthukrishnan if (ret < 0) 188936128a67SGowrishankar Muthukrishnan return ret; 189036128a67SGowrishankar Muthukrishnan 189136128a67SGowrishankar Muthukrishnan ret = test_ops.prepare_asym_op(); 189236128a67SGowrishankar Muthukrishnan if (ret < 0) { 189336128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Error %i: Prepare op\n", ret); 189436128a67SGowrishankar Muthukrishnan goto exit; 189536128a67SGowrishankar Muthukrishnan } 189636128a67SGowrishankar Muthukrishnan 189736128a67SGowrishankar Muthukrishnan if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) { 189836128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Error: Failed enqueue\n"); 189936128a67SGowrishankar Muthukrishnan ret = -1; 190036128a67SGowrishankar Muthukrishnan goto exit; 190136128a67SGowrishankar Muthukrishnan } 190236128a67SGowrishankar Muthukrishnan 190336128a67SGowrishankar Muthukrishnan while (rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1) == 0) 190436128a67SGowrishankar Muthukrishnan rte_pause(); 190536128a67SGowrishankar Muthukrishnan 190636128a67SGowrishankar Muthukrishnan vec.status = env.op->status; 190736128a67SGowrishankar Muthukrishnan 190836128a67SGowrishankar Muthukrishnan exit: 190936128a67SGowrishankar Muthukrishnan if (env.asym.sess) 191036128a67SGowrishankar Muthukrishnan rte_cryptodev_asym_session_free(env.dev_id, env.asym.sess); 191136128a67SGowrishankar Muthukrishnan 191236128a67SGowrishankar Muthukrishnan env.asym.sess = NULL; 191336128a67SGowrishankar Muthukrishnan return ret; 191436128a67SGowrishankar Muthukrishnan } 191536128a67SGowrishankar Muthukrishnan 191636128a67SGowrishankar Muthukrishnan static int 191736128a67SGowrishankar Muthukrishnan fips_run_test(void) 191836128a67SGowrishankar Muthukrishnan { 191936128a67SGowrishankar Muthukrishnan int ret; 192036128a67SGowrishankar Muthukrishnan 192112ede9acSGowrishankar Muthukrishnan env.op = NULL; 192212ede9acSGowrishankar Muthukrishnan if (!env.is_asym_test) { 192336128a67SGowrishankar Muthukrishnan env.op = env.sym.op; 192436128a67SGowrishankar Muthukrishnan return fips_run_sym_test(); 192536128a67SGowrishankar Muthukrishnan } 192636128a67SGowrishankar Muthukrishnan 192712ede9acSGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_KEYGEN) { 192812ede9acSGowrishankar Muthukrishnan if (info.algo == FIPS_TEST_ALGO_ECDSA) { 192912ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_xform = prepare_ecfpm_xform; 193012ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_op = prepare_ecfpm_op; 193112ede9acSGowrishankar Muthukrishnan info.interim_info.ecdsa_data.pubkey_gen = 0; 1932b455d261SGowrishankar Muthukrishnan 193312ede9acSGowrishankar Muthukrishnan } else if (info.algo == FIPS_TEST_ALGO_EDDSA) { 193412ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_xform = prepare_edfpm_xform; 193512ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_op = prepare_edfpm_op; 193612ede9acSGowrishankar Muthukrishnan info.interim_info.eddsa_data.pubkey_gen = 0; 193712ede9acSGowrishankar Muthukrishnan } 193812ede9acSGowrishankar Muthukrishnan 193912ede9acSGowrishankar Muthukrishnan env.op = env.asym.op; 194012ede9acSGowrishankar Muthukrishnan return fips_run_asym_test(); 194112ede9acSGowrishankar Muthukrishnan } 194212ede9acSGowrishankar Muthukrishnan 1943*733c7861SGowrishankar Muthukrishnan if (info.algo == FIPS_TEST_ALGO_ECDSA || 1944*733c7861SGowrishankar Muthukrishnan info.algo == FIPS_TEST_ALGO_RSA) { 194512ede9acSGowrishankar Muthukrishnan vec.cipher_auth.digest.len = 194612ede9acSGowrishankar Muthukrishnan parse_test_sha_hash_size(info.interim_info.ecdsa_data.auth); 194712ede9acSGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_sha_xform; 194812ede9acSGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_auth_op; 194912ede9acSGowrishankar Muthukrishnan 195012ede9acSGowrishankar Muthukrishnan env.op = env.sym.op; 195112ede9acSGowrishankar Muthukrishnan ret = fips_run_sym_test(); 195212ede9acSGowrishankar Muthukrishnan if (ret < 0) 195312ede9acSGowrishankar Muthukrishnan return ret; 195412ede9acSGowrishankar Muthukrishnan } 195512ede9acSGowrishankar Muthukrishnan 195612ede9acSGowrishankar Muthukrishnan env.op = env.asym.op; 195712ede9acSGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_SIGGEN) { 195812ede9acSGowrishankar Muthukrishnan fips_prepare_asym_xform_t old_xform; 195912ede9acSGowrishankar Muthukrishnan fips_prepare_op_t old_op; 196012ede9acSGowrishankar Muthukrishnan 196112ede9acSGowrishankar Muthukrishnan old_xform = test_ops.prepare_asym_xform; 196212ede9acSGowrishankar Muthukrishnan old_op = test_ops.prepare_asym_op; 196312ede9acSGowrishankar Muthukrishnan 196412ede9acSGowrishankar Muthukrishnan if (info.algo == FIPS_TEST_ALGO_ECDSA && 196512ede9acSGowrishankar Muthukrishnan info.interim_info.ecdsa_data.pubkey_gen == 1) { 1966b455d261SGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_KEYGEN; 1967b455d261SGowrishankar Muthukrishnan test_ops.prepare_asym_xform = prepare_ecfpm_xform; 1968b455d261SGowrishankar Muthukrishnan test_ops.prepare_asym_op = prepare_ecfpm_op; 196912ede9acSGowrishankar Muthukrishnan 1970b455d261SGowrishankar Muthukrishnan ret = fips_run_asym_test(); 1971b455d261SGowrishankar Muthukrishnan if (ret < 0) 1972b455d261SGowrishankar Muthukrishnan return ret; 1973b455d261SGowrishankar Muthukrishnan 1974b455d261SGowrishankar Muthukrishnan info.post_interim_writeback(NULL); 1975b455d261SGowrishankar Muthukrishnan info.interim_info.ecdsa_data.pubkey_gen = 0; 1976b455d261SGowrishankar Muthukrishnan 197712ede9acSGowrishankar Muthukrishnan } else if (info.algo == FIPS_TEST_ALGO_EDDSA && 197812ede9acSGowrishankar Muthukrishnan info.interim_info.eddsa_data.pubkey_gen == 1) { 197912ede9acSGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_KEYGEN; 198012ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_xform = prepare_edfpm_xform; 198112ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_op = prepare_edfpm_op; 198212ede9acSGowrishankar Muthukrishnan 198312ede9acSGowrishankar Muthukrishnan const struct rte_cryptodev_asymmetric_xform_capability *cap; 198412ede9acSGowrishankar Muthukrishnan struct rte_cryptodev_asym_capability_idx cap_idx; 198512ede9acSGowrishankar Muthukrishnan 198612ede9acSGowrishankar Muthukrishnan cap_idx.type = RTE_CRYPTO_ASYM_XFORM_EDDSA; 198712ede9acSGowrishankar Muthukrishnan cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx); 198812ede9acSGowrishankar Muthukrishnan if (!cap) { 198912ede9acSGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n", 199012ede9acSGowrishankar Muthukrishnan env.dev_id); 199112ede9acSGowrishankar Muthukrishnan return -EINVAL; 199212ede9acSGowrishankar Muthukrishnan } 199312ede9acSGowrishankar Muthukrishnan 199412ede9acSGowrishankar Muthukrishnan if (cap->op_types & (1 << RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE)) { 199512ede9acSGowrishankar Muthukrishnan ret = fips_run_asym_test(); 199612ede9acSGowrishankar Muthukrishnan if (ret < 0) 199712ede9acSGowrishankar Muthukrishnan return ret; 199812ede9acSGowrishankar Muthukrishnan } else { 199912ede9acSGowrishankar Muthukrishnan /* Below is only a workaround by using known keys. */ 200012ede9acSGowrishankar Muthukrishnan struct rte_crypto_asym_xform xform = {0}; 200112ede9acSGowrishankar Muthukrishnan 200212ede9acSGowrishankar Muthukrishnan prepare_edfpm_xform(&xform); 200312ede9acSGowrishankar Muthukrishnan prepare_edfpm_op(); 200412ede9acSGowrishankar Muthukrishnan uint8_t pkey25519[] = { 200512ede9acSGowrishankar Muthukrishnan 0x83, 0x3f, 0xe6, 0x24, 0x09, 0x23, 0x7b, 0x9d, 200612ede9acSGowrishankar Muthukrishnan 0x62, 0xec, 0x77, 0x58, 0x75, 0x20, 0x91, 0x1e, 200712ede9acSGowrishankar Muthukrishnan 0x9a, 0x75, 0x9c, 0xec, 0x1d, 0x19, 0x75, 0x5b, 200812ede9acSGowrishankar Muthukrishnan 0x7d, 0xa9, 0x01, 0xb9, 0x6d, 0xca, 0x3d, 0x42 200912ede9acSGowrishankar Muthukrishnan }; 201012ede9acSGowrishankar Muthukrishnan uint8_t q25519[] = { 201112ede9acSGowrishankar Muthukrishnan 0xec, 0x17, 0x2b, 0x93, 0xad, 0x5e, 0x56, 0x3b, 201212ede9acSGowrishankar Muthukrishnan 0xf4, 0x93, 0x2c, 0x70, 0xe1, 0x24, 0x50, 0x34, 201312ede9acSGowrishankar Muthukrishnan 0xc3, 0x54, 0x67, 0xef, 0x2e, 0xfd, 0x4d, 0x64, 201412ede9acSGowrishankar Muthukrishnan 0xeb, 0xf8, 0x19, 0x68, 0x34, 0x67, 0xe2, 0xbf 201512ede9acSGowrishankar Muthukrishnan }; 201612ede9acSGowrishankar Muthukrishnan uint8_t pkey448[] = { 201712ede9acSGowrishankar Muthukrishnan 0xd6, 0x5d, 0xf3, 0x41, 0xad, 0x13, 0xe0, 0x08, 201812ede9acSGowrishankar Muthukrishnan 0x56, 0x76, 0x88, 0xba, 0xed, 0xda, 0x8e, 0x9d, 201912ede9acSGowrishankar Muthukrishnan 0xcd, 0xc1, 0x7d, 0xc0, 0x24, 0x97, 0x4e, 0xa5, 202012ede9acSGowrishankar Muthukrishnan 0xb4, 0x22, 0x7b, 0x65, 0x30, 0xe3, 0x39, 0xbf, 202112ede9acSGowrishankar Muthukrishnan 0xf2, 0x1f, 0x99, 0xe6, 0x8c, 0xa6, 0x96, 0x8f, 202212ede9acSGowrishankar Muthukrishnan 0x3c, 0xca, 0x6d, 0xfe, 0x0f, 0xb9, 0xf4, 0xfa, 202312ede9acSGowrishankar Muthukrishnan 0xb4, 0xfa, 0x13, 0x5d, 0x55, 0x42, 0xea, 0x3f, 202412ede9acSGowrishankar Muthukrishnan 0x01 202512ede9acSGowrishankar Muthukrishnan }; 202612ede9acSGowrishankar Muthukrishnan uint8_t q448[] = { 202712ede9acSGowrishankar Muthukrishnan 0xdf, 0x97, 0x05, 0xf5, 0x8e, 0xdb, 0xab, 0x80, 202812ede9acSGowrishankar Muthukrishnan 0x2c, 0x7f, 0x83, 0x63, 0xcf, 0xe5, 0x56, 0x0a, 202912ede9acSGowrishankar Muthukrishnan 0xb1, 0xc6, 0x13, 0x2c, 0x20, 0xa9, 0xf1, 0xdd, 203012ede9acSGowrishankar Muthukrishnan 0x16, 0x34, 0x83, 0xa2, 0x6f, 0x8a, 0xc5, 0x3a, 203112ede9acSGowrishankar Muthukrishnan 0x39, 0xd6, 0x80, 0x8b, 0xf4, 0xa1, 0xdf, 0xbd, 203212ede9acSGowrishankar Muthukrishnan 0x26, 0x1b, 0x09, 0x9b, 0xb0, 0x3b, 0x3f, 0xb5, 203312ede9acSGowrishankar Muthukrishnan 0x09, 0x06, 0xcb, 0x28, 0xbd, 0x8a, 0x08, 0x1f, 203412ede9acSGowrishankar Muthukrishnan 0x00 203512ede9acSGowrishankar Muthukrishnan }; 203612ede9acSGowrishankar Muthukrishnan if (info.interim_info.eddsa_data.curve_id == 203712ede9acSGowrishankar Muthukrishnan RTE_CRYPTO_EC_GROUP_ED25519) { 203812ede9acSGowrishankar Muthukrishnan memcpy(vec.eddsa.pkey.val, pkey25519, RTE_DIM(pkey25519)); 203912ede9acSGowrishankar Muthukrishnan vec.eddsa.pkey.len = 32; 204012ede9acSGowrishankar Muthukrishnan memcpy(vec.eddsa.q.val, q25519, RTE_DIM(q25519)); 204112ede9acSGowrishankar Muthukrishnan vec.eddsa.q.len = 32; 204212ede9acSGowrishankar Muthukrishnan } else { 204312ede9acSGowrishankar Muthukrishnan memcpy(vec.eddsa.pkey.val, pkey448, RTE_DIM(pkey448)); 204412ede9acSGowrishankar Muthukrishnan vec.eddsa.pkey.len = 32; 204512ede9acSGowrishankar Muthukrishnan memcpy(vec.eddsa.q.val, q448, RTE_DIM(q448)); 204612ede9acSGowrishankar Muthukrishnan vec.eddsa.q.len = 32; 204712ede9acSGowrishankar Muthukrishnan } 204812ede9acSGowrishankar Muthukrishnan } 204912ede9acSGowrishankar Muthukrishnan info.post_interim_writeback(NULL); 205012ede9acSGowrishankar Muthukrishnan info.interim_info.eddsa_data.pubkey_gen = 0; 205112ede9acSGowrishankar Muthukrishnan 205212ede9acSGowrishankar Muthukrishnan } 205312ede9acSGowrishankar Muthukrishnan 205412ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_xform = old_xform; 205512ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_op = old_op; 2056b455d261SGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_SIGGEN; 2057b455d261SGowrishankar Muthukrishnan ret = fips_run_asym_test(); 2058b455d261SGowrishankar Muthukrishnan } else { 2059b455d261SGowrishankar Muthukrishnan ret = fips_run_asym_test(); 2060b455d261SGowrishankar Muthukrishnan } 2061b455d261SGowrishankar Muthukrishnan 2062b455d261SGowrishankar Muthukrishnan return ret; 2063cd255ccfSMarko Kovacevic } 2064cd255ccfSMarko Kovacevic 2065cd255ccfSMarko Kovacevic static int 2066cd255ccfSMarko Kovacevic fips_generic_test(void) 2067cd255ccfSMarko Kovacevic { 2068952e10cdSFan Zhang struct fips_val val = {NULL, 0}; 2069cd255ccfSMarko Kovacevic int ret; 2070cd255ccfSMarko Kovacevic 207189be27e3SBrandon Lo if (info.file_type != FIPS_TYPE_JSON) 2072cd255ccfSMarko Kovacevic fips_test_write_one_case(); 2073cd255ccfSMarko Kovacevic 2074cd255ccfSMarko Kovacevic ret = fips_run_test(); 2075cd255ccfSMarko Kovacevic if (ret < 0) { 20768a40ff39SArchana Muniganti if (ret == -EPERM || ret == -ENOTSUP) { 207789be27e3SBrandon Lo if (info.file_type == FIPS_TYPE_JSON) 207889be27e3SBrandon Lo return ret; 207989be27e3SBrandon Lo 2080cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "Bypass\n\n"); 2081cd255ccfSMarko Kovacevic return 0; 2082cd255ccfSMarko Kovacevic } 2083cd255ccfSMarko Kovacevic 2084cd255ccfSMarko Kovacevic return ret; 2085cd255ccfSMarko Kovacevic } 2086cd255ccfSMarko Kovacevic 208736128a67SGowrishankar Muthukrishnan if (!env.is_asym_test) { 2088952e10cdSFan Zhang ret = get_writeback_data(&val); 2089952e10cdSFan Zhang if (ret < 0) 2090952e10cdSFan Zhang return ret; 209136128a67SGowrishankar Muthukrishnan } 2092cd255ccfSMarko Kovacevic 2093cd255ccfSMarko Kovacevic switch (info.file_type) { 2094cd255ccfSMarko Kovacevic case FIPS_TYPE_REQ: 2095cd255ccfSMarko Kovacevic case FIPS_TYPE_RSP: 209689be27e3SBrandon Lo case FIPS_TYPE_JSON: 2097cd255ccfSMarko Kovacevic if (info.parse_writeback == NULL) 2098cd255ccfSMarko Kovacevic return -EPERM; 2099cd255ccfSMarko Kovacevic ret = info.parse_writeback(&val); 2100cd255ccfSMarko Kovacevic if (ret < 0) 2101cd255ccfSMarko Kovacevic return ret; 2102cd255ccfSMarko Kovacevic break; 2103cd255ccfSMarko Kovacevic case FIPS_TYPE_FAX: 2104cd255ccfSMarko Kovacevic if (info.kat_check == NULL) 2105cd255ccfSMarko Kovacevic return -EPERM; 2106cd255ccfSMarko Kovacevic ret = info.kat_check(&val); 2107cd255ccfSMarko Kovacevic if (ret < 0) 2108cd255ccfSMarko Kovacevic return ret; 2109cd255ccfSMarko Kovacevic break; 2110f556293fSBrandon Lo default: 2111f556293fSBrandon Lo break; 2112cd255ccfSMarko Kovacevic } 2113cd255ccfSMarko Kovacevic 211489be27e3SBrandon Lo if (info.file_type != FIPS_TYPE_JSON) 2115cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "\n"); 21163d3408ddSGowrishankar Muthukrishnan rte_free(val.val); 2117cd255ccfSMarko Kovacevic 2118cd255ccfSMarko Kovacevic return 0; 2119cd255ccfSMarko Kovacevic } 2120cd255ccfSMarko Kovacevic 2121cd255ccfSMarko Kovacevic static int 2122527cbf3dSMarko Kovacevic fips_mct_tdes_test(void) 2123527cbf3dSMarko Kovacevic { 2124527cbf3dSMarko Kovacevic #define TDES_BLOCK_SIZE 8 2125527cbf3dSMarko Kovacevic #define TDES_EXTERN_ITER 400 2126527cbf3dSMarko Kovacevic #define TDES_INTERN_ITER 10000 212764569ffaSGowrishankar Muthukrishnan struct fips_val val[3] = {{NULL, 0},}, val_key, pt, ct, iv; 21289252e81aSMarko Kovacevic uint8_t prev_out[TDES_BLOCK_SIZE] = {0}; 21299252e81aSMarko Kovacevic uint8_t prev_prev_out[TDES_BLOCK_SIZE] = {0}; 21309252e81aSMarko Kovacevic uint8_t prev_in[TDES_BLOCK_SIZE] = {0}; 2131527cbf3dSMarko Kovacevic uint32_t i, j, k; 2132527cbf3dSMarko Kovacevic int ret; 2133ae65004fSMichael Shamis int test_mode = info.interim_info.tdes_data.test_mode; 2134527cbf3dSMarko Kovacevic 213564569ffaSGowrishankar Muthukrishnan pt.len = vec.pt.len; 21363d3408ddSGowrishankar Muthukrishnan pt.val = rte_malloc(NULL, pt.len, 0); 213764569ffaSGowrishankar Muthukrishnan ct.len = vec.ct.len; 21383d3408ddSGowrishankar Muthukrishnan ct.val = rte_malloc(NULL, ct.len, 0); 213964569ffaSGowrishankar Muthukrishnan iv.len = vec.iv.len; 21403d3408ddSGowrishankar Muthukrishnan iv.val = rte_malloc(NULL, iv.len, 0); 214164569ffaSGowrishankar Muthukrishnan 2142527cbf3dSMarko Kovacevic for (i = 0; i < TDES_EXTERN_ITER; i++) { 214364569ffaSGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) { 214479365018SArchana Muniganti if ((i == 0) && (info.version == 21.4f)) { 21452b84d2bdSArchana Muniganti if (!(strstr(info.vec[0], "COUNT"))) 21462b84d2bdSArchana Muniganti fprintf(info.fp_wr, "%s%u\n", "COUNT = ", 0); 214779365018SArchana Muniganti } 214879365018SArchana Muniganti 214979365018SArchana Muniganti if (i != 0) 2150527cbf3dSMarko Kovacevic update_info_vec(i); 2151527cbf3dSMarko Kovacevic 2152527cbf3dSMarko Kovacevic fips_test_write_one_case(); 215364569ffaSGowrishankar Muthukrishnan } 2154527cbf3dSMarko Kovacevic 2155527cbf3dSMarko Kovacevic for (j = 0; j < TDES_INTERN_ITER; j++) { 2156527cbf3dSMarko Kovacevic ret = fips_run_test(); 2157527cbf3dSMarko Kovacevic if (ret < 0) { 2158527cbf3dSMarko Kovacevic if (ret == -EPERM) { 215989be27e3SBrandon Lo if (info.file_type == FIPS_TYPE_JSON) 216089be27e3SBrandon Lo return ret; 216189be27e3SBrandon Lo 2162527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "Bypass\n"); 2163527cbf3dSMarko Kovacevic return 0; 2164527cbf3dSMarko Kovacevic } 2165527cbf3dSMarko Kovacevic return ret; 2166527cbf3dSMarko Kovacevic } 2167527cbf3dSMarko Kovacevic 216864569ffaSGowrishankar Muthukrishnan ret = get_writeback_data(&val[0]); 2169952e10cdSFan Zhang if (ret < 0) 2170952e10cdSFan Zhang return ret; 2171527cbf3dSMarko Kovacevic 2172527cbf3dSMarko Kovacevic if (info.op == FIPS_TEST_DEC_AUTH_VERIF) 2173527cbf3dSMarko Kovacevic memcpy(prev_in, vec.ct.val, TDES_BLOCK_SIZE); 2174527cbf3dSMarko Kovacevic 2175527cbf3dSMarko Kovacevic if (j == 0) { 217664569ffaSGowrishankar Muthukrishnan memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE); 217764569ffaSGowrishankar Muthukrishnan memcpy(pt.val, vec.pt.val, pt.len); 217864569ffaSGowrishankar Muthukrishnan memcpy(ct.val, vec.ct.val, ct.len); 217964569ffaSGowrishankar Muthukrishnan memcpy(iv.val, vec.iv.val, iv.len); 2180527cbf3dSMarko Kovacevic 2181527cbf3dSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) { 2182ae65004fSMichael Shamis if (test_mode == TDES_MODE_ECB) { 218364569ffaSGowrishankar Muthukrishnan memcpy(vec.pt.val, val[0].val, 2184ae65004fSMichael Shamis TDES_BLOCK_SIZE); 2185ae65004fSMichael Shamis } else { 2186527cbf3dSMarko Kovacevic memcpy(vec.pt.val, vec.iv.val, 2187527cbf3dSMarko Kovacevic TDES_BLOCK_SIZE); 218864569ffaSGowrishankar Muthukrishnan memcpy(vec.iv.val, val[0].val, 2189527cbf3dSMarko Kovacevic TDES_BLOCK_SIZE); 2190ae65004fSMichael Shamis } 219164569ffaSGowrishankar Muthukrishnan val[1].val = pt.val; 219264569ffaSGowrishankar Muthukrishnan val[1].len = pt.len; 219364569ffaSGowrishankar Muthukrishnan val[2].val = iv.val; 219464569ffaSGowrishankar Muthukrishnan val[2].len = iv.len; 2195ae65004fSMichael Shamis } else { 2196ae65004fSMichael Shamis if (test_mode == TDES_MODE_ECB) { 219764569ffaSGowrishankar Muthukrishnan memcpy(vec.ct.val, val[0].val, 2198ae65004fSMichael Shamis TDES_BLOCK_SIZE); 2199527cbf3dSMarko Kovacevic } else { 2200527cbf3dSMarko Kovacevic memcpy(vec.iv.val, vec.ct.val, 2201527cbf3dSMarko Kovacevic TDES_BLOCK_SIZE); 220264569ffaSGowrishankar Muthukrishnan memcpy(vec.ct.val, val[0].val, 2203527cbf3dSMarko Kovacevic TDES_BLOCK_SIZE); 2204527cbf3dSMarko Kovacevic } 220564569ffaSGowrishankar Muthukrishnan val[1].val = ct.val; 220664569ffaSGowrishankar Muthukrishnan val[1].len = ct.len; 220764569ffaSGowrishankar Muthukrishnan val[2].val = iv.val; 220864569ffaSGowrishankar Muthukrishnan val[2].len = iv.len; 2209ae65004fSMichael Shamis } 2210527cbf3dSMarko Kovacevic continue; 2211527cbf3dSMarko Kovacevic } 2212527cbf3dSMarko Kovacevic 2213527cbf3dSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) { 2214ae65004fSMichael Shamis if (test_mode == TDES_MODE_ECB) { 221564569ffaSGowrishankar Muthukrishnan memcpy(vec.pt.val, val[0].val, 2216ae65004fSMichael Shamis TDES_BLOCK_SIZE); 2217527cbf3dSMarko Kovacevic } else { 221864569ffaSGowrishankar Muthukrishnan memcpy(vec.iv.val, val[0].val, 2219ae65004fSMichael Shamis TDES_BLOCK_SIZE); 2220ae65004fSMichael Shamis memcpy(vec.pt.val, prev_out, 2221ae65004fSMichael Shamis TDES_BLOCK_SIZE); 2222ae65004fSMichael Shamis } 2223ae65004fSMichael Shamis } else { 2224ae65004fSMichael Shamis if (test_mode == TDES_MODE_ECB) { 222564569ffaSGowrishankar Muthukrishnan memcpy(vec.ct.val, val[0].val, 2226ae65004fSMichael Shamis TDES_BLOCK_SIZE); 2227ae65004fSMichael Shamis } else { 2228ae65004fSMichael Shamis memcpy(vec.iv.val, vec.ct.val, 2229ae65004fSMichael Shamis TDES_BLOCK_SIZE); 223064569ffaSGowrishankar Muthukrishnan memcpy(vec.ct.val, val[0].val, 2231ae65004fSMichael Shamis TDES_BLOCK_SIZE); 2232ae65004fSMichael Shamis } 2233527cbf3dSMarko Kovacevic } 2234527cbf3dSMarko Kovacevic 2235527cbf3dSMarko Kovacevic if (j == TDES_INTERN_ITER - 1) 2236527cbf3dSMarko Kovacevic continue; 2237527cbf3dSMarko Kovacevic 223864569ffaSGowrishankar Muthukrishnan memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE); 2239527cbf3dSMarko Kovacevic 2240527cbf3dSMarko Kovacevic if (j == TDES_INTERN_ITER - 3) 224164569ffaSGowrishankar Muthukrishnan memcpy(prev_prev_out, val[0].val, TDES_BLOCK_SIZE); 2242527cbf3dSMarko Kovacevic } 2243527cbf3dSMarko Kovacevic 224464569ffaSGowrishankar Muthukrishnan info.parse_writeback(val); 224564569ffaSGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) 2246527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "\n"); 2247527cbf3dSMarko Kovacevic 2248527cbf3dSMarko Kovacevic if (i == TDES_EXTERN_ITER - 1) 2249527cbf3dSMarko Kovacevic continue; 2250527cbf3dSMarko Kovacevic 2251527cbf3dSMarko Kovacevic /** update key */ 2252527cbf3dSMarko Kovacevic memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key)); 2253527cbf3dSMarko Kovacevic 2254527cbf3dSMarko Kovacevic if (info.interim_info.tdes_data.nb_keys == 0) { 2255527cbf3dSMarko Kovacevic if (memcmp(val_key.val, val_key.val + 8, 8) == 0) 2256527cbf3dSMarko Kovacevic info.interim_info.tdes_data.nb_keys = 1; 2257527cbf3dSMarko Kovacevic else if (memcmp(val_key.val, val_key.val + 16, 8) == 0) 2258527cbf3dSMarko Kovacevic info.interim_info.tdes_data.nb_keys = 2; 2259527cbf3dSMarko Kovacevic else 2260527cbf3dSMarko Kovacevic info.interim_info.tdes_data.nb_keys = 3; 2261527cbf3dSMarko Kovacevic 2262527cbf3dSMarko Kovacevic } 2263527cbf3dSMarko Kovacevic 2264527cbf3dSMarko Kovacevic for (k = 0; k < TDES_BLOCK_SIZE; k++) { 2265527cbf3dSMarko Kovacevic 2266527cbf3dSMarko Kovacevic switch (info.interim_info.tdes_data.nb_keys) { 2267527cbf3dSMarko Kovacevic case 3: 226864569ffaSGowrishankar Muthukrishnan val_key.val[k] ^= val[0].val[k]; 2269527cbf3dSMarko Kovacevic val_key.val[k + 8] ^= prev_out[k]; 2270527cbf3dSMarko Kovacevic val_key.val[k + 16] ^= prev_prev_out[k]; 2271527cbf3dSMarko Kovacevic break; 2272527cbf3dSMarko Kovacevic case 2: 227364569ffaSGowrishankar Muthukrishnan val_key.val[k] ^= val[0].val[k]; 2274527cbf3dSMarko Kovacevic val_key.val[k + 8] ^= prev_out[k]; 227564569ffaSGowrishankar Muthukrishnan val_key.val[k + 16] ^= val[0].val[k]; 2276527cbf3dSMarko Kovacevic break; 2277527cbf3dSMarko Kovacevic default: /* case 1 */ 227864569ffaSGowrishankar Muthukrishnan val_key.val[k] ^= val[0].val[k]; 227964569ffaSGowrishankar Muthukrishnan val_key.val[k + 8] ^= val[0].val[k]; 228064569ffaSGowrishankar Muthukrishnan val_key.val[k + 16] ^= val[0].val[k]; 2281527cbf3dSMarko Kovacevic break; 2282527cbf3dSMarko Kovacevic } 2283527cbf3dSMarko Kovacevic 2284527cbf3dSMarko Kovacevic } 2285527cbf3dSMarko Kovacevic 2286527cbf3dSMarko Kovacevic for (k = 0; k < 24; k++) 22873d4e27fdSDavid Marchand val_key.val[k] = (rte_popcount32(val_key.val[k]) & 2288527cbf3dSMarko Kovacevic 0x1) ? 2289527cbf3dSMarko Kovacevic val_key.val[k] : (val_key.val[k] ^ 0x1); 2290527cbf3dSMarko Kovacevic 2291527cbf3dSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) { 2292ae65004fSMichael Shamis if (test_mode == TDES_MODE_ECB) { 229364569ffaSGowrishankar Muthukrishnan memcpy(vec.pt.val, val[0].val, TDES_BLOCK_SIZE); 2294ae65004fSMichael Shamis } else { 229564569ffaSGowrishankar Muthukrishnan memcpy(vec.iv.val, val[0].val, TDES_BLOCK_SIZE); 2296527cbf3dSMarko Kovacevic memcpy(vec.pt.val, prev_out, TDES_BLOCK_SIZE); 2297ae65004fSMichael Shamis } 2298ae65004fSMichael Shamis } else { 2299ae65004fSMichael Shamis if (test_mode == TDES_MODE_ECB) { 230064569ffaSGowrishankar Muthukrishnan memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE); 2301527cbf3dSMarko Kovacevic } else { 2302527cbf3dSMarko Kovacevic memcpy(vec.iv.val, prev_out, TDES_BLOCK_SIZE); 230364569ffaSGowrishankar Muthukrishnan memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE); 2304527cbf3dSMarko Kovacevic } 2305527cbf3dSMarko Kovacevic } 2306ae65004fSMichael Shamis } 2307527cbf3dSMarko Kovacevic 23083d3408ddSGowrishankar Muthukrishnan rte_free(val[0].val); 23093d3408ddSGowrishankar Muthukrishnan rte_free(pt.val); 23103d3408ddSGowrishankar Muthukrishnan rte_free(ct.val); 23113d3408ddSGowrishankar Muthukrishnan rte_free(iv.val); 2312952e10cdSFan Zhang 2313527cbf3dSMarko Kovacevic return 0; 2314527cbf3dSMarko Kovacevic } 2315527cbf3dSMarko Kovacevic 2316527cbf3dSMarko Kovacevic static int 2317d3190431SMichael Shamis fips_mct_aes_ecb_test(void) 2318d3190431SMichael Shamis { 2319d3190431SMichael Shamis #define AES_BLOCK_SIZE 16 2320d3190431SMichael Shamis #define AES_EXTERN_ITER 100 2321d3190431SMichael Shamis #define AES_INTERN_ITER 1000 2322952e10cdSFan Zhang struct fips_val val = {NULL, 0}, val_key; 2323d3190431SMichael Shamis uint8_t prev_out[AES_BLOCK_SIZE] = {0}; 2324d3190431SMichael Shamis uint32_t i, j, k; 2325d3190431SMichael Shamis int ret; 2326d3190431SMichael Shamis 2327d3190431SMichael Shamis for (i = 0; i < AES_EXTERN_ITER; i++) { 2328d3190431SMichael Shamis if (i != 0) 2329d3190431SMichael Shamis update_info_vec(i); 2330d3190431SMichael Shamis 2331d3190431SMichael Shamis fips_test_write_one_case(); 2332d3190431SMichael Shamis 2333d3190431SMichael Shamis for (j = 0; j < AES_INTERN_ITER; j++) { 2334d3190431SMichael Shamis ret = fips_run_test(); 2335d3190431SMichael Shamis if (ret < 0) { 2336d3190431SMichael Shamis if (ret == -EPERM) { 233789be27e3SBrandon Lo if (info.file_type == FIPS_TYPE_JSON) 233889be27e3SBrandon Lo return ret; 233989be27e3SBrandon Lo 2340d3190431SMichael Shamis fprintf(info.fp_wr, "Bypass\n"); 2341d3190431SMichael Shamis return 0; 2342d3190431SMichael Shamis } 2343d3190431SMichael Shamis 2344d3190431SMichael Shamis return ret; 2345d3190431SMichael Shamis } 2346d3190431SMichael Shamis 2347952e10cdSFan Zhang ret = get_writeback_data(&val); 2348952e10cdSFan Zhang if (ret < 0) 2349952e10cdSFan Zhang return ret; 2350d3190431SMichael Shamis 2351d3190431SMichael Shamis if (info.op == FIPS_TEST_ENC_AUTH_GEN) 2352d3190431SMichael Shamis memcpy(vec.pt.val, val.val, AES_BLOCK_SIZE); 2353d3190431SMichael Shamis else 2354d3190431SMichael Shamis memcpy(vec.ct.val, val.val, AES_BLOCK_SIZE); 2355d3190431SMichael Shamis 2356d3190431SMichael Shamis if (j == AES_INTERN_ITER - 1) 2357d3190431SMichael Shamis continue; 2358d3190431SMichael Shamis 2359d3190431SMichael Shamis memcpy(prev_out, val.val, AES_BLOCK_SIZE); 2360d3190431SMichael Shamis } 2361d3190431SMichael Shamis 2362d3190431SMichael Shamis info.parse_writeback(&val); 2363d3190431SMichael Shamis fprintf(info.fp_wr, "\n"); 2364d3190431SMichael Shamis 2365d3190431SMichael Shamis if (i == AES_EXTERN_ITER - 1) 2366d3190431SMichael Shamis continue; 2367d3190431SMichael Shamis 2368d3190431SMichael Shamis /** update key */ 2369d3190431SMichael Shamis memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key)); 2370d3190431SMichael Shamis for (k = 0; k < vec.cipher_auth.key.len; k++) { 2371d3190431SMichael Shamis switch (vec.cipher_auth.key.len) { 2372d3190431SMichael Shamis case 16: 2373d3190431SMichael Shamis val_key.val[k] ^= val.val[k]; 2374d3190431SMichael Shamis break; 2375d3190431SMichael Shamis case 24: 2376d3190431SMichael Shamis if (k < 8) 2377d3190431SMichael Shamis val_key.val[k] ^= prev_out[k + 8]; 2378d3190431SMichael Shamis else 2379d3190431SMichael Shamis val_key.val[k] ^= val.val[k - 8]; 2380d3190431SMichael Shamis break; 2381d3190431SMichael Shamis case 32: 2382d3190431SMichael Shamis if (k < 16) 2383d3190431SMichael Shamis val_key.val[k] ^= prev_out[k]; 2384d3190431SMichael Shamis else 2385d3190431SMichael Shamis val_key.val[k] ^= val.val[k - 16]; 2386d3190431SMichael Shamis break; 2387d3190431SMichael Shamis default: 2388d3190431SMichael Shamis return -1; 2389d3190431SMichael Shamis } 2390d3190431SMichael Shamis } 2391d3190431SMichael Shamis } 2392d3190431SMichael Shamis 23933d3408ddSGowrishankar Muthukrishnan rte_free(val.val); 2394952e10cdSFan Zhang 2395d3190431SMichael Shamis return 0; 2396d3190431SMichael Shamis } 2397d3190431SMichael Shamis static int 2398cd255ccfSMarko Kovacevic fips_mct_aes_test(void) 2399cd255ccfSMarko Kovacevic { 2400cd255ccfSMarko Kovacevic #define AES_BLOCK_SIZE 16 2401cd255ccfSMarko Kovacevic #define AES_EXTERN_ITER 100 2402cd255ccfSMarko Kovacevic #define AES_INTERN_ITER 1000 24038b8546aaSGowrishankar Muthukrishnan struct fips_val val[3] = {{NULL, 0},}, val_key, pt, ct, iv; 2404cd255ccfSMarko Kovacevic uint8_t prev_out[AES_BLOCK_SIZE] = {0}; 2405cd255ccfSMarko Kovacevic uint8_t prev_in[AES_BLOCK_SIZE] = {0}; 2406cd255ccfSMarko Kovacevic uint32_t i, j, k; 2407cd255ccfSMarko Kovacevic int ret; 2408cd255ccfSMarko Kovacevic 2409d3190431SMichael Shamis if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_ECB) 2410d3190431SMichael Shamis return fips_mct_aes_ecb_test(); 2411d3190431SMichael Shamis 2412e9ec7f61SGowrishankar Muthukrishnan pt.len = vec.pt.len; 24133d3408ddSGowrishankar Muthukrishnan pt.val = rte_malloc(NULL, pt.len, 0); 2414e9ec7f61SGowrishankar Muthukrishnan ct.len = vec.ct.len; 24153d3408ddSGowrishankar Muthukrishnan ct.val = rte_malloc(NULL, ct.len, 0); 2416e9ec7f61SGowrishankar Muthukrishnan iv.len = vec.iv.len; 24173d3408ddSGowrishankar Muthukrishnan iv.val = rte_malloc(NULL, iv.len, 0); 2418cd255ccfSMarko Kovacevic for (i = 0; i < AES_EXTERN_ITER; i++) { 24198b8546aaSGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) { 2420cd255ccfSMarko Kovacevic if (i != 0) 2421cd255ccfSMarko Kovacevic update_info_vec(i); 2422cd255ccfSMarko Kovacevic 2423cd255ccfSMarko Kovacevic fips_test_write_one_case(); 24248b8546aaSGowrishankar Muthukrishnan } 2425cd255ccfSMarko Kovacevic 2426cd255ccfSMarko Kovacevic for (j = 0; j < AES_INTERN_ITER; j++) { 2427cd255ccfSMarko Kovacevic ret = fips_run_test(); 2428cd255ccfSMarko Kovacevic if (ret < 0) { 2429cd255ccfSMarko Kovacevic if (ret == -EPERM) { 243089be27e3SBrandon Lo if (info.file_type == FIPS_TYPE_JSON) 243189be27e3SBrandon Lo return ret; 243289be27e3SBrandon Lo 2433cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "Bypass\n"); 2434cd255ccfSMarko Kovacevic return 0; 2435cd255ccfSMarko Kovacevic } 2436cd255ccfSMarko Kovacevic 2437cd255ccfSMarko Kovacevic return ret; 2438cd255ccfSMarko Kovacevic } 2439cd255ccfSMarko Kovacevic 24408b8546aaSGowrishankar Muthukrishnan ret = get_writeback_data(&val[0]); 2441afda6b01SCiara Power if (ret < 0) 2442afda6b01SCiara Power return ret; 2443cd255ccfSMarko Kovacevic 2444cd255ccfSMarko Kovacevic if (info.op == FIPS_TEST_DEC_AUTH_VERIF) 2445cd255ccfSMarko Kovacevic memcpy(prev_in, vec.ct.val, AES_BLOCK_SIZE); 2446cd255ccfSMarko Kovacevic 2447cd255ccfSMarko Kovacevic if (j == 0) { 24488b8546aaSGowrishankar Muthukrishnan memcpy(prev_out, val[0].val, AES_BLOCK_SIZE); 24498b8546aaSGowrishankar Muthukrishnan memcpy(pt.val, vec.pt.val, pt.len); 24508b8546aaSGowrishankar Muthukrishnan memcpy(ct.val, vec.ct.val, ct.len); 24518b8546aaSGowrishankar Muthukrishnan memcpy(iv.val, vec.iv.val, iv.len); 2452cd255ccfSMarko Kovacevic 2453cd255ccfSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) { 24548b8546aaSGowrishankar Muthukrishnan memcpy(vec.pt.val, vec.iv.val, AES_BLOCK_SIZE); 24558b8546aaSGowrishankar Muthukrishnan memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE); 24568b8546aaSGowrishankar Muthukrishnan val[1].val = pt.val; 24578b8546aaSGowrishankar Muthukrishnan val[1].len = pt.len; 24588b8546aaSGowrishankar Muthukrishnan val[2].val = iv.val; 24598b8546aaSGowrishankar Muthukrishnan val[2].len = iv.len; 2460cd255ccfSMarko Kovacevic } else { 24618b8546aaSGowrishankar Muthukrishnan memcpy(vec.ct.val, vec.iv.val, AES_BLOCK_SIZE); 24628b8546aaSGowrishankar Muthukrishnan memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE); 24638b8546aaSGowrishankar Muthukrishnan val[1].val = ct.val; 24648b8546aaSGowrishankar Muthukrishnan val[1].len = ct.len; 24658b8546aaSGowrishankar Muthukrishnan val[2].val = iv.val; 24668b8546aaSGowrishankar Muthukrishnan val[2].len = iv.len; 2467cd255ccfSMarko Kovacevic } 2468cd255ccfSMarko Kovacevic continue; 2469cd255ccfSMarko Kovacevic } 2470cd255ccfSMarko Kovacevic 2471cd255ccfSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) { 24728b8546aaSGowrishankar Muthukrishnan memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE); 2473cd255ccfSMarko Kovacevic memcpy(vec.pt.val, prev_out, AES_BLOCK_SIZE); 2474cd255ccfSMarko Kovacevic } else { 2475cd255ccfSMarko Kovacevic memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE); 2476cd255ccfSMarko Kovacevic memcpy(vec.ct.val, prev_out, AES_BLOCK_SIZE); 2477cd255ccfSMarko Kovacevic } 2478cd255ccfSMarko Kovacevic 2479cd255ccfSMarko Kovacevic if (j == AES_INTERN_ITER - 1) 2480cd255ccfSMarko Kovacevic continue; 2481cd255ccfSMarko Kovacevic 24828b8546aaSGowrishankar Muthukrishnan memcpy(prev_out, val[0].val, AES_BLOCK_SIZE); 2483cd255ccfSMarko Kovacevic } 2484cd255ccfSMarko Kovacevic 24858b8546aaSGowrishankar Muthukrishnan info.parse_writeback(val); 24868b8546aaSGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) 2487cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "\n"); 2488cd255ccfSMarko Kovacevic 2489e9ec7f61SGowrishankar Muthukrishnan if (i == AES_EXTERN_ITER - 1) 2490cd255ccfSMarko Kovacevic continue; 2491cd255ccfSMarko Kovacevic 2492cd255ccfSMarko Kovacevic /** update key */ 2493cd255ccfSMarko Kovacevic memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key)); 2494cd255ccfSMarko Kovacevic for (k = 0; k < vec.cipher_auth.key.len; k++) { 2495cd255ccfSMarko Kovacevic switch (vec.cipher_auth.key.len) { 2496cd255ccfSMarko Kovacevic case 16: 24978b8546aaSGowrishankar Muthukrishnan val_key.val[k] ^= val[0].val[k]; 2498cd255ccfSMarko Kovacevic break; 2499cd255ccfSMarko Kovacevic case 24: 2500cd255ccfSMarko Kovacevic if (k < 8) 2501cd255ccfSMarko Kovacevic val_key.val[k] ^= prev_out[k + 8]; 2502cd255ccfSMarko Kovacevic else 25038b8546aaSGowrishankar Muthukrishnan val_key.val[k] ^= val[0].val[k - 8]; 2504cd255ccfSMarko Kovacevic break; 2505cd255ccfSMarko Kovacevic case 32: 2506cd255ccfSMarko Kovacevic if (k < 16) 2507cd255ccfSMarko Kovacevic val_key.val[k] ^= prev_out[k]; 2508cd255ccfSMarko Kovacevic else 25098b8546aaSGowrishankar Muthukrishnan val_key.val[k] ^= val[0].val[k - 16]; 2510cd255ccfSMarko Kovacevic break; 2511cd255ccfSMarko Kovacevic default: 2512cd255ccfSMarko Kovacevic return -1; 2513cd255ccfSMarko Kovacevic } 2514cd255ccfSMarko Kovacevic } 2515cd255ccfSMarko Kovacevic 2516cd255ccfSMarko Kovacevic if (info.op == FIPS_TEST_DEC_AUTH_VERIF) 25178b8546aaSGowrishankar Muthukrishnan memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE); 2518cd255ccfSMarko Kovacevic } 2519cd255ccfSMarko Kovacevic 25203d3408ddSGowrishankar Muthukrishnan rte_free(val[0].val); 25213d3408ddSGowrishankar Muthukrishnan rte_free(pt.val); 25223d3408ddSGowrishankar Muthukrishnan rte_free(ct.val); 25233d3408ddSGowrishankar Muthukrishnan rte_free(iv.val); 2524952e10cdSFan Zhang 2525cd255ccfSMarko Kovacevic return 0; 2526cd255ccfSMarko Kovacevic } 2527cd255ccfSMarko Kovacevic 2528cd255ccfSMarko Kovacevic static int 2529f4797baeSDamian Nowak fips_mct_sha_test(void) 2530f4797baeSDamian Nowak { 2531f4797baeSDamian Nowak #define SHA_EXTERN_ITER 100 2532f4797baeSDamian Nowak #define SHA_INTERN_ITER 1000 25331ea7940eSGowrishankar Muthukrishnan uint8_t md_blocks = info.interim_info.sha_data.md_blocks; 2534fc78f69dSGowrishankar Muthukrishnan struct fips_val val = {NULL, 0}; 25351ea7940eSGowrishankar Muthukrishnan struct fips_val md[md_blocks]; 2536f4797baeSDamian Nowak int ret; 25371ea7940eSGowrishankar Muthukrishnan uint32_t i, j, k, offset, max_outlen; 2538f4797baeSDamian Nowak 25391ea7940eSGowrishankar Muthukrishnan max_outlen = md_blocks * vec.cipher_auth.digest.len; 25401ea7940eSGowrishankar Muthukrishnan 25413d3408ddSGowrishankar Muthukrishnan rte_free(vec.cipher_auth.digest.val); 25423d3408ddSGowrishankar Muthukrishnan vec.cipher_auth.digest.val = rte_malloc(NULL, max_outlen, 0); 25431ea7940eSGowrishankar Muthukrishnan 2544ce7ced4eSGowrishankar Muthukrishnan if (vec.pt.val) 2545d5c24714SGowrishankar Muthukrishnan memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.cipher_auth.digest.len); 2546ce7ced4eSGowrishankar Muthukrishnan 2547f4797baeSDamian Nowak rte_free(vec.pt.val); 25481ea7940eSGowrishankar Muthukrishnan vec.pt.val = rte_malloc(NULL, (MAX_DIGEST_SIZE*md_blocks), 0); 25491ea7940eSGowrishankar Muthukrishnan 25501ea7940eSGowrishankar Muthukrishnan for (i = 0; i < md_blocks; i++) 25511ea7940eSGowrishankar Muthukrishnan md[i].val = rte_malloc(NULL, (MAX_DIGEST_SIZE*2), 0); 2552f4797baeSDamian Nowak 2553d5c24714SGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) { 2554f4797baeSDamian Nowak fips_test_write_one_case(); 2555f4797baeSDamian Nowak fprintf(info.fp_wr, "\n"); 2556d5c24714SGowrishankar Muthukrishnan } 2557f4797baeSDamian Nowak 2558f4797baeSDamian Nowak for (j = 0; j < SHA_EXTERN_ITER; j++) { 25591ea7940eSGowrishankar Muthukrishnan for (i = 0; i < md_blocks; i++) { 25601ea7940eSGowrishankar Muthukrishnan memcpy(md[i].val, vec.cipher_auth.digest.val, 2561f4797baeSDamian Nowak vec.cipher_auth.digest.len); 25621ea7940eSGowrishankar Muthukrishnan md[i].len = vec.cipher_auth.digest.len; 25631ea7940eSGowrishankar Muthukrishnan } 2564d5c24714SGowrishankar Muthukrishnan 2565f4797baeSDamian Nowak for (i = 0; i < (SHA_INTERN_ITER); i++) { 25661ea7940eSGowrishankar Muthukrishnan offset = 0; 25671ea7940eSGowrishankar Muthukrishnan for (k = 0; k < md_blocks; k++) { 25681ea7940eSGowrishankar Muthukrishnan memcpy(vec.pt.val + offset, md[k].val, (size_t)md[k].len); 25691ea7940eSGowrishankar Muthukrishnan offset += md[k].len; 25701ea7940eSGowrishankar Muthukrishnan } 25711ea7940eSGowrishankar Muthukrishnan vec.pt.len = offset; 2572f4797baeSDamian Nowak 2573f4797baeSDamian Nowak ret = fips_run_test(); 2574f4797baeSDamian Nowak if (ret < 0) { 25758a40ff39SArchana Muniganti if (ret == -EPERM || ret == -ENOTSUP) { 257689be27e3SBrandon Lo if (info.file_type == FIPS_TYPE_JSON) 257789be27e3SBrandon Lo return ret; 257889be27e3SBrandon Lo 2579f4797baeSDamian Nowak fprintf(info.fp_wr, "Bypass\n\n"); 2580f4797baeSDamian Nowak return 0; 2581f4797baeSDamian Nowak } 2582f4797baeSDamian Nowak return ret; 2583f4797baeSDamian Nowak } 2584f4797baeSDamian Nowak 2585fc78f69dSGowrishankar Muthukrishnan ret = get_writeback_data(&val); 2586afda6b01SCiara Power if (ret < 0) 2587afda6b01SCiara Power return ret; 2588f4797baeSDamian Nowak 25891ea7940eSGowrishankar Muthukrishnan for (k = 1; k < md_blocks; k++) { 25901ea7940eSGowrishankar Muthukrishnan memcpy(md[k-1].val, md[k].val, md[k].len); 25911ea7940eSGowrishankar Muthukrishnan md[k-1].len = md[k].len; 2592f4797baeSDamian Nowak } 2593f4797baeSDamian Nowak 25941ea7940eSGowrishankar Muthukrishnan memcpy(md[md_blocks-1].val, (val.val + vec.pt.len), 25951ea7940eSGowrishankar Muthukrishnan vec.cipher_auth.digest.len); 25961ea7940eSGowrishankar Muthukrishnan md[md_blocks-1].len = vec.cipher_auth.digest.len; 25971ea7940eSGowrishankar Muthukrishnan } 25981ea7940eSGowrishankar Muthukrishnan 25991ea7940eSGowrishankar Muthukrishnan memcpy(vec.cipher_auth.digest.val, md[md_blocks-1].val, md[md_blocks-1].len); 26001ea7940eSGowrishankar Muthukrishnan vec.cipher_auth.digest.len = md[md_blocks-1].len; 2601f4797baeSDamian Nowak 2602ce7ced4eSGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) 2603f4797baeSDamian Nowak fprintf(info.fp_wr, "COUNT = %u\n", j); 2604ce7ced4eSGowrishankar Muthukrishnan 2605fc78f69dSGowrishankar Muthukrishnan info.parse_writeback(&val); 2606ce7ced4eSGowrishankar Muthukrishnan 2607ce7ced4eSGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) 2608ce7ced4eSGowrishankar Muthukrishnan fprintf(info.fp_wr, "\n"); 2609d5c24714SGowrishankar Muthukrishnan } 2610f4797baeSDamian Nowak 26111ea7940eSGowrishankar Muthukrishnan for (i = 0; i < (md_blocks); i++) 2612f4797baeSDamian Nowak rte_free(md[i].val); 2613f4797baeSDamian Nowak 2614f4797baeSDamian Nowak rte_free(vec.pt.val); 2615f4797baeSDamian Nowak 26163d3408ddSGowrishankar Muthukrishnan rte_free(val.val); 2617f4797baeSDamian Nowak return 0; 2618f4797baeSDamian Nowak } 2619f4797baeSDamian Nowak 2620225f04fbSGowrishankar Muthukrishnan static int 2621225f04fbSGowrishankar Muthukrishnan fips_mct_shake_test(void) 2622225f04fbSGowrishankar Muthukrishnan { 2623225f04fbSGowrishankar Muthukrishnan #define SHAKE_EXTERN_ITER 100 2624225f04fbSGowrishankar Muthukrishnan #define SHAKE_INTERN_ITER 1000 2625225f04fbSGowrishankar Muthukrishnan uint32_t i, j, range, outlen, max_outlen; 2626225f04fbSGowrishankar Muthukrishnan struct fips_val val = {NULL, 0}, md; 2627225f04fbSGowrishankar Muthukrishnan uint8_t rightmost[2]; 2628225f04fbSGowrishankar Muthukrishnan uint16_t *rightptr; 2629225f04fbSGowrishankar Muthukrishnan int ret; 2630225f04fbSGowrishankar Muthukrishnan 2631225f04fbSGowrishankar Muthukrishnan max_outlen = vec.cipher_auth.digest.len; 2632225f04fbSGowrishankar Muthukrishnan 26333d3408ddSGowrishankar Muthukrishnan rte_free(vec.cipher_auth.digest.val); 26343d3408ddSGowrishankar Muthukrishnan vec.cipher_auth.digest.val = rte_malloc(NULL, max_outlen, 0); 2635225f04fbSGowrishankar Muthukrishnan 2636225f04fbSGowrishankar Muthukrishnan if (vec.pt.val) 2637225f04fbSGowrishankar Muthukrishnan memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.pt.len); 2638225f04fbSGowrishankar Muthukrishnan 2639225f04fbSGowrishankar Muthukrishnan rte_free(vec.pt.val); 2640225f04fbSGowrishankar Muthukrishnan vec.pt.val = rte_malloc(NULL, 16, 0); 2641225f04fbSGowrishankar Muthukrishnan vec.pt.len = 16; 2642225f04fbSGowrishankar Muthukrishnan 2643225f04fbSGowrishankar Muthukrishnan md.val = rte_malloc(NULL, max_outlen, 0); 2644225f04fbSGowrishankar Muthukrishnan md.len = max_outlen; 2645225f04fbSGowrishankar Muthukrishnan 2646225f04fbSGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) { 2647225f04fbSGowrishankar Muthukrishnan fips_test_write_one_case(); 2648225f04fbSGowrishankar Muthukrishnan fprintf(info.fp_wr, "\n"); 2649225f04fbSGowrishankar Muthukrishnan } 2650225f04fbSGowrishankar Muthukrishnan 2651225f04fbSGowrishankar Muthukrishnan range = max_outlen - info.interim_info.sha_data.min_outlen + 1; 2652225f04fbSGowrishankar Muthukrishnan outlen = max_outlen; 2653225f04fbSGowrishankar Muthukrishnan for (j = 0; j < SHAKE_EXTERN_ITER; j++) { 2654225f04fbSGowrishankar Muthukrishnan memset(md.val, 0, max_outlen); 2655225f04fbSGowrishankar Muthukrishnan memcpy(md.val, vec.cipher_auth.digest.val, 2656225f04fbSGowrishankar Muthukrishnan vec.cipher_auth.digest.len); 2657225f04fbSGowrishankar Muthukrishnan 2658225f04fbSGowrishankar Muthukrishnan for (i = 0; i < (SHAKE_INTERN_ITER); i++) { 2659225f04fbSGowrishankar Muthukrishnan memset(vec.pt.val, 0, vec.pt.len); 2660225f04fbSGowrishankar Muthukrishnan memcpy(vec.pt.val, md.val, vec.pt.len); 2661225f04fbSGowrishankar Muthukrishnan vec.cipher_auth.digest.len = outlen; 2662225f04fbSGowrishankar Muthukrishnan ret = fips_run_test(); 2663225f04fbSGowrishankar Muthukrishnan if (ret < 0) { 2664225f04fbSGowrishankar Muthukrishnan if (ret == -EPERM || ret == -ENOTSUP) { 2665225f04fbSGowrishankar Muthukrishnan if (info.file_type == FIPS_TYPE_JSON) 2666225f04fbSGowrishankar Muthukrishnan return ret; 2667225f04fbSGowrishankar Muthukrishnan 2668225f04fbSGowrishankar Muthukrishnan fprintf(info.fp_wr, "Bypass\n\n"); 2669225f04fbSGowrishankar Muthukrishnan return 0; 2670225f04fbSGowrishankar Muthukrishnan } 2671225f04fbSGowrishankar Muthukrishnan return ret; 2672225f04fbSGowrishankar Muthukrishnan } 2673225f04fbSGowrishankar Muthukrishnan 2674225f04fbSGowrishankar Muthukrishnan ret = get_writeback_data(&val); 2675225f04fbSGowrishankar Muthukrishnan if (ret < 0) 2676225f04fbSGowrishankar Muthukrishnan return ret; 2677225f04fbSGowrishankar Muthukrishnan 2678225f04fbSGowrishankar Muthukrishnan memset(md.val, 0, max_outlen); 2679225f04fbSGowrishankar Muthukrishnan memcpy(md.val, (val.val + vec.pt.len), 2680225f04fbSGowrishankar Muthukrishnan vec.cipher_auth.digest.len); 2681225f04fbSGowrishankar Muthukrishnan md.len = outlen; 2682225f04fbSGowrishankar Muthukrishnan rightmost[0] = md.val[md.len-1]; 2683225f04fbSGowrishankar Muthukrishnan rightmost[1] = md.val[md.len-2]; 2684225f04fbSGowrishankar Muthukrishnan rightptr = (uint16_t *)rightmost; 2685225f04fbSGowrishankar Muthukrishnan outlen = info.interim_info.sha_data.min_outlen + 2686225f04fbSGowrishankar Muthukrishnan (*rightptr % range); 2687225f04fbSGowrishankar Muthukrishnan } 2688225f04fbSGowrishankar Muthukrishnan 2689225f04fbSGowrishankar Muthukrishnan memcpy(vec.cipher_auth.digest.val, md.val, md.len); 2690225f04fbSGowrishankar Muthukrishnan vec.cipher_auth.digest.len = md.len; 2691225f04fbSGowrishankar Muthukrishnan 2692225f04fbSGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) 2693225f04fbSGowrishankar Muthukrishnan fprintf(info.fp_wr, "COUNT = %u\n", j); 2694225f04fbSGowrishankar Muthukrishnan 2695225f04fbSGowrishankar Muthukrishnan info.parse_writeback(&val); 2696225f04fbSGowrishankar Muthukrishnan 2697225f04fbSGowrishankar Muthukrishnan if (info.file_type != FIPS_TYPE_JSON) 2698225f04fbSGowrishankar Muthukrishnan fprintf(info.fp_wr, "\n"); 2699225f04fbSGowrishankar Muthukrishnan } 2700225f04fbSGowrishankar Muthukrishnan 2701225f04fbSGowrishankar Muthukrishnan rte_free(md.val); 2702225f04fbSGowrishankar Muthukrishnan rte_free(vec.pt.val); 27033d3408ddSGowrishankar Muthukrishnan rte_free(val.val); 2704225f04fbSGowrishankar Muthukrishnan return 0; 2705225f04fbSGowrishankar Muthukrishnan } 2706f4797baeSDamian Nowak 2707f4797baeSDamian Nowak static int 2708cd255ccfSMarko Kovacevic init_test_ops(void) 2709cd255ccfSMarko Kovacevic { 2710cd255ccfSMarko Kovacevic switch (info.algo) { 271175777166SGowrishankar Muthukrishnan case FIPS_TEST_ALGO_AES_CBC: 2712c8956fd2SBrian Dooley case FIPS_TEST_ALGO_AES_CTR: 2713cd255ccfSMarko Kovacevic case FIPS_TEST_ALGO_AES: 271436128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_cipher_op; 271536128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_aes_xform; 2716cd255ccfSMarko Kovacevic if (info.interim_info.aes_data.test_type == AESAVS_TYPE_MCT) 2717cd255ccfSMarko Kovacevic test_ops.test = fips_mct_aes_test; 2718cd255ccfSMarko Kovacevic else 2719cd255ccfSMarko Kovacevic test_ops.test = fips_generic_test; 2720cd255ccfSMarko Kovacevic break; 2721f64adb67SMarko Kovacevic case FIPS_TEST_ALGO_HMAC: 272236128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_auth_op; 272336128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_hmac_xform; 2724f64adb67SMarko Kovacevic test_ops.test = fips_generic_test; 2725f64adb67SMarko Kovacevic break; 2726527cbf3dSMarko Kovacevic case FIPS_TEST_ALGO_TDES: 272736128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_cipher_op; 272836128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_tdes_xform; 2729527cbf3dSMarko Kovacevic if (info.interim_info.tdes_data.test_type == TDES_MCT) 2730527cbf3dSMarko Kovacevic test_ops.test = fips_mct_tdes_test; 2731527cbf3dSMarko Kovacevic else 2732527cbf3dSMarko Kovacevic test_ops.test = fips_generic_test; 2733527cbf3dSMarko Kovacevic break; 2734e27268bdSBrian Dooley case FIPS_TEST_ALGO_AES_GMAC: 273536128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_auth_op; 273636128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_gmac_xform; 2737e27268bdSBrian Dooley test_ops.test = fips_generic_test; 2738e27268bdSBrian Dooley break; 27394aaad299SMarko Kovacevic case FIPS_TEST_ALGO_AES_GCM: 274036128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_aead_op; 274136128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_gcm_xform; 27424aaad299SMarko Kovacevic test_ops.test = fips_generic_test; 27434aaad299SMarko Kovacevic break; 2744ac026f46SMarko Kovacevic case FIPS_TEST_ALGO_AES_CMAC: 274536128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_auth_op; 274636128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_cmac_xform; 2747ac026f46SMarko Kovacevic test_ops.test = fips_generic_test; 2748ac026f46SMarko Kovacevic break; 2749305921f4SMarko Kovacevic case FIPS_TEST_ALGO_AES_CCM: 275036128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_aead_op; 275136128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_ccm_xform; 2752305921f4SMarko Kovacevic test_ops.test = fips_generic_test; 2753305921f4SMarko Kovacevic break; 2754f4797baeSDamian Nowak case FIPS_TEST_ALGO_SHA: 275536128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_auth_op; 275636128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_sha_xform; 2757f4797baeSDamian Nowak if (info.interim_info.sha_data.test_type == SHA_MCT) 2758225f04fbSGowrishankar Muthukrishnan if (info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_128 || 2759225f04fbSGowrishankar Muthukrishnan info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_256) 2760225f04fbSGowrishankar Muthukrishnan test_ops.test = fips_mct_shake_test; 2761225f04fbSGowrishankar Muthukrishnan else 2762f4797baeSDamian Nowak test_ops.test = fips_mct_sha_test; 2763f4797baeSDamian Nowak else 2764f4797baeSDamian Nowak test_ops.test = fips_generic_test; 2765f4797baeSDamian Nowak break; 2766d5a9ea55SSucharitha Sarananaga case FIPS_TEST_ALGO_AES_XTS: 276736128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_cipher_op; 276836128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_xts_xform; 276936128a67SGowrishankar Muthukrishnan test_ops.test = fips_generic_test; 277036128a67SGowrishankar Muthukrishnan break; 277136128a67SGowrishankar Muthukrishnan case FIPS_TEST_ALGO_RSA: 277236128a67SGowrishankar Muthukrishnan test_ops.prepare_asym_op = prepare_rsa_op; 277336128a67SGowrishankar Muthukrishnan test_ops.prepare_asym_xform = prepare_rsa_xform; 2774d5a9ea55SSucharitha Sarananaga test_ops.test = fips_generic_test; 2775d5a9ea55SSucharitha Sarananaga break; 2776b455d261SGowrishankar Muthukrishnan case FIPS_TEST_ALGO_ECDSA: 2777b455d261SGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_KEYGEN) { 2778b455d261SGowrishankar Muthukrishnan test_ops.prepare_asym_op = prepare_ecfpm_op; 2779b455d261SGowrishankar Muthukrishnan test_ops.prepare_asym_xform = prepare_ecfpm_xform; 2780b455d261SGowrishankar Muthukrishnan test_ops.test = fips_generic_test; 2781b455d261SGowrishankar Muthukrishnan } else { 2782b455d261SGowrishankar Muthukrishnan test_ops.prepare_asym_op = prepare_ecdsa_op; 2783b455d261SGowrishankar Muthukrishnan test_ops.prepare_asym_xform = prepare_ecdsa_xform; 2784b455d261SGowrishankar Muthukrishnan test_ops.test = fips_generic_test; 2785b455d261SGowrishankar Muthukrishnan } 2786b455d261SGowrishankar Muthukrishnan break; 278712ede9acSGowrishankar Muthukrishnan case FIPS_TEST_ALGO_EDDSA: 278812ede9acSGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_KEYGEN) { 278912ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_op = prepare_edfpm_op; 279012ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_xform = prepare_edfpm_xform; 279112ede9acSGowrishankar Muthukrishnan test_ops.test = fips_generic_test; 279212ede9acSGowrishankar Muthukrishnan } else { 279312ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_op = prepare_eddsa_op; 279412ede9acSGowrishankar Muthukrishnan test_ops.prepare_asym_xform = prepare_eddsa_xform; 279512ede9acSGowrishankar Muthukrishnan test_ops.test = fips_generic_test; 279612ede9acSGowrishankar Muthukrishnan } 279712ede9acSGowrishankar Muthukrishnan break; 2798cd255ccfSMarko Kovacevic default: 2799efe3a8dbSMichael Shamis if (strstr(info.file_name, "TECB") || 2800efe3a8dbSMichael Shamis strstr(info.file_name, "TCBC")) { 2801efe3a8dbSMichael Shamis info.algo = FIPS_TEST_ALGO_TDES; 280236128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_op = prepare_cipher_op; 280336128a67SGowrishankar Muthukrishnan test_ops.prepare_sym_xform = prepare_tdes_xform; 2804efe3a8dbSMichael Shamis if (info.interim_info.tdes_data.test_type == TDES_MCT) 2805efe3a8dbSMichael Shamis test_ops.test = fips_mct_tdes_test; 2806efe3a8dbSMichael Shamis else 2807efe3a8dbSMichael Shamis test_ops.test = fips_generic_test; 2808efe3a8dbSMichael Shamis break; 2809efe3a8dbSMichael Shamis } 2810cd255ccfSMarko Kovacevic return -1; 2811cd255ccfSMarko Kovacevic } 2812cd255ccfSMarko Kovacevic 2813cd255ccfSMarko Kovacevic return 0; 2814cd255ccfSMarko Kovacevic } 2815cd255ccfSMarko Kovacevic 28163d0fad56SMarko Kovacevic static void 28173d0fad56SMarko Kovacevic print_test_block(void) 28183d0fad56SMarko Kovacevic { 28193d0fad56SMarko Kovacevic uint32_t i; 28203d0fad56SMarko Kovacevic 28213d0fad56SMarko Kovacevic for (i = 0; i < info.nb_vec_lines; i++) 28223d0fad56SMarko Kovacevic printf("%s\n", info.vec[i]); 28233d0fad56SMarko Kovacevic 28243d0fad56SMarko Kovacevic printf("\n"); 28253d0fad56SMarko Kovacevic } 28263d0fad56SMarko Kovacevic 28273d0fad56SMarko Kovacevic static int 28283d0fad56SMarko Kovacevic fips_test_one_file(void) 28293d0fad56SMarko Kovacevic { 28303d0fad56SMarko Kovacevic int fetch_ret = 0, ret; 28313d0fad56SMarko Kovacevic 2832cd255ccfSMarko Kovacevic ret = init_test_ops(); 2833cd255ccfSMarko Kovacevic if (ret < 0) { 2834cd255ccfSMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Init test op\n", ret); 2835cd255ccfSMarko Kovacevic return ret; 2836cd255ccfSMarko Kovacevic } 2837cd255ccfSMarko Kovacevic 2838cd255ccfSMarko Kovacevic while (ret >= 0 && fetch_ret == 0) { 28393d0fad56SMarko Kovacevic fetch_ret = fips_test_fetch_one_block(); 28403d0fad56SMarko Kovacevic if (fetch_ret < 0) { 28413d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Fetch block\n", 28423d0fad56SMarko Kovacevic fetch_ret); 28433d0fad56SMarko Kovacevic ret = fetch_ret; 28443d0fad56SMarko Kovacevic goto error_one_case; 28453d0fad56SMarko Kovacevic } 28463d0fad56SMarko Kovacevic 28473d0fad56SMarko Kovacevic if (info.nb_vec_lines == 0) { 28483d0fad56SMarko Kovacevic if (fetch_ret == -EOF) 28493d0fad56SMarko Kovacevic break; 28503d0fad56SMarko Kovacevic 28513d0fad56SMarko Kovacevic fprintf(info.fp_wr, "\n"); 28523d0fad56SMarko Kovacevic continue; 28533d0fad56SMarko Kovacevic } 28543d0fad56SMarko Kovacevic 28553d0fad56SMarko Kovacevic ret = fips_test_parse_one_case(); 28563d0fad56SMarko Kovacevic switch (ret) { 28573d0fad56SMarko Kovacevic case 0: 2858cd255ccfSMarko Kovacevic ret = test_ops.test(); 28593d0fad56SMarko Kovacevic if (ret == 0) 28603d0fad56SMarko Kovacevic break; 28613d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: test block\n", 28623d0fad56SMarko Kovacevic ret); 28633d0fad56SMarko Kovacevic goto error_one_case; 28643d0fad56SMarko Kovacevic case 1: 28653d0fad56SMarko Kovacevic break; 28663d0fad56SMarko Kovacevic default: 28673d0fad56SMarko Kovacevic RTE_LOG(ERR, USER1, "Error %i: Parse block\n", 28683d0fad56SMarko Kovacevic ret); 28693d0fad56SMarko Kovacevic goto error_one_case; 28703d0fad56SMarko Kovacevic } 28713d0fad56SMarko Kovacevic 28723d0fad56SMarko Kovacevic continue; 28733d0fad56SMarko Kovacevic error_one_case: 28743d0fad56SMarko Kovacevic print_test_block(); 28753d0fad56SMarko Kovacevic } 28763d0fad56SMarko Kovacevic 28773d0fad56SMarko Kovacevic fips_test_clear(); 28783d0fad56SMarko Kovacevic 287915bb59a5SCiara Power if (env.digest) { 2880952e10cdSFan Zhang rte_free(env.digest); 288115bb59a5SCiara Power env.digest = NULL; 288294dfc563SSamina Arshad env.digest_len = 0; 288315bb59a5SCiara Power } 2884952e10cdSFan Zhang rte_pktmbuf_free(env.mbuf); 2885cd255ccfSMarko Kovacevic 2886952e10cdSFan Zhang return ret; 28873d0fad56SMarko Kovacevic } 288889be27e3SBrandon Lo 28898d70a194SDavid Marchand #ifdef USE_JANSSON 289089be27e3SBrandon Lo static int 289189be27e3SBrandon Lo fips_test_json_init_writeback(void) 289289be27e3SBrandon Lo { 289389be27e3SBrandon Lo json_t *session_info, *session_write; 289489be27e3SBrandon Lo session_info = json_array_get(json_info.json_root, 0); 289589be27e3SBrandon Lo session_write = json_object(); 289689be27e3SBrandon Lo json_info.json_write_root = json_array(); 289789be27e3SBrandon Lo 289889be27e3SBrandon Lo json_object_set(session_write, "jwt", 289989be27e3SBrandon Lo json_object_get(session_info, "jwt")); 290089be27e3SBrandon Lo json_object_set(session_write, "url", 290189be27e3SBrandon Lo json_object_get(session_info, "url")); 290289be27e3SBrandon Lo json_object_set(session_write, "isSample", 290389be27e3SBrandon Lo json_object_get(session_info, "isSample")); 290489be27e3SBrandon Lo 290589be27e3SBrandon Lo json_info.is_sample = json_boolean_value( 290689be27e3SBrandon Lo json_object_get(session_info, "isSample")); 290789be27e3SBrandon Lo 290889be27e3SBrandon Lo json_array_append_new(json_info.json_write_root, session_write); 290989be27e3SBrandon Lo return 0; 291089be27e3SBrandon Lo } 291189be27e3SBrandon Lo 291289be27e3SBrandon Lo static int 291389be27e3SBrandon Lo fips_test_one_test_case(void) 291489be27e3SBrandon Lo { 291589be27e3SBrandon Lo int ret; 291689be27e3SBrandon Lo 291789be27e3SBrandon Lo ret = fips_test_parse_one_json_case(); 291889be27e3SBrandon Lo 291989be27e3SBrandon Lo switch (ret) { 292089be27e3SBrandon Lo case 0: 292189be27e3SBrandon Lo ret = test_ops.test(); 292289be27e3SBrandon Lo if ((ret == 0) || (ret == -EPERM || ret == -ENOTSUP)) 292389be27e3SBrandon Lo break; 292489be27e3SBrandon Lo RTE_LOG(ERR, USER1, "Error %i: test block\n", 292589be27e3SBrandon Lo ret); 292689be27e3SBrandon Lo break; 292789be27e3SBrandon Lo default: 292889be27e3SBrandon Lo RTE_LOG(ERR, USER1, "Error %i: Parse block\n", 292989be27e3SBrandon Lo ret); 293089be27e3SBrandon Lo } 293189be27e3SBrandon Lo return ret; 293289be27e3SBrandon Lo } 293389be27e3SBrandon Lo 293489be27e3SBrandon Lo static int 293589be27e3SBrandon Lo fips_test_one_test_group(void) 293689be27e3SBrandon Lo { 293789be27e3SBrandon Lo int ret; 293889be27e3SBrandon Lo json_t *tests, *write_tests; 293989be27e3SBrandon Lo size_t test_idx, tests_size; 294089be27e3SBrandon Lo 294189be27e3SBrandon Lo write_tests = json_array(); 294289be27e3SBrandon Lo json_info.json_write_group = json_object(); 294389be27e3SBrandon Lo json_object_set(json_info.json_write_group, "tgId", 294489be27e3SBrandon Lo json_object_get(json_info.json_test_group, "tgId")); 294589be27e3SBrandon Lo json_object_set_new(json_info.json_write_group, "tests", write_tests); 294689be27e3SBrandon Lo 294789be27e3SBrandon Lo switch (info.algo) { 2948e27268bdSBrian Dooley case FIPS_TEST_ALGO_AES_GMAC: 294989be27e3SBrandon Lo case FIPS_TEST_ALGO_AES_GCM: 2950b09aac2dSBrandon Lo ret = parse_test_gcm_json_init(); 295189be27e3SBrandon Lo break; 295255a7050eSGowrishankar Muthukrishnan case FIPS_TEST_ALGO_AES_CCM: 295355a7050eSGowrishankar Muthukrishnan ret = parse_test_ccm_json_init(); 295455a7050eSGowrishankar Muthukrishnan break; 2955443c93d8SBrandon Lo case FIPS_TEST_ALGO_HMAC: 2956443c93d8SBrandon Lo ret = parse_test_hmac_json_init(); 2957443c93d8SBrandon Lo break; 295807da56a6SBrandon Lo case FIPS_TEST_ALGO_AES_CMAC: 295907da56a6SBrandon Lo ret = parse_test_cmac_json_init(); 296007da56a6SBrandon Lo break; 2961f8e431edSGowrishankar Muthukrishnan case FIPS_TEST_ALGO_AES_XTS: 2962f8e431edSGowrishankar Muthukrishnan ret = parse_test_xts_json_init(); 2963f8e431edSGowrishankar Muthukrishnan break; 2964f8e431edSGowrishankar Muthukrishnan case FIPS_TEST_ALGO_AES_CBC: 2965c8956fd2SBrian Dooley case FIPS_TEST_ALGO_AES_CTR: 29668b8546aaSGowrishankar Muthukrishnan case FIPS_TEST_ALGO_AES: 29678b8546aaSGowrishankar Muthukrishnan ret = parse_test_aes_json_init(); 29688b8546aaSGowrishankar Muthukrishnan break; 2969d5c24714SGowrishankar Muthukrishnan case FIPS_TEST_ALGO_SHA: 2970d5c24714SGowrishankar Muthukrishnan ret = parse_test_sha_json_init(); 2971d5c24714SGowrishankar Muthukrishnan break; 297264569ffaSGowrishankar Muthukrishnan case FIPS_TEST_ALGO_TDES: 297364569ffaSGowrishankar Muthukrishnan ret = parse_test_tdes_json_init(); 297464569ffaSGowrishankar Muthukrishnan break; 297536128a67SGowrishankar Muthukrishnan case FIPS_TEST_ALGO_RSA: 297636128a67SGowrishankar Muthukrishnan ret = parse_test_rsa_json_init(); 297736128a67SGowrishankar Muthukrishnan break; 2978b455d261SGowrishankar Muthukrishnan case FIPS_TEST_ALGO_ECDSA: 2979b455d261SGowrishankar Muthukrishnan ret = parse_test_ecdsa_json_init(); 2980b455d261SGowrishankar Muthukrishnan break; 298112ede9acSGowrishankar Muthukrishnan case FIPS_TEST_ALGO_EDDSA: 298212ede9acSGowrishankar Muthukrishnan ret = parse_test_eddsa_json_init(); 298312ede9acSGowrishankar Muthukrishnan break; 298489be27e3SBrandon Lo default: 298589be27e3SBrandon Lo return -EINVAL; 298689be27e3SBrandon Lo } 2987b09aac2dSBrandon Lo 298889be27e3SBrandon Lo if (ret < 0) 298989be27e3SBrandon Lo return ret; 299089be27e3SBrandon Lo 299189be27e3SBrandon Lo ret = fips_test_parse_one_json_group(); 299289be27e3SBrandon Lo if (ret < 0) 299389be27e3SBrandon Lo return ret; 299489be27e3SBrandon Lo 299589be27e3SBrandon Lo ret = init_test_ops(); 299689be27e3SBrandon Lo if (ret < 0) 299789be27e3SBrandon Lo return ret; 299889be27e3SBrandon Lo 299989be27e3SBrandon Lo tests = json_object_get(json_info.json_test_group, "tests"); 300089be27e3SBrandon Lo tests_size = json_array_size(tests); 300189be27e3SBrandon Lo for (test_idx = 0; test_idx < tests_size; test_idx++) { 300289be27e3SBrandon Lo json_info.json_test_case = json_array_get(tests, test_idx); 300389be27e3SBrandon Lo if (fips_test_one_test_case() == 0) 300489be27e3SBrandon Lo json_array_append_new(write_tests, json_info.json_write_case); 300589be27e3SBrandon Lo } 300689be27e3SBrandon Lo 300789be27e3SBrandon Lo return 0; 300889be27e3SBrandon Lo } 300989be27e3SBrandon Lo 301089be27e3SBrandon Lo static int 301189be27e3SBrandon Lo fips_test_one_vector_set(void) 301289be27e3SBrandon Lo { 301389be27e3SBrandon Lo int ret; 3014b455d261SGowrishankar Muthukrishnan json_t *test_groups, *write_groups, *write_version, *write_set, *mode; 301589be27e3SBrandon Lo size_t group_idx, num_groups; 301689be27e3SBrandon Lo 301789be27e3SBrandon Lo test_groups = json_object_get(json_info.json_vector_set, "testGroups"); 301889be27e3SBrandon Lo num_groups = json_array_size(test_groups); 301989be27e3SBrandon Lo 302089be27e3SBrandon Lo json_info.json_write_set = json_array(); 302189be27e3SBrandon Lo write_version = json_object(); 302289be27e3SBrandon Lo json_object_set_new(write_version, "acvVersion", json_string(ACVVERSION)); 302389be27e3SBrandon Lo json_array_append_new(json_info.json_write_set, write_version); 302489be27e3SBrandon Lo 302589be27e3SBrandon Lo write_set = json_object(); 302689be27e3SBrandon Lo json_array_append(json_info.json_write_set, write_set); 302789be27e3SBrandon Lo write_groups = json_array(); 302889be27e3SBrandon Lo 302989be27e3SBrandon Lo json_object_set(write_set, "vsId", 303089be27e3SBrandon Lo json_object_get(json_info.json_vector_set, "vsId")); 303189be27e3SBrandon Lo json_object_set(write_set, "algorithm", 303289be27e3SBrandon Lo json_object_get(json_info.json_vector_set, "algorithm")); 3033b455d261SGowrishankar Muthukrishnan mode = json_object_get(json_info.json_vector_set, "mode"); 3034b455d261SGowrishankar Muthukrishnan if (mode != NULL) 3035b455d261SGowrishankar Muthukrishnan json_object_set_new(write_set, "mode", mode); 3036b455d261SGowrishankar Muthukrishnan 303789be27e3SBrandon Lo json_object_set(write_set, "revision", 303889be27e3SBrandon Lo json_object_get(json_info.json_vector_set, "revision")); 303989be27e3SBrandon Lo json_object_set_new(write_set, "isSample", 304089be27e3SBrandon Lo json_boolean(json_info.is_sample)); 304189be27e3SBrandon Lo json_object_set_new(write_set, "testGroups", write_groups); 304289be27e3SBrandon Lo 304389be27e3SBrandon Lo ret = fips_test_parse_one_json_vector_set(); 304489be27e3SBrandon Lo if (ret < 0) { 304589be27e3SBrandon Lo RTE_LOG(ERR, USER1, "Error: Unsupported or invalid vector set algorithm: %s\n", 304689be27e3SBrandon Lo json_string_value(json_object_get(json_info.json_vector_set, "algorithm"))); 304789be27e3SBrandon Lo return ret; 304889be27e3SBrandon Lo } 304989be27e3SBrandon Lo 305089be27e3SBrandon Lo for (group_idx = 0; group_idx < num_groups; group_idx++) { 305189be27e3SBrandon Lo json_info.json_test_group = json_array_get(test_groups, group_idx); 305289be27e3SBrandon Lo ret = fips_test_one_test_group(); 305389be27e3SBrandon Lo json_array_append_new(write_groups, json_info.json_write_group); 305489be27e3SBrandon Lo } 305589be27e3SBrandon Lo 305689be27e3SBrandon Lo return 0; 305789be27e3SBrandon Lo } 305889be27e3SBrandon Lo 305989be27e3SBrandon Lo static int 306089be27e3SBrandon Lo fips_test_one_json_file(void) 306189be27e3SBrandon Lo { 306289be27e3SBrandon Lo size_t vector_set_idx, root_size; 306389be27e3SBrandon Lo 306489be27e3SBrandon Lo root_size = json_array_size(json_info.json_root); 306589be27e3SBrandon Lo fips_test_json_init_writeback(); 306689be27e3SBrandon Lo 306789be27e3SBrandon Lo for (vector_set_idx = 1; vector_set_idx < root_size; vector_set_idx++) { 306889be27e3SBrandon Lo /* Vector set index starts at 1, the 0th index contains test session 306989be27e3SBrandon Lo * information. 307089be27e3SBrandon Lo */ 307189be27e3SBrandon Lo json_info.json_vector_set = json_array_get(json_info.json_root, vector_set_idx); 307289be27e3SBrandon Lo fips_test_one_vector_set(); 307389be27e3SBrandon Lo json_array_append_new(json_info.json_write_root, json_info.json_write_set); 3074d5c24714SGowrishankar Muthukrishnan json_incref(json_info.json_write_set); 307589be27e3SBrandon Lo } 307689be27e3SBrandon Lo 307789be27e3SBrandon Lo json_dumpf(json_info.json_write_root, info.fp_wr, JSON_INDENT(4)); 307889be27e3SBrandon Lo json_decref(json_info.json_write_root); 307989be27e3SBrandon Lo 308089be27e3SBrandon Lo return 0; 308189be27e3SBrandon Lo } 30828d70a194SDavid Marchand #endif /* USE_JANSSON */ 3083