diff --git a/g10/import.c b/g10/import.c index 02d6b7617..27bfece34 100644 --- a/g10/import.c +++ b/g10/import.c @@ -1318,7 +1318,7 @@ import_one (ctrl_t ctrl, function prints diagnostics and returns an error code. If BATCH is true the secret keys are stored by gpg-agent in the transfer format (i.e. no re-protection and aksing for passphrases). */ -static gpg_error_t +gpg_error_t transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats, kbnode_t sec_keyblock, int batch) { @@ -1389,8 +1389,11 @@ transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats, kbnode_t sec_ke if (!ski) BUG (); - stats->count++; - stats->secret_read++; + if (stats) + { + stats->count++; + stats->secret_read++; + } /* We ignore stub keys. The way we handle them in other parts of the code is by asking the agent whether any secret key is @@ -1561,7 +1564,8 @@ transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats, kbnode_t sec_ke if (opt.verbose) log_info (_("key %s: secret key imported\n"), keystr_from_pk_with_sub (main_pk, pk)); - stats->secret_imported++; + if (stats) + stats->secret_imported++; } else if ( gpg_err_code (err) == GPG_ERR_EEXIST ) { @@ -1569,7 +1573,8 @@ transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats, kbnode_t sec_ke log_info (_("key %s: secret key already exists\n"), keystr_from_pk_with_sub (main_pk, pk)); err = 0; - stats->secret_dups++; + if (stats) + stats->secret_dups++; } else { diff --git a/g10/keyedit.c b/g10/keyedit.c index d958db8f3..15500ef1d 100644 --- a/g10/keyedit.c +++ b/g10/keyedit.c @@ -1922,7 +1922,6 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr, case cmdBKUPTOCARD: case cmdCHECKBKUPKEY: - log_debug ("FIXME: This needs to be changed\n"); { /* Ask for a filename, check whether this is really a backup key as generated by the card generation, parse @@ -1975,6 +1974,7 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr, if (cmd == cmdCHECKBKUPKEY) { + log_debug ("FIXME: This needs to be changed\n"); /* PKT_public_key *sk = node->pkt->pkt.secret_key; */ /* switch (is_secret_key_protected (sk)) */ /* { */ @@ -1996,14 +1996,21 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr, /* } */ } else /* Store it. */ - { - if (card_store_subkey (node, 0)) - { - redisplay = 1; - sec_shadowing = 1; - } - } - release_kbnode (node); + { + /* We need to transfer it to gpg-agent. */ + err = transfer_secret_keys (ctrl, NULL, node, 1); + + /* Then, treat the pkt as a public key to call + card_store_subkey. */ + pkt->pkttype = PKT_PUBLIC_KEY; + + if (card_store_subkey (node, 0)) + { + redisplay = 1; + sec_shadowing = 1; + } + } + release_kbnode (node); } break; diff --git a/g10/main.h b/g10/main.h index c3a211407..06f2577ec 100644 --- a/g10/main.h +++ b/g10/main.h @@ -337,6 +337,8 @@ gpg_error_t import_old_secring (ctrl_t ctrl, const char *fname); import_stats_t import_new_stats_handle (void); void import_release_stats_handle (import_stats_t hd); void import_print_stats (import_stats_t hd); +gpg_error_t transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats, + kbnode_t sec_keyblock, int batch); int collapse_uids( KBNODE *keyblock );