diff options
author | Werner Koch <[email protected]> | 2002-03-06 14:16:37 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2002-03-06 14:16:37 +0000 |
commit | 4e637f22851869020929ad541012e23d859fa1a9 (patch) | |
tree | 0d1f66624c4de4f1679c7e14a96e3b387848c4d6 /scd/command.c | |
parent | * assuan-client.c (_assuan_read_from_server): Detect END. (diff) | |
download | gnupg-4e637f22851869020929ad541012e23d859fa1a9.tar.gz gnupg-4e637f22851869020929ad541012e23d859fa1a9.zip |
sm/
* gpgsm.c: New command --learn-card
* call-agent.c (learn_cb,gpgsm_agent_learn): New.
* gpgsm.c (main): Print error messages for non-implemented commands.
agent/
* learncard.c: New.
* divert-scd.c (ask_for_card): The serial number is binary so
convert it to hex here.
* findkey.c (agent_write_private_key): New.
* genkey.c (store_key): And use it here.
scd/
* pkdecrypt.c (agent_pkdecrypt): Changed the way the diversion is done.
* divert-scd.c (divert_pkdecrypt): Changed interface and
implemented it.
Diffstat (limited to 'scd/command.c')
-rw-r--r-- | scd/command.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/scd/command.c b/scd/command.c index 30191dd95..5186a2fd4 100644 --- a/scd/command.c +++ b/scd/command.c @@ -25,6 +25,7 @@ #include <string.h> #include <ctype.h> #include <unistd.h> +#include <ksba.h> #include "scdaemon.h" #include "../assuan/assuan.h" @@ -297,6 +298,65 @@ cmd_readcert (ASSUAN_CONTEXT ctx, char *line) } +/* READKEY <hexified_certid> + + Return the public key for the given cert or key ID as an standard + S-Expression. */ +static int +cmd_readkey (ASSUAN_CONTEXT ctx, char *line) +{ + CTRL ctrl = assuan_get_pointer (ctx); + int rc; + unsigned char *cert = NULL; + size_t ncert, n; + KsbaCert kc = NULL; + KsbaSexp p; + + if ((rc = open_card (ctrl))) + return rc; + + rc = card_read_cert (ctrl->card_ctx, line, &cert, &ncert); + if (rc) + { + log_error ("card_read_cert failed: %s\n", gnupg_strerror (rc)); + goto leave; + } + + kc = ksba_cert_new (); + if (!kc) + { + xfree (cert); + rc = GNUPG_Out_Of_Core; + goto leave; + } + rc = ksba_cert_init_from_mem (kc, cert, ncert); + if (rc) + { + log_error ("failed to parse the certificate: %s\n", ksba_strerror (rc)); + rc = map_ksba_err (rc); + goto leave; + } + + p = ksba_cert_get_public_key (kc); + if (!p) + { + rc = GNUPG_No_Public_Key; + goto leave; + } + + n = gcry_sexp_canon_len (p, 0, NULL, NULL); + rc = assuan_send_data (ctx, p, n); + rc = map_assuan_err (rc); + xfree (p); + + + leave: + ksba_cert_release (kc); + xfree (cert); + return map_to_assuan_status (rc); +} + + /* SETDATA <hexstring> @@ -449,6 +509,7 @@ register_commands (ASSUAN_CONTEXT ctx) { "SERIALNO", 0, cmd_serialno }, { "LEARN", 0, cmd_learn }, { "READCERT", 0, cmd_readcert }, + { "READKEY", 0, cmd_readkey }, { "SETDATA", 0, cmd_setdata }, { "PKSIGN", 0, cmd_pksign }, { "PKDECRYPT", 0,cmd_pkdecrypt }, |