diff options
Diffstat (limited to 'scd/command.c')
-rw-r--r-- | scd/command.c | 62 |
1 files changed, 19 insertions, 43 deletions
diff --git a/scd/command.c b/scd/command.c index e1895c6e3..dd965a31b 100644 --- a/scd/command.c +++ b/scd/command.c @@ -513,9 +513,7 @@ cmd_readkey (assuan_context_t ctx, char *line) int rc; int advanced = 0; unsigned char *cert = NULL; - size_t ncert, n; - ksba_cert_t kc = NULL; - ksba_sexp_t p; + size_t ncert; unsigned char *pk; size_t pklen; @@ -526,60 +524,38 @@ cmd_readkey (assuan_context_t ctx, char *line) advanced = 1; line = skip_options (line); - line = xstrdup (line); /* Need a copy of the line. */ + /* 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 (ctrl->app_ctx, ctrl, advanced, line, &pk, &pklen); if (!rc) - { /* Yeah, got that key - send it back. */ - rc = assuan_send_data (ctx, pk, pklen); - xfree (pk); - xfree (line); - line = NULL; - goto leave; - } - - if (gpg_err_code (rc) != GPG_ERR_UNSUPPORTED_OPERATION) - log_error ("app_readkey failed: %s\n", gpg_strerror (rc)); - else + ; /* Yeah, got that key - send it back. */ + else if (gpg_err_code (rc) == GPG_ERR_UNSUPPORTED_OPERATION + || gpg_err_code (rc) == GPG_ERR_NOT_FOUND) { + /* Fall back to certificate reading. */ rc = app_readcert (ctrl->app_ctx, ctrl, line, &cert, &ncert); if (rc) log_error ("app_readcert failed: %s\n", gpg_strerror (rc)); + else + { + rc = app_help_pubkey_from_cert (cert, ncert, &pk, &pklen); + if (rc) + log_error ("failed to parse the certificate: %s\n", + gpg_strerror (rc)); + } } - xfree (line); - line = NULL; - if (rc) - goto leave; - - rc = ksba_cert_new (&kc); - if (rc) - goto leave; - - rc = ksba_cert_init_from_mem (kc, cert, ncert); - if (rc) - { - log_error ("failed to parse the certificate: %s\n", gpg_strerror (rc)); - goto leave; - } - - p = ksba_cert_get_public_key (kc); - if (!p) - { - rc = gpg_error (GPG_ERR_NO_PUBKEY); - goto leave; - } - - n = gcry_sexp_canon_len (p, 0, NULL, NULL); - rc = assuan_send_data (ctx, p, n); - xfree (p); + else + log_error ("app_readkey failed: %s\n", gpg_strerror (rc)); + if (!rc && pk && pklen) + rc = assuan_send_data (ctx, pk, pklen); - leave: - ksba_cert_release (kc); xfree (cert); + xfree (pk); + xfree (line); return rc; } |