1*12ede9acSGowrishankar Muthukrishnan /* SPDX-License-Identifier: BSD-3-Clause 2*12ede9acSGowrishankar Muthukrishnan * Copyright(C) 2023 Marvell. 3*12ede9acSGowrishankar Muthukrishnan */ 4*12ede9acSGowrishankar Muthukrishnan 5*12ede9acSGowrishankar Muthukrishnan #include <string.h> 6*12ede9acSGowrishankar Muthukrishnan #include <time.h> 7*12ede9acSGowrishankar Muthukrishnan #include <stdio.h> 8*12ede9acSGowrishankar Muthukrishnan #include <sys/types.h> 9*12ede9acSGowrishankar Muthukrishnan #include <unistd.h> 10*12ede9acSGowrishankar Muthukrishnan 11*12ede9acSGowrishankar Muthukrishnan #ifdef USE_OPENSSL 12*12ede9acSGowrishankar Muthukrishnan #include <openssl/bn.h> 13*12ede9acSGowrishankar Muthukrishnan #include <openssl/rand.h> 14*12ede9acSGowrishankar Muthukrishnan #endif /* USE_OPENSSL */ 15*12ede9acSGowrishankar Muthukrishnan 16*12ede9acSGowrishankar Muthukrishnan #include <rte_cryptodev.h> 17*12ede9acSGowrishankar Muthukrishnan #include <rte_malloc.h> 18*12ede9acSGowrishankar Muthukrishnan 19*12ede9acSGowrishankar Muthukrishnan #include "fips_validation.h" 20*12ede9acSGowrishankar Muthukrishnan 21*12ede9acSGowrishankar Muthukrishnan #define TESTTYPE_JSON_STR "testType" 22*12ede9acSGowrishankar Muthukrishnan #define CURVE_JSON_STR "curve" 23*12ede9acSGowrishankar Muthukrishnan #define PH_JSON_STR "preHash" 24*12ede9acSGowrishankar Muthukrishnan 25*12ede9acSGowrishankar Muthukrishnan #define MSG_JSON_STR "message" 26*12ede9acSGowrishankar Muthukrishnan #define CTX_JSON_STR "context" 27*12ede9acSGowrishankar Muthukrishnan #define Q_JSON_STR "q" 28*12ede9acSGowrishankar Muthukrishnan #define SIG_JSON_STR "signature" 29*12ede9acSGowrishankar Muthukrishnan 30*12ede9acSGowrishankar Muthukrishnan #ifdef USE_JANSSON 31*12ede9acSGowrishankar Muthukrishnan struct { 32*12ede9acSGowrishankar Muthukrishnan uint8_t type; 33*12ede9acSGowrishankar Muthukrishnan const char *desc; 34*12ede9acSGowrishankar Muthukrishnan } eddsa_test_types[] = { 35*12ede9acSGowrishankar Muthukrishnan {EDDSA_AFT, "AFT"}, 36*12ede9acSGowrishankar Muthukrishnan {EDDSA_BFT, "BFT"} 37*12ede9acSGowrishankar Muthukrishnan }; 38*12ede9acSGowrishankar Muthukrishnan 39*12ede9acSGowrishankar Muthukrishnan struct { 40*12ede9acSGowrishankar Muthukrishnan enum rte_crypto_curve_id curve_id; 41*12ede9acSGowrishankar Muthukrishnan const char *desc; 42*12ede9acSGowrishankar Muthukrishnan } eddsa_curve_ids[] = { 43*12ede9acSGowrishankar Muthukrishnan {RTE_CRYPTO_EC_GROUP_ED25519, "ED-25519"}, 44*12ede9acSGowrishankar Muthukrishnan {RTE_CRYPTO_EC_GROUP_ED448, "ED-448"}, 45*12ede9acSGowrishankar Muthukrishnan }; 46*12ede9acSGowrishankar Muthukrishnan 47*12ede9acSGowrishankar Muthukrishnan struct { 48*12ede9acSGowrishankar Muthukrishnan uint8_t curve_len; 49*12ede9acSGowrishankar Muthukrishnan const char *desc; 50*12ede9acSGowrishankar Muthukrishnan } eddsa_curve_len[] = { 51*12ede9acSGowrishankar Muthukrishnan {32, "ED-25519"}, 52*12ede9acSGowrishankar Muthukrishnan {64, "ED-448"}, 53*12ede9acSGowrishankar Muthukrishnan }; 54*12ede9acSGowrishankar Muthukrishnan 55*12ede9acSGowrishankar Muthukrishnan #ifdef USE_OPENSSL 56*12ede9acSGowrishankar Muthukrishnan #define MAX_TRIES 10 57*12ede9acSGowrishankar Muthukrishnan static int 58*12ede9acSGowrishankar Muthukrishnan prepare_vec_eddsa(void) 59*12ede9acSGowrishankar Muthukrishnan { 60*12ede9acSGowrishankar Muthukrishnan BIGNUM *pkey = NULL, *order = NULL; 61*12ede9acSGowrishankar Muthukrishnan int ret = -1, j; 62*12ede9acSGowrishankar Muthukrishnan unsigned long pid; 63*12ede9acSGowrishankar Muthukrishnan 64*12ede9acSGowrishankar Muthukrishnan /* For EdDSA prime fields, order of base points (RFC 8032 Section 5.1 and 5.2). 65*12ede9acSGowrishankar Muthukrishnan */ 66*12ede9acSGowrishankar Muthukrishnan static const char * const orderstr[] = { 67*12ede9acSGowrishankar Muthukrishnan "7237005577332262213973186563042994240857116359379907606001950938285454250989", 68*12ede9acSGowrishankar Muthukrishnan "181709681073901722637330951972001133588410340171829515070372549795146003961539585716195755291692375963310293709091662304773755859649779", 69*12ede9acSGowrishankar Muthukrishnan }; 70*12ede9acSGowrishankar Muthukrishnan 71*12ede9acSGowrishankar Muthukrishnan pid = getpid(); 72*12ede9acSGowrishankar Muthukrishnan RAND_seed(&pid, sizeof(pid)); 73*12ede9acSGowrishankar Muthukrishnan 74*12ede9acSGowrishankar Muthukrishnan if (!RAND_status()) 75*12ede9acSGowrishankar Muthukrishnan return -1; 76*12ede9acSGowrishankar Muthukrishnan 77*12ede9acSGowrishankar Muthukrishnan order = BN_new(); 78*12ede9acSGowrishankar Muthukrishnan if (!order) 79*12ede9acSGowrishankar Muthukrishnan goto err; 80*12ede9acSGowrishankar Muthukrishnan 81*12ede9acSGowrishankar Muthukrishnan j = info.interim_info.eddsa_data.curve_id - RTE_CRYPTO_EC_GROUP_ED25519; 82*12ede9acSGowrishankar Muthukrishnan if (!BN_hex2bn(&order, orderstr[j])) 83*12ede9acSGowrishankar Muthukrishnan goto err; 84*12ede9acSGowrishankar Muthukrishnan 85*12ede9acSGowrishankar Muthukrishnan pkey = BN_new(); 86*12ede9acSGowrishankar Muthukrishnan if (!pkey) 87*12ede9acSGowrishankar Muthukrishnan goto err; 88*12ede9acSGowrishankar Muthukrishnan 89*12ede9acSGowrishankar Muthukrishnan for (j = 0; j < MAX_TRIES; j++) { 90*12ede9acSGowrishankar Muthukrishnan /* pkey should be in [1, order - 1] */ 91*12ede9acSGowrishankar Muthukrishnan if (!BN_rand_range(pkey, order)) 92*12ede9acSGowrishankar Muthukrishnan goto err; 93*12ede9acSGowrishankar Muthukrishnan 94*12ede9acSGowrishankar Muthukrishnan if (!BN_is_zero(pkey)) 95*12ede9acSGowrishankar Muthukrishnan break; 96*12ede9acSGowrishankar Muthukrishnan } 97*12ede9acSGowrishankar Muthukrishnan 98*12ede9acSGowrishankar Muthukrishnan if (j == MAX_TRIES) 99*12ede9acSGowrishankar Muthukrishnan goto err; 100*12ede9acSGowrishankar Muthukrishnan 101*12ede9acSGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(pkey), &vec.eddsa.pkey); 102*12ede9acSGowrishankar Muthukrishnan 103*12ede9acSGowrishankar Muthukrishnan ret = 0; 104*12ede9acSGowrishankar Muthukrishnan err: 105*12ede9acSGowrishankar Muthukrishnan BN_free(order); 106*12ede9acSGowrishankar Muthukrishnan BN_free(pkey); 107*12ede9acSGowrishankar Muthukrishnan return ret; 108*12ede9acSGowrishankar Muthukrishnan } 109*12ede9acSGowrishankar Muthukrishnan #else 110*12ede9acSGowrishankar Muthukrishnan static int 111*12ede9acSGowrishankar Muthukrishnan prepare_vec_eddsa(void) 112*12ede9acSGowrishankar Muthukrishnan { 113*12ede9acSGowrishankar Muthukrishnan /* 114*12ede9acSGowrishankar Muthukrishnan * Generate EdDSA values. 115*12ede9acSGowrishankar Muthukrishnan */ 116*12ede9acSGowrishankar Muthukrishnan return -ENOTSUP; 117*12ede9acSGowrishankar Muthukrishnan } 118*12ede9acSGowrishankar Muthukrishnan #endif /* USE_OPENSSL */ 119*12ede9acSGowrishankar Muthukrishnan 120*12ede9acSGowrishankar Muthukrishnan static int 121*12ede9acSGowrishankar Muthukrishnan parse_test_eddsa_json_interim_writeback(struct fips_val *val) 122*12ede9acSGowrishankar Muthukrishnan { 123*12ede9acSGowrishankar Muthukrishnan RTE_SET_USED(val); 124*12ede9acSGowrishankar Muthukrishnan 125*12ede9acSGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_SIGGEN) { 126*12ede9acSGowrishankar Muthukrishnan /* For siggen tests, EdDSA values can be created soon after 127*12ede9acSGowrishankar Muthukrishnan * the test group data are parsed. 128*12ede9acSGowrishankar Muthukrishnan */ 129*12ede9acSGowrishankar Muthukrishnan if (vec.eddsa.pkey.val) { 130*12ede9acSGowrishankar Muthukrishnan rte_free(vec.eddsa.pkey.val); 131*12ede9acSGowrishankar Muthukrishnan vec.eddsa.pkey.val = NULL; 132*12ede9acSGowrishankar Muthukrishnan } 133*12ede9acSGowrishankar Muthukrishnan 134*12ede9acSGowrishankar Muthukrishnan if (prepare_vec_eddsa() < 0) 135*12ede9acSGowrishankar Muthukrishnan return -1; 136*12ede9acSGowrishankar Muthukrishnan 137*12ede9acSGowrishankar Muthukrishnan info.interim_info.eddsa_data.pubkey_gen = 1; 138*12ede9acSGowrishankar Muthukrishnan } 139*12ede9acSGowrishankar Muthukrishnan 140*12ede9acSGowrishankar Muthukrishnan return 0; 141*12ede9acSGowrishankar Muthukrishnan } 142*12ede9acSGowrishankar Muthukrishnan 143*12ede9acSGowrishankar Muthukrishnan static int 144*12ede9acSGowrishankar Muthukrishnan post_test_eddsa_json_interim_writeback(struct fips_val *val) 145*12ede9acSGowrishankar Muthukrishnan { 146*12ede9acSGowrishankar Muthukrishnan RTE_SET_USED(val); 147*12ede9acSGowrishankar Muthukrishnan 148*12ede9acSGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_KEYGEN) { 149*12ede9acSGowrishankar Muthukrishnan json_t *obj; 150*12ede9acSGowrishankar Muthukrishnan 151*12ede9acSGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.eddsa.q); 152*12ede9acSGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 153*12ede9acSGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_group, "q", obj); 154*12ede9acSGowrishankar Muthukrishnan } 155*12ede9acSGowrishankar Muthukrishnan 156*12ede9acSGowrishankar Muthukrishnan return 0; 157*12ede9acSGowrishankar Muthukrishnan } 158*12ede9acSGowrishankar Muthukrishnan 159*12ede9acSGowrishankar Muthukrishnan static int 160*12ede9acSGowrishankar Muthukrishnan parse_test_eddsa_json_writeback(struct fips_val *val) 161*12ede9acSGowrishankar Muthukrishnan { 162*12ede9acSGowrishankar Muthukrishnan json_t *tcId; 163*12ede9acSGowrishankar Muthukrishnan 164*12ede9acSGowrishankar Muthukrishnan RTE_SET_USED(val); 165*12ede9acSGowrishankar Muthukrishnan 166*12ede9acSGowrishankar Muthukrishnan tcId = json_object_get(json_info.json_test_case, "tcId"); 167*12ede9acSGowrishankar Muthukrishnan 168*12ede9acSGowrishankar Muthukrishnan json_info.json_write_case = json_object(); 169*12ede9acSGowrishankar Muthukrishnan json_object_set(json_info.json_write_case, "tcId", tcId); 170*12ede9acSGowrishankar Muthukrishnan 171*12ede9acSGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_SIGGEN) { 172*12ede9acSGowrishankar Muthukrishnan json_t *obj; 173*12ede9acSGowrishankar Muthukrishnan 174*12ede9acSGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.eddsa.sign); 175*12ede9acSGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 176*12ede9acSGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "signature", obj); 177*12ede9acSGowrishankar Muthukrishnan } else if (info.op == FIPS_TEST_ASYM_SIGVER) { 178*12ede9acSGowrishankar Muthukrishnan if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) 179*12ede9acSGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "testPassed", json_true()); 180*12ede9acSGowrishankar Muthukrishnan else 181*12ede9acSGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "testPassed", json_false()); 182*12ede9acSGowrishankar Muthukrishnan } else if (info.op == FIPS_TEST_ASYM_KEYGEN) { 183*12ede9acSGowrishankar Muthukrishnan json_t *obj; 184*12ede9acSGowrishankar Muthukrishnan 185*12ede9acSGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.eddsa.pkey); 186*12ede9acSGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 187*12ede9acSGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "d", obj); 188*12ede9acSGowrishankar Muthukrishnan 189*12ede9acSGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.eddsa.q); 190*12ede9acSGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 191*12ede9acSGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "q", obj); 192*12ede9acSGowrishankar Muthukrishnan } 193*12ede9acSGowrishankar Muthukrishnan 194*12ede9acSGowrishankar Muthukrishnan return 0; 195*12ede9acSGowrishankar Muthukrishnan } 196*12ede9acSGowrishankar Muthukrishnan 197*12ede9acSGowrishankar Muthukrishnan static int 198*12ede9acSGowrishankar Muthukrishnan parse_interim_str(const char *key, char *src, struct fips_val *val) 199*12ede9acSGowrishankar Muthukrishnan { 200*12ede9acSGowrishankar Muthukrishnan uint32_t i; 201*12ede9acSGowrishankar Muthukrishnan 202*12ede9acSGowrishankar Muthukrishnan RTE_SET_USED(val); 203*12ede9acSGowrishankar Muthukrishnan 204*12ede9acSGowrishankar Muthukrishnan if (strcmp(key, TESTTYPE_JSON_STR) == 0) { 205*12ede9acSGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(eddsa_test_types); i++) 206*12ede9acSGowrishankar Muthukrishnan if (strstr(src, eddsa_test_types[i].desc)) { 207*12ede9acSGowrishankar Muthukrishnan info.parse_writeback = parse_test_eddsa_json_writeback; 208*12ede9acSGowrishankar Muthukrishnan break; 209*12ede9acSGowrishankar Muthukrishnan } 210*12ede9acSGowrishankar Muthukrishnan 211*12ede9acSGowrishankar Muthukrishnan if (!info.parse_writeback || i >= RTE_DIM(eddsa_test_types)) 212*12ede9acSGowrishankar Muthukrishnan return -EINVAL; 213*12ede9acSGowrishankar Muthukrishnan 214*12ede9acSGowrishankar Muthukrishnan } else if (strcmp(key, CURVE_JSON_STR) == 0) { 215*12ede9acSGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(eddsa_curve_ids); i++) 216*12ede9acSGowrishankar Muthukrishnan if (strstr(src, eddsa_curve_ids[i].desc)) { 217*12ede9acSGowrishankar Muthukrishnan info.interim_info.eddsa_data.curve_id = eddsa_curve_ids[i].curve_id; 218*12ede9acSGowrishankar Muthukrishnan info.interim_info.eddsa_data.curve_len = 219*12ede9acSGowrishankar Muthukrishnan eddsa_curve_len[i].curve_len; 220*12ede9acSGowrishankar Muthukrishnan break; 221*12ede9acSGowrishankar Muthukrishnan } 222*12ede9acSGowrishankar Muthukrishnan 223*12ede9acSGowrishankar Muthukrishnan if (i >= RTE_DIM(eddsa_curve_ids)) 224*12ede9acSGowrishankar Muthukrishnan return -EINVAL; 225*12ede9acSGowrishankar Muthukrishnan } else if (strcmp(key, PH_JSON_STR) == 0) { 226*12ede9acSGowrishankar Muthukrishnan info.interim_info.eddsa_data.prehash = false; 227*12ede9acSGowrishankar Muthukrishnan } else { 228*12ede9acSGowrishankar Muthukrishnan return -EINVAL; 229*12ede9acSGowrishankar Muthukrishnan } 230*12ede9acSGowrishankar Muthukrishnan 231*12ede9acSGowrishankar Muthukrishnan return 0; 232*12ede9acSGowrishankar Muthukrishnan } 233*12ede9acSGowrishankar Muthukrishnan 234*12ede9acSGowrishankar Muthukrishnan static int 235*12ede9acSGowrishankar Muthukrishnan parse_keygen_tc_str(const char *key, char *src, struct fips_val *val) 236*12ede9acSGowrishankar Muthukrishnan { 237*12ede9acSGowrishankar Muthukrishnan RTE_SET_USED(key); 238*12ede9acSGowrishankar Muthukrishnan RTE_SET_USED(src); 239*12ede9acSGowrishankar Muthukrishnan RTE_SET_USED(val); 240*12ede9acSGowrishankar Muthukrishnan 241*12ede9acSGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_KEYGEN) { 242*12ede9acSGowrishankar Muthukrishnan if (vec.eddsa.pkey.val) { 243*12ede9acSGowrishankar Muthukrishnan rte_free(vec.eddsa.pkey.val); 244*12ede9acSGowrishankar Muthukrishnan vec.eddsa.pkey.val = NULL; 245*12ede9acSGowrishankar Muthukrishnan } 246*12ede9acSGowrishankar Muthukrishnan 247*12ede9acSGowrishankar Muthukrishnan if (prepare_vec_eddsa() < 0) 248*12ede9acSGowrishankar Muthukrishnan return -1; 249*12ede9acSGowrishankar Muthukrishnan 250*12ede9acSGowrishankar Muthukrishnan info.interim_info.eddsa_data.pubkey_gen = 1; 251*12ede9acSGowrishankar Muthukrishnan } 252*12ede9acSGowrishankar Muthukrishnan 253*12ede9acSGowrishankar Muthukrishnan return 0; 254*12ede9acSGowrishankar Muthukrishnan } 255*12ede9acSGowrishankar Muthukrishnan 256*12ede9acSGowrishankar Muthukrishnan struct fips_test_callback eddsa_interim_json_vectors[] = { 257*12ede9acSGowrishankar Muthukrishnan {TESTTYPE_JSON_STR, parse_interim_str, NULL}, 258*12ede9acSGowrishankar Muthukrishnan {CURVE_JSON_STR, parse_interim_str, NULL}, 259*12ede9acSGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 260*12ede9acSGowrishankar Muthukrishnan }; 261*12ede9acSGowrishankar Muthukrishnan 262*12ede9acSGowrishankar Muthukrishnan struct fips_test_callback eddsa_siggen_json_vectors[] = { 263*12ede9acSGowrishankar Muthukrishnan {MSG_JSON_STR, parse_uint8_hex_str, &vec.pt}, 264*12ede9acSGowrishankar Muthukrishnan {CTX_JSON_STR, parse_uint8_hex_str, &vec.eddsa.ctx}, 265*12ede9acSGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 266*12ede9acSGowrishankar Muthukrishnan }; 267*12ede9acSGowrishankar Muthukrishnan 268*12ede9acSGowrishankar Muthukrishnan struct fips_test_callback eddsa_sigver_json_vectors[] = { 269*12ede9acSGowrishankar Muthukrishnan {MSG_JSON_STR, parse_uint8_hex_str, &vec.pt}, 270*12ede9acSGowrishankar Muthukrishnan {Q_JSON_STR, parse_uint8_hex_str, &vec.eddsa.q}, 271*12ede9acSGowrishankar Muthukrishnan {SIG_JSON_STR, parse_uint8_hex_str, &vec.eddsa.sign}, 272*12ede9acSGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 273*12ede9acSGowrishankar Muthukrishnan }; 274*12ede9acSGowrishankar Muthukrishnan 275*12ede9acSGowrishankar Muthukrishnan struct fips_test_callback eddsa_keygen_json_vectors[] = { 276*12ede9acSGowrishankar Muthukrishnan {"tcId", parse_keygen_tc_str, &vec.pt}, 277*12ede9acSGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 278*12ede9acSGowrishankar Muthukrishnan }; 279*12ede9acSGowrishankar Muthukrishnan 280*12ede9acSGowrishankar Muthukrishnan int 281*12ede9acSGowrishankar Muthukrishnan parse_test_eddsa_json_init(void) 282*12ede9acSGowrishankar Muthukrishnan { 283*12ede9acSGowrishankar Muthukrishnan json_t *mode_obj = json_object_get(json_info.json_vector_set, "mode"); 284*12ede9acSGowrishankar Muthukrishnan const char *mode_str = json_string_value(mode_obj); 285*12ede9acSGowrishankar Muthukrishnan 286*12ede9acSGowrishankar Muthukrishnan info.callbacks = NULL; 287*12ede9acSGowrishankar Muthukrishnan info.parse_writeback = NULL; 288*12ede9acSGowrishankar Muthukrishnan 289*12ede9acSGowrishankar Muthukrishnan info.interim_callbacks = eddsa_interim_json_vectors; 290*12ede9acSGowrishankar Muthukrishnan info.post_interim_writeback = post_test_eddsa_json_interim_writeback; 291*12ede9acSGowrishankar Muthukrishnan info.parse_interim_writeback = parse_test_eddsa_json_interim_writeback; 292*12ede9acSGowrishankar Muthukrishnan if (strcmp(mode_str, "sigGen") == 0) { 293*12ede9acSGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_SIGGEN; 294*12ede9acSGowrishankar Muthukrishnan info.callbacks = eddsa_siggen_json_vectors; 295*12ede9acSGowrishankar Muthukrishnan } else if (strcmp(mode_str, "sigVer") == 0) { 296*12ede9acSGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_SIGVER; 297*12ede9acSGowrishankar Muthukrishnan info.callbacks = eddsa_sigver_json_vectors; 298*12ede9acSGowrishankar Muthukrishnan } else if (strcmp(mode_str, "keyGen") == 0) { 299*12ede9acSGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_KEYGEN; 300*12ede9acSGowrishankar Muthukrishnan info.callbacks = eddsa_keygen_json_vectors; 301*12ede9acSGowrishankar Muthukrishnan } else { 302*12ede9acSGowrishankar Muthukrishnan return -EINVAL; 303*12ede9acSGowrishankar Muthukrishnan } 304*12ede9acSGowrishankar Muthukrishnan 305*12ede9acSGowrishankar Muthukrishnan return 0; 306*12ede9acSGowrishankar Muthukrishnan } 307*12ede9acSGowrishankar Muthukrishnan #endif /* USE_JANSSON */ 308