1*36128a67SGowrishankar Muthukrishnan /* SPDX-License-Identifier: BSD-3-Clause 2*36128a67SGowrishankar Muthukrishnan * Copyright(C) 2022 Marvell. 3*36128a67SGowrishankar Muthukrishnan */ 4*36128a67SGowrishankar Muthukrishnan 5*36128a67SGowrishankar Muthukrishnan #include <string.h> 6*36128a67SGowrishankar Muthukrishnan #include <time.h> 7*36128a67SGowrishankar Muthukrishnan #include <stdio.h> 8*36128a67SGowrishankar Muthukrishnan #include <sys/types.h> 9*36128a67SGowrishankar Muthukrishnan #include <unistd.h> 10*36128a67SGowrishankar Muthukrishnan 11*36128a67SGowrishankar Muthukrishnan #ifdef USE_OPENSSL 12*36128a67SGowrishankar Muthukrishnan #include <openssl/bn.h> 13*36128a67SGowrishankar Muthukrishnan #include <openssl/rand.h> 14*36128a67SGowrishankar Muthukrishnan #endif /* USE_OPENSSL */ 15*36128a67SGowrishankar Muthukrishnan 16*36128a67SGowrishankar Muthukrishnan #include <rte_cryptodev.h> 17*36128a67SGowrishankar Muthukrishnan #include <rte_malloc.h> 18*36128a67SGowrishankar Muthukrishnan 19*36128a67SGowrishankar Muthukrishnan #include "fips_validation.h" 20*36128a67SGowrishankar Muthukrishnan 21*36128a67SGowrishankar Muthukrishnan #define TESTTYPE_JSON_STR "testType" 22*36128a67SGowrishankar Muthukrishnan #define SIGTYPE_JSON_STR "sigType" 23*36128a67SGowrishankar Muthukrishnan #define MOD_JSON_STR "modulo" 24*36128a67SGowrishankar Muthukrishnan #define HASH_JSON_STR "hashAlg" 25*36128a67SGowrishankar Muthukrishnan #define SALT_JSON_STR "saltLen" 26*36128a67SGowrishankar Muthukrishnan #define E_JSON_STR "e" 27*36128a67SGowrishankar Muthukrishnan #define N_JSON_STR "n" 28*36128a67SGowrishankar Muthukrishnan 29*36128a67SGowrishankar Muthukrishnan #define SEED_JSON_STR "seed" 30*36128a67SGowrishankar Muthukrishnan #define MSG_JSON_STR "message" 31*36128a67SGowrishankar Muthukrishnan #define SIG_JSON_STR "signature" 32*36128a67SGowrishankar Muthukrishnan 33*36128a67SGowrishankar Muthukrishnan #ifdef USE_JANSSON 34*36128a67SGowrishankar Muthukrishnan struct { 35*36128a67SGowrishankar Muthukrishnan uint8_t type; 36*36128a67SGowrishankar Muthukrishnan const char *desc; 37*36128a67SGowrishankar Muthukrishnan } rsa_test_types[] = { 38*36128a67SGowrishankar Muthukrishnan {RSA_AFT, "AFT"}, 39*36128a67SGowrishankar Muthukrishnan {RSA_GDT, "GDT"}, 40*36128a67SGowrishankar Muthukrishnan {RSA_KAT, "KAT"}, 41*36128a67SGowrishankar Muthukrishnan }; 42*36128a67SGowrishankar Muthukrishnan 43*36128a67SGowrishankar Muthukrishnan struct { 44*36128a67SGowrishankar Muthukrishnan enum rte_crypto_auth_algorithm auth; 45*36128a67SGowrishankar Muthukrishnan const char *desc; 46*36128a67SGowrishankar Muthukrishnan } rsa_auth_algs[] = { 47*36128a67SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA1, "SHA-1"}, 48*36128a67SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA224, "SHA2-224"}, 49*36128a67SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA256, "SHA2-256"}, 50*36128a67SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA384, "SHA2-384"}, 51*36128a67SGowrishankar Muthukrishnan {RTE_CRYPTO_AUTH_SHA512, "SHA2-512"}, 52*36128a67SGowrishankar Muthukrishnan }; 53*36128a67SGowrishankar Muthukrishnan 54*36128a67SGowrishankar Muthukrishnan struct { 55*36128a67SGowrishankar Muthukrishnan enum rte_crypto_rsa_padding_type padding; 56*36128a67SGowrishankar Muthukrishnan const char *desc; 57*36128a67SGowrishankar Muthukrishnan } rsa_padding_types[] = { 58*36128a67SGowrishankar Muthukrishnan {RTE_CRYPTO_RSA_PADDING_NONE, "none"}, 59*36128a67SGowrishankar Muthukrishnan {RTE_CRYPTO_RSA_PADDING_PKCS1_5, "pkcs1v1.5"}, 60*36128a67SGowrishankar Muthukrishnan {RTE_CRYPTO_RSA_PADDING_OAEP, "oaep"}, 61*36128a67SGowrishankar Muthukrishnan {RTE_CRYPTO_RSA_PADDING_PSS, "pss"}, 62*36128a67SGowrishankar Muthukrishnan }; 63*36128a67SGowrishankar Muthukrishnan 64*36128a67SGowrishankar Muthukrishnan #ifdef USE_OPENSSL 65*36128a67SGowrishankar Muthukrishnan static int 66*36128a67SGowrishankar Muthukrishnan prepare_vec_rsa(void) 67*36128a67SGowrishankar Muthukrishnan { 68*36128a67SGowrishankar Muthukrishnan BIGNUM *p = NULL, *q = NULL, *n = NULL, *d = NULL, *e = NULL; 69*36128a67SGowrishankar Muthukrishnan BIGNUM *dp = NULL, *dq = NULL, *qinv = NULL; 70*36128a67SGowrishankar Muthukrishnan BIGNUM *r0, *r1, *r2, *r3, *r4; 71*36128a67SGowrishankar Muthukrishnan BIGNUM *m = NULL, *r = NULL; 72*36128a67SGowrishankar Muthukrishnan int bits, ret = -1, i; 73*36128a67SGowrishankar Muthukrishnan char modbuf[8], *buf; 74*36128a67SGowrishankar Muthukrishnan BN_CTX *ctx = NULL; 75*36128a67SGowrishankar Muthukrishnan unsigned long pid; 76*36128a67SGowrishankar Muthukrishnan 77*36128a67SGowrishankar Muthukrishnan /* Seed PRNG */ 78*36128a67SGowrishankar Muthukrishnan if (vec.rsa.seed.val) { 79*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.seed); 80*36128a67SGowrishankar Muthukrishnan RAND_seed((char *)info.one_line_text, strlen(info.one_line_text)); 81*36128a67SGowrishankar Muthukrishnan } else { 82*36128a67SGowrishankar Muthukrishnan pid = getpid(); 83*36128a67SGowrishankar Muthukrishnan RAND_seed(&pid, sizeof(pid)); 84*36128a67SGowrishankar Muthukrishnan } 85*36128a67SGowrishankar Muthukrishnan 86*36128a67SGowrishankar Muthukrishnan if (!RAND_status()) 87*36128a67SGowrishankar Muthukrishnan return -1; 88*36128a67SGowrishankar Muthukrishnan 89*36128a67SGowrishankar Muthukrishnan /* Check if e is known already */ 90*36128a67SGowrishankar Muthukrishnan if (vec.rsa.e.val) { 91*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.e); 92*36128a67SGowrishankar Muthukrishnan ret = BN_hex2bn(&e, info.one_line_text); 93*36128a67SGowrishankar Muthukrishnan if ((uint32_t)ret != strlen(info.one_line_text)) 94*36128a67SGowrishankar Muthukrishnan goto err; 95*36128a67SGowrishankar Muthukrishnan } 96*36128a67SGowrishankar Muthukrishnan 97*36128a67SGowrishankar Muthukrishnan /* BN context initialization */ 98*36128a67SGowrishankar Muthukrishnan ctx = BN_CTX_new(); 99*36128a67SGowrishankar Muthukrishnan if (!ctx) 100*36128a67SGowrishankar Muthukrishnan goto err; 101*36128a67SGowrishankar Muthukrishnan 102*36128a67SGowrishankar Muthukrishnan BN_CTX_start(ctx); 103*36128a67SGowrishankar Muthukrishnan r0 = BN_CTX_get(ctx); 104*36128a67SGowrishankar Muthukrishnan r1 = BN_CTX_get(ctx); 105*36128a67SGowrishankar Muthukrishnan r2 = BN_CTX_get(ctx); 106*36128a67SGowrishankar Muthukrishnan r3 = BN_CTX_get(ctx); 107*36128a67SGowrishankar Muthukrishnan r4 = BN_CTX_get(ctx); 108*36128a67SGowrishankar Muthukrishnan if (!r4) 109*36128a67SGowrishankar Muthukrishnan goto err; 110*36128a67SGowrishankar Muthukrishnan 111*36128a67SGowrishankar Muthukrishnan /* Calculate bit length for prime numbers */ 112*36128a67SGowrishankar Muthukrishnan m = BN_new(); 113*36128a67SGowrishankar Muthukrishnan if (!m) 114*36128a67SGowrishankar Muthukrishnan goto err; 115*36128a67SGowrishankar Muthukrishnan 116*36128a67SGowrishankar Muthukrishnan snprintf(modbuf, sizeof(modbuf), "%d", info.interim_info.rsa_data.modulo); 117*36128a67SGowrishankar Muthukrishnan if (!BN_dec2bn(&m, modbuf)) 118*36128a67SGowrishankar Muthukrishnan goto err; 119*36128a67SGowrishankar Muthukrishnan 120*36128a67SGowrishankar Muthukrishnan r = BN_new(); 121*36128a67SGowrishankar Muthukrishnan if (!r) 122*36128a67SGowrishankar Muthukrishnan goto err; 123*36128a67SGowrishankar Muthukrishnan 124*36128a67SGowrishankar Muthukrishnan if (!BN_rshift1(r, m)) 125*36128a67SGowrishankar Muthukrishnan goto err; 126*36128a67SGowrishankar Muthukrishnan 127*36128a67SGowrishankar Muthukrishnan buf = BN_bn2dec(r); 128*36128a67SGowrishankar Muthukrishnan bits = atoi(buf); 129*36128a67SGowrishankar Muthukrishnan 130*36128a67SGowrishankar Muthukrishnan p = BN_new(); 131*36128a67SGowrishankar Muthukrishnan if (!p) 132*36128a67SGowrishankar Muthukrishnan goto err; 133*36128a67SGowrishankar Muthukrishnan 134*36128a67SGowrishankar Muthukrishnan q = BN_new(); 135*36128a67SGowrishankar Muthukrishnan if (!q) 136*36128a67SGowrishankar Muthukrishnan goto err; 137*36128a67SGowrishankar Muthukrishnan 138*36128a67SGowrishankar Muthukrishnan n = BN_new(); 139*36128a67SGowrishankar Muthukrishnan if (!n) 140*36128a67SGowrishankar Muthukrishnan goto err; 141*36128a67SGowrishankar Muthukrishnan 142*36128a67SGowrishankar Muthukrishnan d = BN_new(); 143*36128a67SGowrishankar Muthukrishnan if (!d) 144*36128a67SGowrishankar Muthukrishnan goto err; 145*36128a67SGowrishankar Muthukrishnan 146*36128a67SGowrishankar Muthukrishnan /* Generate p and q suitably for RSA */ 147*36128a67SGowrishankar Muthukrishnan for (i = 0; i < 10; i++) { 148*36128a67SGowrishankar Muthukrishnan uint8_t j = 0; 149*36128a67SGowrishankar Muthukrishnan 150*36128a67SGowrishankar Muthukrishnan if (!BN_generate_prime_ex(p, bits, 0, NULL, NULL, NULL)) 151*36128a67SGowrishankar Muthukrishnan goto err; 152*36128a67SGowrishankar Muthukrishnan 153*36128a67SGowrishankar Muthukrishnan do { 154*36128a67SGowrishankar Muthukrishnan RAND_add(&j, sizeof(j), 1); 155*36128a67SGowrishankar Muthukrishnan if (!BN_generate_prime_ex(q, bits, 0, NULL, NULL, NULL)) 156*36128a67SGowrishankar Muthukrishnan goto err; 157*36128a67SGowrishankar Muthukrishnan 158*36128a67SGowrishankar Muthukrishnan } while ((BN_cmp(p, q) == 0) && (j++ < 100)); 159*36128a67SGowrishankar Muthukrishnan 160*36128a67SGowrishankar Muthukrishnan if (j >= 100) { 161*36128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Error: insufficient %d retries to generate q", j); 162*36128a67SGowrishankar Muthukrishnan goto err; 163*36128a67SGowrishankar Muthukrishnan } 164*36128a67SGowrishankar Muthukrishnan 165*36128a67SGowrishankar Muthukrishnan /* pq */ 166*36128a67SGowrishankar Muthukrishnan if (!BN_mul(n, p, q, ctx)) 167*36128a67SGowrishankar Muthukrishnan goto err; 168*36128a67SGowrishankar Muthukrishnan 169*36128a67SGowrishankar Muthukrishnan /* p-1 */ 170*36128a67SGowrishankar Muthukrishnan if (!BN_sub(r1, p, BN_value_one())) 171*36128a67SGowrishankar Muthukrishnan goto err; 172*36128a67SGowrishankar Muthukrishnan 173*36128a67SGowrishankar Muthukrishnan /* q-1 */ 174*36128a67SGowrishankar Muthukrishnan if (!BN_sub(r2, q, BN_value_one())) 175*36128a67SGowrishankar Muthukrishnan goto err; 176*36128a67SGowrishankar Muthukrishnan 177*36128a67SGowrishankar Muthukrishnan /* (p-1 * q-1) */ 178*36128a67SGowrishankar Muthukrishnan if (!BN_mul(r0, r1, r2, ctx)) 179*36128a67SGowrishankar Muthukrishnan goto err; 180*36128a67SGowrishankar Muthukrishnan 181*36128a67SGowrishankar Muthukrishnan /* gcd(p-1, q-1)*/ 182*36128a67SGowrishankar Muthukrishnan if (!BN_gcd(r3, r1, r2, ctx)) 183*36128a67SGowrishankar Muthukrishnan goto err; 184*36128a67SGowrishankar Muthukrishnan 185*36128a67SGowrishankar Muthukrishnan /* lcm(p-1, q-1) */ 186*36128a67SGowrishankar Muthukrishnan if (!BN_div(r4, r, r0, r3, ctx)) 187*36128a67SGowrishankar Muthukrishnan goto err; 188*36128a67SGowrishankar Muthukrishnan 189*36128a67SGowrishankar Muthukrishnan /* check if div and rem are non-zero */ 190*36128a67SGowrishankar Muthukrishnan if (!r4 || !r) 191*36128a67SGowrishankar Muthukrishnan goto err; 192*36128a67SGowrishankar Muthukrishnan 193*36128a67SGowrishankar Muthukrishnan /* 0 < e < lcm */ 194*36128a67SGowrishankar Muthukrishnan if (!e) { 195*36128a67SGowrishankar Muthukrishnan int k = 0; 196*36128a67SGowrishankar Muthukrishnan 197*36128a67SGowrishankar Muthukrishnan e = BN_new(); 198*36128a67SGowrishankar Muthukrishnan do { 199*36128a67SGowrishankar Muthukrishnan RAND_add(&k, sizeof(k), 1); 200*36128a67SGowrishankar Muthukrishnan if (!BN_rand(e, 32, 1, 1)) 201*36128a67SGowrishankar Muthukrishnan goto err; 202*36128a67SGowrishankar Muthukrishnan 203*36128a67SGowrishankar Muthukrishnan if (!BN_gcd(r3, e, r4, ctx)) 204*36128a67SGowrishankar Muthukrishnan goto err; 205*36128a67SGowrishankar Muthukrishnan 206*36128a67SGowrishankar Muthukrishnan if (BN_is_one(r3)) 207*36128a67SGowrishankar Muthukrishnan break; 208*36128a67SGowrishankar Muthukrishnan } while (k++ < 10); 209*36128a67SGowrishankar Muthukrishnan 210*36128a67SGowrishankar Muthukrishnan if (k >= 10) { 211*36128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Error: insufficient %d retries to generate e", 212*36128a67SGowrishankar Muthukrishnan k); 213*36128a67SGowrishankar Muthukrishnan goto err; 214*36128a67SGowrishankar Muthukrishnan } 215*36128a67SGowrishankar Muthukrishnan } 216*36128a67SGowrishankar Muthukrishnan 217*36128a67SGowrishankar Muthukrishnan /* (de) mod lcm == 1 */ 218*36128a67SGowrishankar Muthukrishnan if (!BN_mod_inverse(d, e, r4, ctx)) 219*36128a67SGowrishankar Muthukrishnan goto err; 220*36128a67SGowrishankar Muthukrishnan 221*36128a67SGowrishankar Muthukrishnan if (!BN_gcd(r3, r1, e, ctx)) 222*36128a67SGowrishankar Muthukrishnan goto err; 223*36128a67SGowrishankar Muthukrishnan 224*36128a67SGowrishankar Muthukrishnan if (!BN_gcd(r4, r2, e, ctx)) 225*36128a67SGowrishankar Muthukrishnan goto err; 226*36128a67SGowrishankar Muthukrishnan 227*36128a67SGowrishankar Muthukrishnan /* check if gcd(p-1, e) and gcd(q-1, e) are 1 */ 228*36128a67SGowrishankar Muthukrishnan if (BN_is_one(r3) && BN_is_one(r4)) 229*36128a67SGowrishankar Muthukrishnan break; 230*36128a67SGowrishankar Muthukrishnan } 231*36128a67SGowrishankar Muthukrishnan 232*36128a67SGowrishankar Muthukrishnan if (i >= 10) { 233*36128a67SGowrishankar Muthukrishnan RTE_LOG(ERR, USER1, "Error: insufficient %d retries to generate p and q", i); 234*36128a67SGowrishankar Muthukrishnan goto err; 235*36128a67SGowrishankar Muthukrishnan } 236*36128a67SGowrishankar Muthukrishnan 237*36128a67SGowrishankar Muthukrishnan /* d mod (p-1) */ 238*36128a67SGowrishankar Muthukrishnan dp = BN_new(); 239*36128a67SGowrishankar Muthukrishnan if (!dp) 240*36128a67SGowrishankar Muthukrishnan goto err; 241*36128a67SGowrishankar Muthukrishnan 242*36128a67SGowrishankar Muthukrishnan if (!BN_mod(dp, d, r1, ctx)) 243*36128a67SGowrishankar Muthukrishnan goto err; 244*36128a67SGowrishankar Muthukrishnan 245*36128a67SGowrishankar Muthukrishnan /* d mod (q-1) */ 246*36128a67SGowrishankar Muthukrishnan dq = BN_new(); 247*36128a67SGowrishankar Muthukrishnan if (!dq) 248*36128a67SGowrishankar Muthukrishnan goto err; 249*36128a67SGowrishankar Muthukrishnan 250*36128a67SGowrishankar Muthukrishnan if (!BN_mod(dq, d, r2, ctx)) 251*36128a67SGowrishankar Muthukrishnan goto err; 252*36128a67SGowrishankar Muthukrishnan 253*36128a67SGowrishankar Muthukrishnan /* modinv of q and p */ 254*36128a67SGowrishankar Muthukrishnan qinv = BN_new(); 255*36128a67SGowrishankar Muthukrishnan if (!qinv) 256*36128a67SGowrishankar Muthukrishnan goto err; 257*36128a67SGowrishankar Muthukrishnan 258*36128a67SGowrishankar Muthukrishnan if (!BN_mod_inverse(qinv, q, p, ctx)) 259*36128a67SGowrishankar Muthukrishnan goto err; 260*36128a67SGowrishankar Muthukrishnan 261*36128a67SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(e), &vec.rsa.e); 262*36128a67SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(p), &vec.rsa.p); 263*36128a67SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(q), &vec.rsa.q); 264*36128a67SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(n), &vec.rsa.n); 265*36128a67SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(d), &vec.rsa.d); 266*36128a67SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(dp), &vec.rsa.dp); 267*36128a67SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(dq), &vec.rsa.dq); 268*36128a67SGowrishankar Muthukrishnan parse_uint8_hex_str("", BN_bn2hex(qinv), &vec.rsa.qinv); 269*36128a67SGowrishankar Muthukrishnan 270*36128a67SGowrishankar Muthukrishnan ret = 0; 271*36128a67SGowrishankar Muthukrishnan err: 272*36128a67SGowrishankar Muthukrishnan BN_CTX_end(ctx); 273*36128a67SGowrishankar Muthukrishnan BN_CTX_free(ctx); 274*36128a67SGowrishankar Muthukrishnan BN_free(m); 275*36128a67SGowrishankar Muthukrishnan BN_free(r); 276*36128a67SGowrishankar Muthukrishnan BN_free(p); 277*36128a67SGowrishankar Muthukrishnan BN_free(q); 278*36128a67SGowrishankar Muthukrishnan BN_free(n); 279*36128a67SGowrishankar Muthukrishnan BN_free(d); 280*36128a67SGowrishankar Muthukrishnan BN_free(e); 281*36128a67SGowrishankar Muthukrishnan return ret; 282*36128a67SGowrishankar Muthukrishnan } 283*36128a67SGowrishankar Muthukrishnan #else 284*36128a67SGowrishankar Muthukrishnan static int 285*36128a67SGowrishankar Muthukrishnan prepare_vec_rsa(void) 286*36128a67SGowrishankar Muthukrishnan { 287*36128a67SGowrishankar Muthukrishnan /* 288*36128a67SGowrishankar Muthukrishnan * Generate RSA values. 289*36128a67SGowrishankar Muthukrishnan */ 290*36128a67SGowrishankar Muthukrishnan return -ENOTSUP; 291*36128a67SGowrishankar Muthukrishnan } 292*36128a67SGowrishankar Muthukrishnan #endif /* USE_OPENSSL */ 293*36128a67SGowrishankar Muthukrishnan 294*36128a67SGowrishankar Muthukrishnan static int 295*36128a67SGowrishankar Muthukrishnan parse_test_rsa_json_interim_writeback(struct fips_val *val) 296*36128a67SGowrishankar Muthukrishnan { 297*36128a67SGowrishankar Muthukrishnan RTE_SET_USED(val); 298*36128a67SGowrishankar Muthukrishnan 299*36128a67SGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_SIGGEN) { 300*36128a67SGowrishankar Muthukrishnan json_t *obj; 301*36128a67SGowrishankar Muthukrishnan 302*36128a67SGowrishankar Muthukrishnan /* For siggen tests, RSA values can be created soon after 303*36128a67SGowrishankar Muthukrishnan * the test group data are parsed. 304*36128a67SGowrishankar Muthukrishnan */ 305*36128a67SGowrishankar Muthukrishnan if (vec.rsa.e.val) { 306*36128a67SGowrishankar Muthukrishnan rte_free(vec.rsa.e.val); 307*36128a67SGowrishankar Muthukrishnan vec.rsa.e.val = NULL; 308*36128a67SGowrishankar Muthukrishnan } 309*36128a67SGowrishankar Muthukrishnan 310*36128a67SGowrishankar Muthukrishnan if (prepare_vec_rsa() < 0) 311*36128a67SGowrishankar Muthukrishnan return -1; 312*36128a67SGowrishankar Muthukrishnan 313*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.n); 314*36128a67SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 315*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_group, "n", obj); 316*36128a67SGowrishankar Muthukrishnan 317*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.e); 318*36128a67SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 319*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_group, "e", obj); 320*36128a67SGowrishankar Muthukrishnan } 321*36128a67SGowrishankar Muthukrishnan 322*36128a67SGowrishankar Muthukrishnan return 0; 323*36128a67SGowrishankar Muthukrishnan } 324*36128a67SGowrishankar Muthukrishnan 325*36128a67SGowrishankar Muthukrishnan static int 326*36128a67SGowrishankar Muthukrishnan parse_test_rsa_json_writeback(struct fips_val *val) 327*36128a67SGowrishankar Muthukrishnan { 328*36128a67SGowrishankar Muthukrishnan json_t *tcId; 329*36128a67SGowrishankar Muthukrishnan 330*36128a67SGowrishankar Muthukrishnan RTE_SET_USED(val); 331*36128a67SGowrishankar Muthukrishnan 332*36128a67SGowrishankar Muthukrishnan tcId = json_object_get(json_info.json_test_case, "tcId"); 333*36128a67SGowrishankar Muthukrishnan 334*36128a67SGowrishankar Muthukrishnan json_info.json_write_case = json_object(); 335*36128a67SGowrishankar Muthukrishnan json_object_set(json_info.json_write_case, "tcId", tcId); 336*36128a67SGowrishankar Muthukrishnan 337*36128a67SGowrishankar Muthukrishnan if (info.op == FIPS_TEST_ASYM_KEYGEN) { 338*36128a67SGowrishankar Muthukrishnan json_t *obj; 339*36128a67SGowrishankar Muthukrishnan 340*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.seed); 341*36128a67SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 342*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "seed", obj); 343*36128a67SGowrishankar Muthukrishnan 344*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.n); 345*36128a67SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 346*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "n", obj); 347*36128a67SGowrishankar Muthukrishnan 348*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.e); 349*36128a67SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 350*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "e", obj); 351*36128a67SGowrishankar Muthukrishnan 352*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.p); 353*36128a67SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 354*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "p", obj); 355*36128a67SGowrishankar Muthukrishnan 356*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.q); 357*36128a67SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 358*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "q", obj); 359*36128a67SGowrishankar Muthukrishnan 360*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.d); 361*36128a67SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 362*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "d", obj); 363*36128a67SGowrishankar Muthukrishnan } else if (info.op == FIPS_TEST_ASYM_SIGGEN) { 364*36128a67SGowrishankar Muthukrishnan json_t *obj; 365*36128a67SGowrishankar Muthukrishnan 366*36128a67SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &vec.rsa.signature); 367*36128a67SGowrishankar Muthukrishnan obj = json_string(info.one_line_text); 368*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "signature", obj); 369*36128a67SGowrishankar Muthukrishnan } else if (info.op == FIPS_TEST_ASYM_SIGVER) { 370*36128a67SGowrishankar Muthukrishnan if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) 371*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "testPassed", json_true()); 372*36128a67SGowrishankar Muthukrishnan else 373*36128a67SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "testPassed", json_false()); 374*36128a67SGowrishankar Muthukrishnan } 375*36128a67SGowrishankar Muthukrishnan 376*36128a67SGowrishankar Muthukrishnan return 0; 377*36128a67SGowrishankar Muthukrishnan } 378*36128a67SGowrishankar Muthukrishnan 379*36128a67SGowrishankar Muthukrishnan static int 380*36128a67SGowrishankar Muthukrishnan parse_interim_str(const char *key, char *src, struct fips_val *val) 381*36128a67SGowrishankar Muthukrishnan { 382*36128a67SGowrishankar Muthukrishnan uint32_t i; 383*36128a67SGowrishankar Muthukrishnan 384*36128a67SGowrishankar Muthukrishnan RTE_SET_USED(val); 385*36128a67SGowrishankar Muthukrishnan 386*36128a67SGowrishankar Muthukrishnan if (strcmp(key, SIGTYPE_JSON_STR) == 0) { 387*36128a67SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(rsa_padding_types); i++) 388*36128a67SGowrishankar Muthukrishnan if (strstr(src, rsa_padding_types[i].desc)) { 389*36128a67SGowrishankar Muthukrishnan info.interim_info.rsa_data.padding = rsa_padding_types[i].padding; 390*36128a67SGowrishankar Muthukrishnan break; 391*36128a67SGowrishankar Muthukrishnan } 392*36128a67SGowrishankar Muthukrishnan 393*36128a67SGowrishankar Muthukrishnan if (i >= RTE_DIM(rsa_padding_types)) 394*36128a67SGowrishankar Muthukrishnan return -EINVAL; 395*36128a67SGowrishankar Muthukrishnan 396*36128a67SGowrishankar Muthukrishnan } else if (strcmp(key, MOD_JSON_STR) == 0) { 397*36128a67SGowrishankar Muthukrishnan info.interim_info.rsa_data.modulo = atoi(src); 398*36128a67SGowrishankar Muthukrishnan } else if (strcmp(key, HASH_JSON_STR) == 0) { 399*36128a67SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(rsa_auth_algs); i++) 400*36128a67SGowrishankar Muthukrishnan if (strstr(src, rsa_auth_algs[i].desc)) { 401*36128a67SGowrishankar Muthukrishnan info.interim_info.rsa_data.auth = rsa_auth_algs[i].auth; 402*36128a67SGowrishankar Muthukrishnan break; 403*36128a67SGowrishankar Muthukrishnan } 404*36128a67SGowrishankar Muthukrishnan 405*36128a67SGowrishankar Muthukrishnan if (i >= RTE_DIM(rsa_auth_algs)) 406*36128a67SGowrishankar Muthukrishnan return -EINVAL; 407*36128a67SGowrishankar Muthukrishnan 408*36128a67SGowrishankar Muthukrishnan } else if (strcmp(key, SALT_JSON_STR) == 0) { 409*36128a67SGowrishankar Muthukrishnan info.interim_info.rsa_data.saltlen = atoi(src); 410*36128a67SGowrishankar Muthukrishnan } else if (strcmp(key, TESTTYPE_JSON_STR) == 0) { 411*36128a67SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(rsa_test_types); i++) 412*36128a67SGowrishankar Muthukrishnan if (strstr(src, rsa_test_types[i].desc)) { 413*36128a67SGowrishankar Muthukrishnan info.parse_writeback = parse_test_rsa_json_writeback; 414*36128a67SGowrishankar Muthukrishnan break; 415*36128a67SGowrishankar Muthukrishnan } 416*36128a67SGowrishankar Muthukrishnan 417*36128a67SGowrishankar Muthukrishnan if (!info.parse_writeback || i >= RTE_DIM(rsa_test_types)) 418*36128a67SGowrishankar Muthukrishnan return -EINVAL; 419*36128a67SGowrishankar Muthukrishnan 420*36128a67SGowrishankar Muthukrishnan } else { 421*36128a67SGowrishankar Muthukrishnan return -EINVAL; 422*36128a67SGowrishankar Muthukrishnan } 423*36128a67SGowrishankar Muthukrishnan 424*36128a67SGowrishankar Muthukrishnan return 0; 425*36128a67SGowrishankar Muthukrishnan } 426*36128a67SGowrishankar Muthukrishnan 427*36128a67SGowrishankar Muthukrishnan static int 428*36128a67SGowrishankar Muthukrishnan parse_keygen_e_str(const char *key, char *src, struct fips_val *val) 429*36128a67SGowrishankar Muthukrishnan { 430*36128a67SGowrishankar Muthukrishnan parse_uint8_hex_str(key, src, val); 431*36128a67SGowrishankar Muthukrishnan 432*36128a67SGowrishankar Muthukrishnan /* For keygen tests, key "e" can be the end of input data 433*36128a67SGowrishankar Muthukrishnan * to generate RSA values. 434*36128a67SGowrishankar Muthukrishnan */ 435*36128a67SGowrishankar Muthukrishnan return prepare_vec_rsa(); 436*36128a67SGowrishankar Muthukrishnan } 437*36128a67SGowrishankar Muthukrishnan 438*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_keygen_interim_json_vectors[] = { 439*36128a67SGowrishankar Muthukrishnan {MOD_JSON_STR, parse_interim_str, NULL}, 440*36128a67SGowrishankar Muthukrishnan {HASH_JSON_STR, parse_interim_str, NULL}, 441*36128a67SGowrishankar Muthukrishnan {TESTTYPE_JSON_STR, parse_interim_str, NULL}, 442*36128a67SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 443*36128a67SGowrishankar Muthukrishnan }; 444*36128a67SGowrishankar Muthukrishnan 445*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_siggen_interim_json_vectors[] = { 446*36128a67SGowrishankar Muthukrishnan {SIGTYPE_JSON_STR, parse_interim_str, NULL}, 447*36128a67SGowrishankar Muthukrishnan {MOD_JSON_STR, parse_interim_str, NULL}, 448*36128a67SGowrishankar Muthukrishnan {HASH_JSON_STR, parse_interim_str, NULL}, 449*36128a67SGowrishankar Muthukrishnan {SALT_JSON_STR, parse_interim_str, NULL}, 450*36128a67SGowrishankar Muthukrishnan {TESTTYPE_JSON_STR, parse_interim_str, NULL}, 451*36128a67SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 452*36128a67SGowrishankar Muthukrishnan }; 453*36128a67SGowrishankar Muthukrishnan 454*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_sigver_interim_json_vectors[] = { 455*36128a67SGowrishankar Muthukrishnan {SIGTYPE_JSON_STR, parse_interim_str, NULL}, 456*36128a67SGowrishankar Muthukrishnan {MOD_JSON_STR, parse_interim_str, NULL}, 457*36128a67SGowrishankar Muthukrishnan {HASH_JSON_STR, parse_interim_str, NULL}, 458*36128a67SGowrishankar Muthukrishnan {SALT_JSON_STR, parse_interim_str, NULL}, 459*36128a67SGowrishankar Muthukrishnan {N_JSON_STR, parse_uint8_hex_str, &vec.rsa.n}, 460*36128a67SGowrishankar Muthukrishnan {E_JSON_STR, parse_uint8_hex_str, &vec.rsa.e}, 461*36128a67SGowrishankar Muthukrishnan {TESTTYPE_JSON_STR, parse_interim_str, NULL}, 462*36128a67SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 463*36128a67SGowrishankar Muthukrishnan }; 464*36128a67SGowrishankar Muthukrishnan 465*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_keygen_json_vectors[] = { 466*36128a67SGowrishankar Muthukrishnan {SEED_JSON_STR, parse_uint8_hex_str, &vec.rsa.seed}, 467*36128a67SGowrishankar Muthukrishnan {E_JSON_STR, parse_keygen_e_str, &vec.rsa.e}, 468*36128a67SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 469*36128a67SGowrishankar Muthukrishnan }; 470*36128a67SGowrishankar Muthukrishnan 471*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_siggen_json_vectors[] = { 472*36128a67SGowrishankar Muthukrishnan {MSG_JSON_STR, parse_uint8_hex_str, &vec.pt}, 473*36128a67SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 474*36128a67SGowrishankar Muthukrishnan }; 475*36128a67SGowrishankar Muthukrishnan 476*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_sigver_json_vectors[] = { 477*36128a67SGowrishankar Muthukrishnan {MSG_JSON_STR, parse_uint8_hex_str, &vec.pt}, 478*36128a67SGowrishankar Muthukrishnan {SIG_JSON_STR, parse_uint8_hex_str, &vec.rsa.signature}, 479*36128a67SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 480*36128a67SGowrishankar Muthukrishnan }; 481*36128a67SGowrishankar Muthukrishnan 482*36128a67SGowrishankar Muthukrishnan int 483*36128a67SGowrishankar Muthukrishnan parse_test_rsa_json_init(void) 484*36128a67SGowrishankar Muthukrishnan { 485*36128a67SGowrishankar Muthukrishnan json_t *keyfmt_obj = json_object_get(json_info.json_vector_set, "keyFormat"); 486*36128a67SGowrishankar Muthukrishnan json_t *mode_obj = json_object_get(json_info.json_vector_set, "mode"); 487*36128a67SGowrishankar Muthukrishnan const char *keyfmt_str = json_string_value(keyfmt_obj); 488*36128a67SGowrishankar Muthukrishnan const char *mode_str = json_string_value(mode_obj); 489*36128a67SGowrishankar Muthukrishnan 490*36128a67SGowrishankar Muthukrishnan info.callbacks = NULL; 491*36128a67SGowrishankar Muthukrishnan info.parse_writeback = NULL; 492*36128a67SGowrishankar Muthukrishnan info.interim_callbacks = NULL; 493*36128a67SGowrishankar Muthukrishnan info.parse_interim_writeback = NULL; 494*36128a67SGowrishankar Muthukrishnan 495*36128a67SGowrishankar Muthukrishnan if (strcmp(mode_str, "keyGen") == 0) { 496*36128a67SGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_KEYGEN; 497*36128a67SGowrishankar Muthukrishnan info.callbacks = rsa_keygen_json_vectors; 498*36128a67SGowrishankar Muthukrishnan info.interim_callbacks = rsa_keygen_interim_json_vectors; 499*36128a67SGowrishankar Muthukrishnan } else if (strcmp(mode_str, "sigGen") == 0) { 500*36128a67SGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_SIGGEN; 501*36128a67SGowrishankar Muthukrishnan info.callbacks = rsa_siggen_json_vectors; 502*36128a67SGowrishankar Muthukrishnan info.interim_callbacks = rsa_siggen_interim_json_vectors; 503*36128a67SGowrishankar Muthukrishnan info.parse_interim_writeback = parse_test_rsa_json_interim_writeback; 504*36128a67SGowrishankar Muthukrishnan } else if (strcmp(mode_str, "sigVer") == 0) { 505*36128a67SGowrishankar Muthukrishnan info.op = FIPS_TEST_ASYM_SIGVER; 506*36128a67SGowrishankar Muthukrishnan info.callbacks = rsa_sigver_json_vectors; 507*36128a67SGowrishankar Muthukrishnan info.interim_callbacks = rsa_sigver_interim_json_vectors; 508*36128a67SGowrishankar Muthukrishnan } else { 509*36128a67SGowrishankar Muthukrishnan return -EINVAL; 510*36128a67SGowrishankar Muthukrishnan } 511*36128a67SGowrishankar Muthukrishnan 512*36128a67SGowrishankar Muthukrishnan info.interim_info.rsa_data.privkey = RTE_RSA_KEY_TYPE_QT; 513*36128a67SGowrishankar Muthukrishnan if (keyfmt_str != NULL && strcmp(keyfmt_str, "standard") == 0) 514*36128a67SGowrishankar Muthukrishnan info.interim_info.rsa_data.privkey = RTE_RSA_KEY_TYPE_EXP; 515*36128a67SGowrishankar Muthukrishnan 516*36128a67SGowrishankar Muthukrishnan return 0; 517*36128a67SGowrishankar Muthukrishnan } 518*36128a67SGowrishankar Muthukrishnan 519*36128a67SGowrishankar Muthukrishnan #endif /* USE_JANSSON */ 520