2379
2380
const unsigned char *rsa_e, size_t rsa_e_len,
2380
2381
const unsigned char *rsa_p, size_t rsa_p_len,
2381
2382
const unsigned char *rsa_q, size_t rsa_q_len,
2383
const unsigned char *rsa_u, size_t rsa_u_len,
2384
const unsigned char *rsa_dp, size_t rsa_dp_len,
2385
const unsigned char *rsa_dq, size_t rsa_dq_len,
2382
2386
unsigned char **result, size_t *resultlen)
2384
2388
size_t rsa_e_reqlen;
2385
unsigned char privkey[7*(1+3)];
2389
unsigned char privkey[7*(1+3+3)];
2386
2390
size_t privkey_len;
2387
2391
unsigned char exthdr[2+2+3];
2388
2392
size_t exthdr_len;
2402
2406
case RSA_STD_N:
2405
2408
case RSA_CRT_N:
2406
return gpg_error (GPG_ERR_NOT_SUPPORTED);
2409
2412
return gpg_error (GPG_ERR_INV_VALUE);
2412
/* Get the required length for E. */
2413
rsa_e_reqlen = app->app_local->keyattr[keyno].e_bits/8;
2415
/* Get the required length for E. Rounded up to the nearest byte */
2416
rsa_e_reqlen = (app->app_local->keyattr[keyno].e_bits + 7) / 8;
2414
2417
assert (rsa_e_len <= rsa_e_reqlen);
2416
2419
/* Build the 7f48 cardholder private key template. */
2426
2429
tp += add_tlv (tp, 0x93, rsa_q_len);
2427
2430
datalen += rsa_q_len;
2432
if (app->app_local->keyattr[keyno].format == RSA_CRT
2433
|| app->app_local->keyattr[keyno].format == RSA_CRT_N)
2435
tp += add_tlv (tp, 0x94, rsa_u_len);
2436
datalen += rsa_u_len;
2437
tp += add_tlv (tp, 0x95, rsa_dp_len);
2438
datalen += rsa_dp_len;
2439
tp += add_tlv (tp, 0x96, rsa_dq_len);
2440
datalen += rsa_dq_len;
2429
2443
if (app->app_local->keyattr[keyno].format == RSA_STD_N
2430
2444
|| app->app_local->keyattr[keyno].format == RSA_CRT_N)
2479
2493
memcpy (tp, rsa_q, rsa_q_len);
2480
2494
tp += rsa_q_len;
2496
if (app->app_local->keyattr[keyno].format == RSA_CRT
2497
|| app->app_local->keyattr[keyno].format == RSA_CRT_N)
2499
memcpy (tp, rsa_u, rsa_u_len);
2501
memcpy (tp, rsa_dp, rsa_dp_len);
2503
memcpy (tp, rsa_dq, rsa_dq_len);
2482
2507
if (app->app_local->keyattr[keyno].format == RSA_STD_N
2483
2508
|| app->app_local->keyattr[keyno].format == RSA_CRT_N)
2826
2851
if (app->app_local->extcap.is_v2)
2853
unsigned char *rsa_u, *rsa_dp, *rsa_dq;
2854
size_t rsa_u_len, rsa_dp_len, rsa_dq_len;
2855
gcry_mpi_t mpi_e, mpi_p, mpi_q;
2856
gcry_mpi_t mpi_u = gcry_mpi_snew (0);
2857
gcry_mpi_t mpi_dp = gcry_mpi_snew (0);
2858
gcry_mpi_t mpi_dq = gcry_mpi_snew (0);
2859
gcry_mpi_t mpi_tmp = gcry_mpi_snew (0);
2862
/* Calculate the u, dp and dq components needed by RSA_CRT cards */
2863
gcry_mpi_scan (&mpi_e, GCRYMPI_FMT_USG, rsa_e, rsa_e_len, NULL);
2864
gcry_mpi_scan (&mpi_p, GCRYMPI_FMT_USG, rsa_p, rsa_p_len, NULL);
2865
gcry_mpi_scan (&mpi_q, GCRYMPI_FMT_USG, rsa_q, rsa_q_len, NULL);
2867
gcry_mpi_invm (mpi_u, mpi_q, mpi_p);
2868
gcry_mpi_sub_ui (mpi_tmp, mpi_p, 1);
2869
gcry_mpi_invm (mpi_dp, mpi_e, mpi_tmp);
2870
gcry_mpi_sub_ui (mpi_tmp, mpi_q, 1);
2871
gcry_mpi_invm (mpi_dq, mpi_e, mpi_tmp);
2873
gcry_mpi_aprint (GCRYMPI_FMT_USG, &rsa_u, &rsa_u_len, mpi_u);
2874
gcry_mpi_aprint (GCRYMPI_FMT_USG, &rsa_dp, &rsa_dp_len, mpi_dp);
2875
gcry_mpi_aprint (GCRYMPI_FMT_USG, &rsa_dq, &rsa_dq_len, mpi_dq);
2877
gcry_mpi_release (mpi_e);
2878
gcry_mpi_release (mpi_p);
2879
gcry_mpi_release (mpi_q);
2880
gcry_mpi_release (mpi_u);
2881
gcry_mpi_release (mpi_dp);
2882
gcry_mpi_release (mpi_dq);
2883
gcry_mpi_release (mpi_tmp);
2828
2885
/* Build the private key template as described in section 4.3.3.7 of
2829
2886
the OpenPGP card specs version 2.0. */
2832
2887
err = build_privkey_template (app, keyno,
2833
2888
rsa_n, rsa_n_len,
2834
2889
rsa_e, rsa_e_len,
2835
2890
rsa_p, rsa_p_len,
2836
2891
rsa_q, rsa_q_len,
2837
2895
&template, &template_len);