aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2021-02-22 18:28:45 +0100
committerWerner Koch <wk@gnupg.org>2021-02-22 18:28:45 +0100
commit2490f4e8e1d1feecb44aefa79bd71f5f8b06c9a4 (patch)
treec753b28b18146bef1b8d644592f0130c1bc6b490
parent488eaedc9a332d8164dea22e469354fc10b0a253 (diff)
downloadgnupg-2490f4e8e1d1feecb44aefa79bd71f5f8b06c9a4.tar.gz
scd: Fix readkey --info in case a readkey command is available.
* scd/command.c (do_readkey): Make --info also work if a readkey command is available. * scd/app-p15.c (cdf_object_from_certid): Fix a but introduced with the previous commit.
-rw-r--r--scd/app-p15.c4
-rw-r--r--scd/command.c72
2 files changed, 35 insertions, 41 deletions
diff --git a/scd/app-p15.c b/scd/app-p15.c
index 92518258e..581798d2b 100644
--- a/scd/app-p15.c
+++ b/scd/app-p15.c
@@ -768,8 +768,8 @@ cdf_object_from_certid (app_t app, const char *certid, cdf_object_t *r_cdf)
err = cdf_object_from_objid (app, objidlen, objid, &cdf);
xfree (objid);
- if (!cdf)
- return gpg_error (GPG_ERR_NOT_FOUND);
+ if (err)
+ return err;
*r_cdf = cdf;
return 0;
}
diff --git a/scd/command.c b/scd/command.c
index 258a9022d..0e5bcdc42 100644
--- a/scd/command.c
+++ b/scd/command.c
@@ -620,61 +620,55 @@ do_readkey (card_t card, ctrl_t ctrl, const char *line,
opt_info? APP_READKEY_FLAG_INFO : 0,
opt_nokey? NULL : pk_p, pklen_p);
if (!rc)
- /* Okay, got that key. */
- return 0;
-
- if (gpg_err_code (rc) == GPG_ERR_UNSUPPORTED_OPERATION
- || gpg_err_code (rc) == GPG_ERR_NOT_FOUND)
+ ; /* Got the key. */
+ else if (gpg_err_code (rc) == GPG_ERR_UNSUPPORTED_OPERATION
+ || gpg_err_code (rc) == GPG_ERR_NOT_FOUND)
{
+ /* Fall back to certificate reading. */
unsigned char *cert = NULL;
size_t ncert;
- /* Fall back to certificate reading. */
rc = app_readcert (card, ctrl, line, &cert, &ncert);
if (rc)
+ log_error ("app_readcert failed: %s\n", gpg_strerror (rc));
+ else
{
- log_error ("app_readcert failed: %s\n", gpg_strerror (rc));
- return rc;
+ rc = app_help_pubkey_from_cert (cert, ncert, pk_p, pklen_p);
+ xfree (cert);
+ if (rc)
+ log_error ("failed to parse the certificate: %s\n",
+ gpg_strerror (rc));
}
+ }
+ else
+ log_error ("app_readkey failed: %s\n", gpg_strerror (rc));
- rc = app_help_pubkey_from_cert (cert, ncert, pk_p, pklen_p);
- xfree (cert);
+ if (!rc && opt_info)
+ {
+ char keygripstr[KEYGRIP_LEN*2+1];
+ char *algostr;
+
+ rc = app_help_get_keygrip_string_pk (*pk_p, *pklen_p,
+ keygripstr, NULL, NULL,
+ &algostr);
if (rc)
{
- log_error ("failed to parse the certificate: %s\n",
+ log_error ("app_help_get_keygrip_string failed: %s\n",
gpg_strerror (rc));
return rc;
}
- if (opt_info)
- {
- char keygripstr[KEYGRIP_LEN*2+1];
- char *algostr;
-
- rc = app_help_get_keygrip_string_pk (*pk_p, *pklen_p,
- keygripstr, NULL, NULL,
- &algostr);
- if (rc)
- {
- log_error ("app_help_get_keygrip_string failed: %s\n",
- gpg_strerror (rc));
- return rc;
- }
-
- /* FIXME: Using LINE is not correct because it might be an
- * OID and has not been canonicalized (i.e. uppercased). */
- send_status_info (ctrl, "KEYPAIRINFO",
- keygripstr, strlen (keygripstr),
- line, strlen (line),
- "-", (size_t)1,
- "-", (size_t)1,
- algostr, strlen (algostr),
- NULL, (size_t)0);
- xfree (algostr);
- }
+ /* FIXME: Using LINE is not correct because it might be an
+ * OID and has not been canonicalized (i.e. uppercased). */
+ send_status_info (ctrl, "KEYPAIRINFO",
+ keygripstr, strlen (keygripstr),
+ line, strlen (line),
+ "-", (size_t)1,
+ "-", (size_t)1,
+ algostr, strlen (algostr),
+ NULL, (size_t)0);
+ xfree (algostr);
}
- else
- log_error ("app_readkey failed: %s\n", gpg_strerror (rc));
return rc;
}