1b455d261SGowrishankar Muthukrishnan /* SPDX-License-Identifier: BSD-3-Clause 2b455d261SGowrishankar Muthukrishnan * Copyright(C) 2022 Marvell. 3b455d261SGowrishankar Muthukrishnan */ 4b455d261SGowrishankar Muthukrishnan 5b455d261SGowrishankar Muthukrishnan #include <string.h> 6b455d261SGowrishankar Muthukrishnan #include <time.h> 7b455d261SGowrishankar Muthukrishnan #include <stdio.h> 8b455d261SGowrishankar Muthukrishnan #include <sys/types.h> 9b455d261SGowrishankar Muthukrishnan #include <unistd.h> 10b455d261SGowrishankar Muthukrishnan 11b455d261SGowrishankar Muthukrishnan #ifdef USE_OPENSSL 12b455d261SGowrishankar Muthukrishnan #include <openssl/bn.h> 13b455d261SGowrishankar Muthukrishnan #include <openssl/rand.h> 14b455d261SGowrishankar Muthukrishnan #endif /* USE_OPENSSL */ 15b455d261SGowrishankar Muthukrishnan 16b455d261SGowrishankar Muthukrishnan #include <rte_cryptodev.h> 17b455d261SGowrishankar Muthukrishnan #include <rte_malloc.h> 18b455d261SGowrishankar Muthukrishnan 19b455d261SGowrishankar Muthukrishnan #include "fips_validation.h" 20b455d261SGowrishankar Muthukrishnan 21b455d261SGowrishankar Muthukrishnan #define CONFORMANCE_JSON_STR "conformance" 22b455d261SGowrishankar Muthukrishnan #define TESTTYPE_JSON_STR "testType" 23b455d261SGowrishankar Muthukrishnan #define CURVE_JSON_STR "curve" 24b455d261SGowrishankar Muthukrishnan #define HASH_JSON_STR "hashAlg" 25b455d261SGowrishankar Muthukrishnan #define RV_JSON_STR "randomValue" 26b455d261SGowrishankar Muthukrishnan 27b455d261SGowrishankar Muthukrishnan #define MSG_JSON_STR "message" 28b455d261SGowrishankar Muthukrishnan #define QX_JSON_STR "qx" 29b455d261SGowrishankar Muthukrishnan #define QY_JSON_STR "qy" 30b455d261SGowrishankar Muthukrishnan #define R_JSON_STR "r" 31b455d261SGowrishankar Muthukrishnan #define S_JSON_STR "s" 32b455d261SGowrishankar Muthukrishnan 33b455d261SGowrishankar Muthukrishnan #define RV_BUF_LEN (1024/8) 34b455d261SGowrishankar Muthukrishnan #define RV_BIT_LEN (256) 35b455d261SGowrishankar Muthukrishnan 36b455d261SGowrishankar Muthukrishnan #ifdef USE_JANSSON 37b455d261SGowrishankar Muthukrishnan struct { 38b455d261SGowrishankar Muthukrishnan uint8_t type; 39b455d261SGowrishankar Muthukrishnan const char *desc; 40b455d261SGowrishankar Muthukrishnan } ecdsa_test_types[] = { 41b455d261SGowrishankar Muthukrishnan {ECDSA_AFT, "AFT"} 42b455d261SGowrishankar Muthukrishnan }; 43b455d261SGowrishankar Muthukrishnan 44b455d261SGowrishankar Muthukrishnan struct { 45b455d261SGowrishankar Muthukrishnan enum rte_crypto_auth_algorithm auth; 46b455d261SGowrishankar Muthukrishnan const char *desc; 47b455d261SGowrishankar Muthukrishnan } ecdsa_auth_algs[] = { 48b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA1, "SHA-1"}, 49b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA224, "SHA2-224"}, 50b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA256, "SHA2-256"}, 51b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA384, "SHA2-384"}, 52b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA512, "SHA2-512"}, 53b455d261SGowrishankar Muthukrishnan }; 54b455d261SGowrishankar Muthukrishnan 55b455d261SGowrishankar Muthukrishnan struct { 56b455d261SGowrishankar Muthukrishnan enum rte_crypto_curve_id curve_id; 57b455d261SGowrishankar Muthukrishnan const char *desc; 58b455d261SGowrishankar Muthukrishnan } ecdsa_curve_ids[] = { 59b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_EC_GROUP_SECP192R1, "P-192"}, 60b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_EC_GROUP_SECP224R1, "P-224"}, 61b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_EC_GROUP_SECP256R1, "P-256"}, 62b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_EC_GROUP_SECP384R1, "P-384"}, 63b455d261SGowrishankar Muthukrishnan {RTE_CRYPTO_EC_GROUP_SECP521R1, "P-521"}, 64b455d261SGowrishankar Muthukrishnan }; 65b455d261SGowrishankar Muthukrishnan 66b455d261SGowrishankar Muthukrishnan struct { 67b455d261SGowrishankar Muthukrishnan uint8_t curve_len; 68b455d261SGowrishankar Muthukrishnan const char *desc; 69b455d261SGowrishankar Muthukrishnan } ecdsa_curve_len[] = { 70b455d261SGowrishankar Muthukrishnan {24, "P-192"}, 71b455d261SGowrishankar Muthukrishnan {28, "P-224"}, 72b455d261SGowrishankar Muthukrishnan {32, "P-256"}, 73b455d261SGowrishankar Muthukrishnan {48, "P-384"}, 74b455d261SGowrishankar Muthukrishnan {66, "P-521"}, 75b455d261SGowrishankar Muthukrishnan }; 76b455d261SGowrishankar Muthukrishnan 77b455d261SGowrishankar Muthukrishnan #ifdef USE_OPENSSL 78b455d261SGowrishankar Muthukrishnan #define MAX_TRIES 10 79b455d261SGowrishankar Muthukrishnan static int 80b455d261SGowrishankar Muthukrishnan prepare_vec_ecdsa(void) 81b455d261SGowrishankar Muthukrishnan { 82b455d261SGowrishankar Muthukrishnan BIGNUM *pkey = NULL, *order = NULL, *r = NULL; 83b455d261SGowrishankar Muthukrishnan int ret = -1, j; 84b455d261SGowrishankar Muthukrishnan unsigned long pid; 85b455d261SGowrishankar Muthukrishnan 86b455d261SGowrishankar Muthukrishnan /* For ECDSA prime fields, order of base points. 87b455d261SGowrishankar Muthukrishnan * Below string array is indexed by starting with first supported 88b455d261SGowrishankar Muthukrishnan * curve (SECP-192R1). 89b455d261SGowrishankar Muthukrishnan */ 90b455d261SGowrishankar Muthukrishnan static const char * const orderstr[] = { 91b455d261SGowrishankar Muthukrishnan "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", 92b455d261SGowrishankar Muthukrishnan "", 93b455d261SGowrishankar Muthukrishnan "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", 94b455d261SGowrishankar Muthukrishnan "", 95b455d261SGowrishankar Muthukrishnan "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", 96b455d261SGowrishankar Muthukrishnan "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", 97b455d261SGowrishankar Muthukrishnan "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409" 98b455d261SGowrishankar Muthukrishnan }; 99b455d261SGowrishankar Muthukrishnan 100b455d261SGowrishankar Muthukrishnan /* Seed PRNG */ 101b455d261SGowrishankar Muthukrishnan if (vec.ecdsa.seed.val) { 102b455d261SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.seed); 103b455d261SGowrishankar Muthukrishnan RAND_seed((char *)info.one_line_text, strlen(info.one_line_text)); 104b455d261SGowrishankar Muthukrishnan } else { 105b455d261SGowrishankar Muthukrishnan pid = getpid(); 106b455d261SGowrishankar Muthukrishnan RAND_seed(&pid, sizeof(pid)); 107b455d261SGowrishankar Muthukrishnan } 108b455d261SGowrishankar Muthukrishnan 109b455d261SGowrishankar Muthukrishnan if (!RAND_status()) 110b455d261SGowrishankar Muthukrishnan return -1; 111b455d261SGowrishankar Muthukrishnan 112b455d261SGowrishankar Muthukrishnan order = BN_new(); 113b455d261SGowrishankar Muthukrishnan if (!order) 114b455d261SGowrishankar Muthukrishnan goto err; 115b455d261SGowrishankar Muthukrishnan 116b455d261SGowrishankar Muthukrishnan j = info.interim_info.ecdsa_data.curve_id - RTE_CRYPTO_EC_GROUP_SECP192R1; 117b455d261SGowrishankar Muthukrishnan if (!BN_hex2bn(&order, orderstr[j])) 118b455d261SGowrishankar Muthukrishnan goto err; 119b455d261SGowrishankar Muthukrishnan 120b455d261SGowrishankar Muthukrishnan pkey = BN_new(); 121b455d261SGowrishankar Muthukrishnan if (!pkey) 122b455d261SGowrishankar Muthukrishnan goto err; 123b455d261SGowrishankar Muthukrishnan 124b455d261SGowrishankar Muthukrishnan for (j = 0; j < MAX_TRIES; j++) { 125b455d261SGowrishankar Muthukrishnan /* pkey should be in [1, order - 1] */ 126b455d261SGowrishankar Muthukrishnan if (!BN_rand_range(pkey, order)) 127b455d261SGowrishankar Muthukrishnan goto err; 128b455d261SGowrishankar Muthukrishnan 129b455d261SGowrishankar Muthukrishnan if (!BN_is_zero(pkey)) 130b455d261SGowrishankar Muthukrishnan break; 131b455d261SGowrishankar Muthukrishnan } 132b455d261SGowrishankar Muthukrishnan 133b455d261SGowrishankar Muthukrishnan if (j == MAX_TRIES) 134b455d261SGowrishankar Muthukrishnan goto err; 135b455d261SGowrishankar Muthukrishnan 136b455d261SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(pkey), &vec.ecdsa.pkey); 137b455d261SGowrishankar Muthukrishnan 138b455d261SGowrishankar Muthukrishnan r = BN_new(); 139b455d261SGowrishankar Muthukrishnan if (!r) 140b455d261SGowrishankar Muthukrishnan goto err; 141b455d261SGowrishankar Muthukrishnan 142b455d261SGowrishankar Muthukrishnan if (info.interim_info.ecdsa_data.random_msg) { 143b455d261SGowrishankar Muthukrishnan if (!BN_rand(r, RV_BIT_LEN, 0, 0)) 144b455d261SGowrishankar Muthukrishnan goto err; 145b455d261SGowrishankar Muthukrishnan 146b455d261SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(r), &vec.ecdsa.seed); 147b455d261SGowrishankar Muthukrishnan } 148b455d261SGowrishankar Muthukrishnan 149b455d261SGowrishankar Muthukrishnan ret = 0; 150b455d261SGowrishankar Muthukrishnan err: 151b455d261SGowrishankar Muthukrishnan BN_free(order); 152b455d261SGowrishankar Muthukrishnan BN_free(pkey); 153b455d261SGowrishankar Muthukrishnan BN_free(r); 154b455d261SGowrishankar Muthukrishnan return ret; 155b455d261SGowrishankar Muthukrishnan } 156b455d261SGowrishankar Muthukrishnan 157b455d261SGowrishankar Muthukrishnan static int 158b455d261SGowrishankar Muthukrishnan prepare_vec_ecdsa_k(void) 159b455d261SGowrishankar Muthukrishnan { 160b455d261SGowrishankar Muthukrishnan BIGNUM *pkey = NULL, *k = NULL; 161b455d261SGowrishankar Muthukrishnan int ret = -1; 162b455d261SGowrishankar Muthukrishnan 163b455d261SGowrishankar Muthukrishnan if (!vec.ecdsa.pkey.len) 164b455d261SGowrishankar Muthukrishnan return -1; 165b455d261SGowrishankar Muthukrishnan 166b455d261SGowrishankar Muthukrishnan pkey = BN_new(); 167b455d261SGowrishankar Muthukrishnan if (!pkey) 168b455d261SGowrishankar Muthukrishnan goto err; 169b455d261SGowrishankar Muthukrishnan 170b455d261SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.pkey); 171b455d261SGowrishankar Muthukrishnan ret = BN_hex2bn(&pkey, info.one_line_text); 172b455d261SGowrishankar Muthukrishnan if ((uint32_t)ret != strlen(info.one_line_text)) 173b455d261SGowrishankar Muthukrishnan goto err; 174b455d261SGowrishankar Muthukrishnan 175b455d261SGowrishankar Muthukrishnan k = BN_new(); 176b455d261SGowrishankar Muthukrishnan if (!k) 177b455d261SGowrishankar Muthukrishnan goto err; 178b455d261SGowrishankar Muthukrishnan 179b455d261SGowrishankar Muthukrishnan if (!BN_sub(k, pkey, BN_value_one())) 180b455d261SGowrishankar Muthukrishnan goto err; 181b455d261SGowrishankar Muthukrishnan 182b455d261SGowrishankar Muthukrishnan if (BN_is_zero(pkey)) { 183b455d261SGowrishankar Muthukrishnan if (!BN_add(k, pkey, BN_value_one())) 184b455d261SGowrishankar Muthukrishnan goto err; 185b455d261SGowrishankar Muthukrishnan } 186b455d261SGowrishankar Muthukrishnan 187b455d261SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(k), &vec.ecdsa.k); 188b455d261SGowrishankar Muthukrishnan ret = 0; 189b455d261SGowrishankar Muthukrishnan err: 190b455d261SGowrishankar Muthukrishnan BN_free(pkey); 191b455d261SGowrishankar Muthukrishnan BN_free(k); 192b455d261SGowrishankar Muthukrishnan return ret; 193b455d261SGowrishankar Muthukrishnan } 194b455d261SGowrishankar Muthukrishnan 195b455d261SGowrishankar Muthukrishnan #else 196b455d261SGowrishankar Muthukrishnan static int 197b455d261SGowrishankar Muthukrishnan prepare_vec_ecdsa(void) 198b455d261SGowrishankar Muthukrishnan { 199b455d261SGowrishankar Muthukrishnan /* 200b455d261SGowrishankar Muthukrishnan * Generate ECDSA values. 201b455d261SGowrishankar Muthukrishnan */ 202b455d261SGowrishankar Muthukrishnan return -ENOTSUP; 203b455d261SGowrishankar Muthukrishnan } 204b455d261SGowrishankar Muthukrishnan 205b455d261SGowrishankar Muthukrishnan static int 206b455d261SGowrishankar Muthukrishnan prepare_vec_ecdsa_k(void) 207b455d261SGowrishankar Muthukrishnan { 208b455d261SGowrishankar Muthukrishnan /* 209b455d261SGowrishankar Muthukrishnan * Generate ECDSA values. 210b455d261SGowrishankar Muthukrishnan */ 211b455d261SGowrishankar Muthukrishnan return -ENOTSUP; 212b455d261SGowrishankar Muthukrishnan } 213b455d261SGowrishankar Muthukrishnan #endif /* USE_OPENSSL */ 214b455d261SGowrishankar Muthukrishnan 215b455d261SGowrishankar Muthukrishnan static int 216b455d261SGowrishankar Muthukrishnan parse_test_ecdsa_json_interim_writeback(struct fips_val *val) 217b455d261SGowrishankar Muthukrishnan { 218b455d261SGowrishankar Muthukrishnan RTE_SET_USED(val); 219b455d261SGowrishankar Muthukrishnan 220b455d261SGowrishankar Muthukrishnan if (info.interim_info.ecdsa_data.random_msg) { 221b455d261SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_group, "conformance", 222b455d261SGowrishankar Muthukrishnan json_string("SP800-106")); 223b455d261SGowrishankar Muthukrishnan } 224b455d261SGowrishankar Muthukrishnan 225b455d261SGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_SIGGEN) { 226b455d261SGowrishankar Muthukrishnan /* For siggen tests, ECDSA values can be created soon after 227b455d261SGowrishankar Muthukrishnan * the test group data are parsed. 228b455d261SGowrishankar Muthukrishnan */ 229b455d261SGowrishankar Muthukrishnan if (vec.ecdsa.pkey.val) { 230b455d261SGowrishankar Muthukrishnan rte_free(vec.ecdsa.pkey.val); 231b455d261SGowrishankar Muthukrishnan vec.ecdsa.pkey.val = NULL; 232b455d261SGowrishankar Muthukrishnan } 233b455d261SGowrishankar Muthukrishnan 234b455d261SGowrishankar Muthukrishnan if (prepare_vec_ecdsa() < 0) 235b455d261SGowrishankar Muthukrishnan return -1; 236b455d261SGowrishankar Muthukrishnan 237b455d261SGowrishankar Muthukrishnan info.interim_info.ecdsa_data.pubkey_gen = 1; 238b455d261SGowrishankar Muthukrishnan } 239b455d261SGowrishankar Muthukrishnan 240b455d261SGowrishankar Muthukrishnan return 0; 241b455d261SGowrishankar Muthukrishnan } 242b455d261SGowrishankar Muthukrishnan 243b455d261SGowrishankar Muthukrishnan static int 244b455d261SGowrishankar Muthukrishnan post_test_ecdsa_json_interim_writeback(struct fips_val *val) 245b455d261SGowrishankar Muthukrishnan { 246b455d261SGowrishankar Muthukrishnan RTE_SET_USED(val); 247b455d261SGowrishankar Muthukrishnan 248b455d261SGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_KEYGEN) { 249b455d261SGowrishankar Muthukrishnan json_t *obj; 250b455d261SGowrishankar Muthukrishnan 251b455d261SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.qx); 252b455d261SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 253b455d261SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_group, "qx", obj); 254b455d261SGowrishankar Muthukrishnan 255b455d261SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.qy); 256b455d261SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 257b455d261SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_group, "qy", obj); 258b455d261SGowrishankar Muthukrishnan } 259b455d261SGowrishankar Muthukrishnan 260b455d261SGowrishankar Muthukrishnan return 0; 261b455d261SGowrishankar Muthukrishnan } 262b455d261SGowrishankar Muthukrishnan 263b455d261SGowrishankar Muthukrishnan static int 264b455d261SGowrishankar Muthukrishnan parse_test_ecdsa_json_writeback(struct fips_val *val) 265b455d261SGowrishankar Muthukrishnan { 266b455d261SGowrishankar Muthukrishnan json_t *tcId; 267b455d261SGowrishankar Muthukrishnan 268b455d261SGowrishankar Muthukrishnan RTE_SET_USED(val); 269b455d261SGowrishankar Muthukrishnan 270b455d261SGowrishankar Muthukrishnan tcId = json_object_get(json_info.json_test_case, "tcId"); 271b455d261SGowrishankar Muthukrishnan 272b455d261SGowrishankar Muthukrishnan json_info.json_write_case = json_object(); 273b455d261SGowrishankar Muthukrishnan json_object_set(json_info.json_write_case, "tcId", tcId); 274b455d261SGowrishankar Muthukrishnan 275b455d261SGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_SIGGEN) { 276b455d261SGowrishankar Muthukrishnan json_t *obj; 277b455d261SGowrishankar Muthukrishnan 278b455d261SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.r); 279b455d261SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 280b455d261SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "r", obj); 281b455d261SGowrishankar Muthukrishnan 282b455d261SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.s); 283b455d261SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 284b455d261SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "s", obj); 285b455d261SGowrishankar Muthukrishnan 286b455d261SGowrishankar Muthukrishnan if (info.interim_info.ecdsa_data.random_msg) { 287b455d261SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.seed); 288b455d261SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 289b455d261SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "randomValue", obj); 290b455d261SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "randomValueLen", 291b455d261SGowrishankar Muthukrishnan json_integer(vec.ecdsa.seed.len * 8)); 292b455d261SGowrishankar Muthukrishnan } 293b455d261SGowrishankar Muthukrishnan } else if (info.op == FIPS_TEST_ASYM_SIGVER) { 294b455d261SGowrishankar Muthukrishnan if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) 295b455d261SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "testPassed", json_true()); 296b455d261SGowrishankar Muthukrishnan else 297b455d261SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "testPassed", json_false()); 298*a22a5228SGowrishankar Muthukrishnan } else if (info.op == FIPS_TEST_ASYM_KEYGEN) { 299*a22a5228SGowrishankar Muthukrishnan json_t *obj; 300*a22a5228SGowrishankar Muthukrishnan 301*a22a5228SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.pkey); 302*a22a5228SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 303*a22a5228SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "d", obj); 304*a22a5228SGowrishankar Muthukrishnan 305*a22a5228SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.qx); 306*a22a5228SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 307*a22a5228SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "qx", obj); 308*a22a5228SGowrishankar Muthukrishnan 309*a22a5228SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.ecdsa.qy); 310*a22a5228SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 311*a22a5228SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "qy", obj); 312b455d261SGowrishankar Muthukrishnan } 313b455d261SGowrishankar Muthukrishnan 314b455d261SGowrishankar Muthukrishnan return 0; 315b455d261SGowrishankar Muthukrishnan } 316b455d261SGowrishankar Muthukrishnan 317b455d261SGowrishankar Muthukrishnan static int 318b455d261SGowrishankar Muthukrishnan parse_interim_str(const char *key, char *src, struct fips_val *val) 319b455d261SGowrishankar Muthukrishnan { 320b455d261SGowrishankar Muthukrishnan uint32_t i; 321b455d261SGowrishankar Muthukrishnan 322b455d261SGowrishankar Muthukrishnan RTE_SET_USED(val); 323b455d261SGowrishankar Muthukrishnan 324b455d261SGowrishankar Muthukrishnan if (strcmp(key, TESTTYPE_JSON_STR) == 0) { 325b455d261SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(ecdsa_test_types); i++) 326b455d261SGowrishankar Muthukrishnan if (strstr(src, ecdsa_test_types[i].desc)) { 327b455d261SGowrishankar Muthukrishnan info.parse_writeback = parse_test_ecdsa_json_writeback; 328b455d261SGowrishankar Muthukrishnan break; 329b455d261SGowrishankar Muthukrishnan } 330b455d261SGowrishankar Muthukrishnan 331b455d261SGowrishankar Muthukrishnan if (!info.parse_writeback || i >= RTE_DIM(ecdsa_test_types)) 332b455d261SGowrishankar Muthukrishnan return -EINVAL; 333b455d261SGowrishankar Muthukrishnan 334b455d261SGowrishankar Muthukrishnan } else if (strcmp(key, CURVE_JSON_STR) == 0) { 335b455d261SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(ecdsa_curve_ids); i++) 336b455d261SGowrishankar Muthukrishnan if (strstr(src, ecdsa_curve_ids[i].desc)) { 337b455d261SGowrishankar Muthukrishnan info.interim_info.ecdsa_data.curve_id = ecdsa_curve_ids[i].curve_id; 338b455d261SGowrishankar Muthukrishnan info.interim_info.ecdsa_data.curve_len = 339b455d261SGowrishankar Muthukrishnan ecdsa_curve_len[i].curve_len; 340b455d261SGowrishankar Muthukrishnan break; 341b455d261SGowrishankar Muthukrishnan } 342b455d261SGowrishankar Muthukrishnan 343b455d261SGowrishankar Muthukrishnan if (i >= RTE_DIM(ecdsa_curve_ids)) 344b455d261SGowrishankar Muthukrishnan return -EINVAL; 345b455d261SGowrishankar Muthukrishnan } else if (strcmp(key, HASH_JSON_STR) == 0) { 346b455d261SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(ecdsa_auth_algs); i++) 347b455d261SGowrishankar Muthukrishnan if (strstr(src, ecdsa_auth_algs[i].desc)) { 348b455d261SGowrishankar Muthukrishnan info.interim_info.ecdsa_data.auth = ecdsa_auth_algs[i].auth; 349b455d261SGowrishankar Muthukrishnan break; 350b455d261SGowrishankar Muthukrishnan } 351b455d261SGowrishankar Muthukrishnan 352b455d261SGowrishankar Muthukrishnan if (i >= RTE_DIM(ecdsa_auth_algs)) 353b455d261SGowrishankar Muthukrishnan return -EINVAL; 354b455d261SGowrishankar Muthukrishnan } else if (strcmp(key, CONFORMANCE_JSON_STR) == 0) { 355b455d261SGowrishankar Muthukrishnan info.interim_info.ecdsa_data.random_msg = 1; 356b455d261SGowrishankar Muthukrishnan } else { 357b455d261SGowrishankar Muthukrishnan return -EINVAL; 358b455d261SGowrishankar Muthukrishnan } 359b455d261SGowrishankar Muthukrishnan 360b455d261SGowrishankar Muthukrishnan return 0; 361b455d261SGowrishankar Muthukrishnan } 362b455d261SGowrishankar Muthukrishnan 363b455d261SGowrishankar Muthukrishnan static int 364b455d261SGowrishankar Muthukrishnan parse_siggen_message_str(const char *key, char *src, struct fips_val *val) 365b455d261SGowrishankar Muthukrishnan { 366b455d261SGowrishankar Muthukrishnan int ret = 0; 367b455d261SGowrishankar Muthukrishnan 368b455d261SGowrishankar Muthukrishnan parse_uint8_hex_str(key, src, val); 369b455d261SGowrishankar Muthukrishnan if (info.interim_info.ecdsa_data.random_msg) { 370b455d261SGowrishankar Muthukrishnan ret = fips_test_randomize_message(val, &vec.ecdsa.seed); 371b455d261SGowrishankar Muthukrishnan if (ret < 0) 372b455d261SGowrishankar Muthukrishnan return ret; 373b455d261SGowrishankar Muthukrishnan } 374b455d261SGowrishankar Muthukrishnan 375b455d261SGowrishankar Muthukrishnan if (vec.ecdsa.k.val) { 376b455d261SGowrishankar Muthukrishnan rte_free(vec.ecdsa.k.val); 377b455d261SGowrishankar Muthukrishnan vec.ecdsa.k.val = NULL; 378b455d261SGowrishankar Muthukrishnan } 379b455d261SGowrishankar Muthukrishnan 380b455d261SGowrishankar Muthukrishnan ret = prepare_vec_ecdsa_k(); 381b455d261SGowrishankar Muthukrishnan return ret; 382b455d261SGowrishankar Muthukrishnan } 383b455d261SGowrishankar Muthukrishnan 384b455d261SGowrishankar Muthukrishnan static int 385*a22a5228SGowrishankar Muthukrishnan parse_keygen_tc_str(const char *key, char *src, struct fips_val *val) 386*a22a5228SGowrishankar Muthukrishnan { 387*a22a5228SGowrishankar Muthukrishnan RTE_SET_USED(key); 388*a22a5228SGowrishankar Muthukrishnan RTE_SET_USED(src); 389*a22a5228SGowrishankar Muthukrishnan RTE_SET_USED(val); 390*a22a5228SGowrishankar Muthukrishnan 391*a22a5228SGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_KEYGEN) { 392*a22a5228SGowrishankar Muthukrishnan if (vec.ecdsa.pkey.val) { 393*a22a5228SGowrishankar Muthukrishnan rte_free(vec.ecdsa.pkey.val); 394*a22a5228SGowrishankar Muthukrishnan vec.ecdsa.pkey.val = NULL; 395*a22a5228SGowrishankar Muthukrishnan } 396*a22a5228SGowrishankar Muthukrishnan 397*a22a5228SGowrishankar Muthukrishnan if (vec.ecdsa.k.val) { 398*a22a5228SGowrishankar Muthukrishnan rte_free(vec.ecdsa.k.val); 399*a22a5228SGowrishankar Muthukrishnan vec.ecdsa.k.val = NULL; 400*a22a5228SGowrishankar Muthukrishnan } 401*a22a5228SGowrishankar Muthukrishnan 402*a22a5228SGowrishankar Muthukrishnan if (prepare_vec_ecdsa() < 0) 403*a22a5228SGowrishankar Muthukrishnan return -1; 404*a22a5228SGowrishankar Muthukrishnan 405*a22a5228SGowrishankar Muthukrishnan if (prepare_vec_ecdsa_k() < 0) 406*a22a5228SGowrishankar Muthukrishnan return -1; 407*a22a5228SGowrishankar Muthukrishnan 408*a22a5228SGowrishankar Muthukrishnan info.interim_info.ecdsa_data.pubkey_gen = 1; 409*a22a5228SGowrishankar Muthukrishnan } 410*a22a5228SGowrishankar Muthukrishnan 411*a22a5228SGowrishankar Muthukrishnan return 0; 412*a22a5228SGowrishankar Muthukrishnan } 413*a22a5228SGowrishankar Muthukrishnan 414*a22a5228SGowrishankar Muthukrishnan static int 415b455d261SGowrishankar Muthukrishnan parse_sigver_randomvalue_str(const char *key, char *src, struct fips_val *val) 416b455d261SGowrishankar Muthukrishnan { 417b455d261SGowrishankar Muthukrishnan int ret = 0; 418b455d261SGowrishankar Muthukrishnan 419b455d261SGowrishankar Muthukrishnan parse_uint8_hex_str(key, src, val); 420b455d261SGowrishankar Muthukrishnan if (info.interim_info.ecdsa_data.random_msg) 421b455d261SGowrishankar Muthukrishnan ret = fips_test_randomize_message(&vec.pt, val); 422b455d261SGowrishankar Muthukrishnan 423b455d261SGowrishankar Muthukrishnan return ret; 424b455d261SGowrishankar Muthukrishnan } 425b455d261SGowrishankar Muthukrishnan 426b455d261SGowrishankar Muthukrishnan struct fips_test_callback ecdsa_interim_json_vectors[] = { 427b455d261SGowrishankar Muthukrishnan {TESTTYPE_JSON_STR, parse_interim_str, NULL}, 428b455d261SGowrishankar Muthukrishnan {CURVE_JSON_STR, parse_interim_str, NULL}, 429b455d261SGowrishankar Muthukrishnan {HASH_JSON_STR, parse_interim_str, NULL}, 430b455d261SGowrishankar Muthukrishnan {CONFORMANCE_JSON_STR, parse_interim_str, NULL}, 431b455d261SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 432b455d261SGowrishankar Muthukrishnan }; 433b455d261SGowrishankar Muthukrishnan 434b455d261SGowrishankar Muthukrishnan struct fips_test_callback ecdsa_siggen_json_vectors[] = { 435b455d261SGowrishankar Muthukrishnan {MSG_JSON_STR, parse_siggen_message_str, &vec.pt}, 436b455d261SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 437b455d261SGowrishankar Muthukrishnan }; 438b455d261SGowrishankar Muthukrishnan 439b455d261SGowrishankar Muthukrishnan struct fips_test_callback ecdsa_sigver_json_vectors[] = { 440b455d261SGowrishankar Muthukrishnan {MSG_JSON_STR, parse_uint8_hex_str, &vec.pt}, 441b455d261SGowrishankar Muthukrishnan {QX_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.qx}, 442b455d261SGowrishankar Muthukrishnan {QY_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.qy}, 443b455d261SGowrishankar Muthukrishnan {R_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.r}, 444b455d261SGowrishankar Muthukrishnan {S_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.s}, 445b455d261SGowrishankar Muthukrishnan {RV_JSON_STR, parse_sigver_randomvalue_str, &vec.ecdsa.seed}, 446b455d261SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 447b455d261SGowrishankar Muthukrishnan }; 448b455d261SGowrishankar Muthukrishnan 449*a22a5228SGowrishankar Muthukrishnan struct fips_test_callback ecdsa_keygen_json_vectors[] = { 450*a22a5228SGowrishankar Muthukrishnan {"tcId", parse_keygen_tc_str, &vec.pt}, 451*a22a5228SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 452*a22a5228SGowrishankar Muthukrishnan }; 453*a22a5228SGowrishankar Muthukrishnan 454b455d261SGowrishankar Muthukrishnan int 455b455d261SGowrishankar Muthukrishnan parse_test_ecdsa_json_init(void) 456b455d261SGowrishankar Muthukrishnan { 457b455d261SGowrishankar Muthukrishnan json_t *mode_obj = json_object_get(json_info.json_vector_set, "mode"); 458b455d261SGowrishankar Muthukrishnan const char *mode_str = json_string_value(mode_obj); 459b455d261SGowrishankar Muthukrishnan 460b455d261SGowrishankar Muthukrishnan info.callbacks = NULL; 461b455d261SGowrishankar Muthukrishnan info.parse_writeback = NULL; 462b455d261SGowrishankar Muthukrishnan info.interim_info.ecdsa_data.random_msg = 0; 463b455d261SGowrishankar Muthukrishnan 464b455d261SGowrishankar Muthukrishnan info.interim_callbacks = ecdsa_interim_json_vectors; 465b455d261SGowrishankar Muthukrishnan info.post_interim_writeback = post_test_ecdsa_json_interim_writeback; 466b455d261SGowrishankar Muthukrishnan info.parse_interim_writeback = parse_test_ecdsa_json_interim_writeback; 467b455d261SGowrishankar Muthukrishnan if (strcmp(mode_str, "sigGen") == 0) { 468b455d261SGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_SIGGEN; 469b455d261SGowrishankar Muthukrishnan info.callbacks = ecdsa_siggen_json_vectors; 470b455d261SGowrishankar Muthukrishnan } else if (strcmp(mode_str, "sigVer") == 0) { 471b455d261SGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_SIGVER; 472b455d261SGowrishankar Muthukrishnan info.callbacks = ecdsa_sigver_json_vectors; 473*a22a5228SGowrishankar Muthukrishnan } else if (strcmp(mode_str, "keyGen") == 0) { 474*a22a5228SGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_KEYGEN; 475*a22a5228SGowrishankar Muthukrishnan info.callbacks = ecdsa_keygen_json_vectors; 476b455d261SGowrishankar Muthukrishnan } else { 477b455d261SGowrishankar Muthukrishnan return -EINVAL; 478b455d261SGowrishankar Muthukrishnan } 479b455d261SGowrishankar Muthukrishnan 480b455d261SGowrishankar Muthukrishnan return 0; 481b455d261SGowrishankar Muthukrishnan } 482b455d261SGowrishankar Muthukrishnan #endif /* USE_JANSSON */ 483