diff options
Diffstat (limited to 'g10/getkey.c')
-rw-r--r-- | g10/getkey.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/g10/getkey.c b/g10/getkey.c index d8c81c937..04ecf4fc8 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -3960,6 +3960,58 @@ enum_secret_keys (ctrl_t ctrl, void **context, PKT_public_key *sk) } } +gpg_error_t +get_seckey_default_or_card (ctrl_t ctrl, PKT_public_key *pk, + const byte *fpr_card, size_t fpr_len) +{ + gpg_error_t err; + strlist_t namelist = NULL; + + const char *def_secret_key = parse_def_secret_key (ctrl); + + if (def_secret_key) + add_to_strlist (&namelist, def_secret_key); + else if (fpr_card) + return get_pubkey_byfprint (ctrl, pk, NULL, fpr_card, fpr_len); + + if (!fpr_card + || (def_secret_key && def_secret_key[strlen (def_secret_key)-1] == '!')) + err = key_byname (ctrl, NULL, namelist, pk, 1, 0, NULL, NULL); + else + { /* Default key is specified and card key is also available. */ + kbnode_t k, keyblock = NULL; + + err = key_byname (ctrl, NULL, namelist, pk, 1, 0, &keyblock, NULL); + if (!err) + for (k = keyblock; k; k = k->next) + { + PKT_public_key *pk_candidate; + char fpr[MAX_FINGERPRINT_LEN]; + + if (k->pkt->pkttype != PKT_PUBLIC_KEY + &&k->pkt->pkttype != PKT_PUBLIC_SUBKEY) + continue; + + pk_candidate = k->pkt->pkt.public_key; + if (!pk_candidate->flags.valid) + continue; + if (!((pk_candidate->pubkey_usage & USAGE_MASK) & pk->req_usage)) + continue; + fingerprint_from_pk (pk_candidate, fpr, NULL); + if (!memcmp (fpr_card, fpr, fpr_len)) + { + release_public_key_parts (pk); + copy_public_key (pk, pk_candidate); + break; + } + } + release_kbnode (keyblock); + } + + free_strlist (namelist); + + return err; +} /********************************************* *********** User ID printing helpers ******* |