diff --git a/scd/app-help.c b/scd/app-help.c index 7774b5465..a542a53f2 100644 --- a/scd/app-help.c +++ b/scd/app-help.c @@ -58,7 +58,8 @@ app_help_count_bits (const unsigned char *a, size_t len) * there. The caller needs to call gcry_sexp_release on that. If * R_ALGO is not NULL the public key algorithm id of Libgcrypt is * stored there. If R_ALGOSTR is not NULL and the function succeeds a - * newly allocated algo string (e.g. "rsa2048") is stored there. */ + * newly allocated algo string (e.g. "rsa2048") is stored there. + * HEXKEYGRIP may be NULL if the caller is not interested in it. */ gpg_error_t app_help_get_keygrip_string_pk (const void *pk, size_t pklen, char *hexkeygrip, gcry_sexp_t *r_pkey, int *r_algo, @@ -77,7 +78,7 @@ app_help_get_keygrip_string_pk (const void *pk, size_t pklen, char *hexkeygrip, if (err) return err; /* Can't parse that S-expression. */ - if (!gcry_pk_get_keygrip (s_pkey, array)) + if (hexkeygrip && !gcry_pk_get_keygrip (s_pkey, array)) { gcry_sexp_release (s_pkey); return gpg_error (GPG_ERR_GENERAL); /* Failed to calculate the keygrip.*/ @@ -102,7 +103,8 @@ app_help_get_keygrip_string_pk (const void *pk, size_t pklen, char *hexkeygrip, else gcry_sexp_release (s_pkey); - bin2hex (array, KEYGRIP_LEN, hexkeygrip); + if (hexkeygrip) + bin2hex (array, KEYGRIP_LEN, hexkeygrip); return 0; } diff --git a/scd/command.c b/scd/command.c index fc1bb0145..11d61648b 100644 --- a/scd/command.c +++ b/scd/command.c @@ -471,11 +471,11 @@ static const char hlp_learn[] = "\n" "For certain cards, more information will be returned:\n" "\n" - " S KEY-FPR \n" + " S KEY-FPR \n" "\n" - "For OpenPGP cards this returns the stored fingerprints of the\n" + "For some cards this returns the stored fingerprints of the\n" "keys. This can be used check whether a key is available on the\n" - "card. NO may be 1, 2 or 3.\n" + "card. KEYREF may be 1, 2 or 3 for OpenPGP or a standard keyref.\n" "\n" " S CA-FPR \n" "\n" @@ -616,19 +616,19 @@ cmd_readcert (assuan_context_t ctx, char *line) static gpg_error_t do_readkey (card_t card, ctrl_t ctrl, const char *line, - int opt_info, int opt_nokey, - unsigned char **pk_p, size_t *pklen_p) + int opt_info, unsigned char **pk_p, size_t *pklen_p) { int rc; + int direct_readkey = 0; /* If the application supports the READKEY function we use that. Otherwise we use the old way by extracting it from the certificate. */ rc = app_readkey (card, ctrl, line, opt_info? APP_READKEY_FLAG_INFO : 0, - opt_nokey? NULL : pk_p, pklen_p); + pk_p, pklen_p); if (!rc) - ; /* Got the key. */ + direct_readkey = 1; /* Got the key. */ else if (gpg_err_code (rc) == GPG_ERR_UNSUPPORTED_OPERATION || gpg_err_code (rc) == GPG_ERR_NOT_FOUND) { @@ -651,7 +651,7 @@ do_readkey (card_t card, ctrl_t ctrl, const char *line, else log_error ("app_readkey failed: %s\n", gpg_strerror (rc)); - if (!rc && opt_info) + if (!rc && opt_info && !direct_readkey) { char keygripstr[KEYGRIP_LEN*2+1]; char *algostr; @@ -730,7 +730,7 @@ cmd_readkey (assuan_context_t ctx, char *line) if (direct) card_ref (card); - rc = do_readkey (card, ctrl, line, opt_info, opt_nokey, &pk, &pklen); + rc = do_readkey (card, ctrl, line, opt_info, &pk, &pklen); if (direct) card_unref (card);