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 /sm | |
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 'sm')
-rw-r--r-- | sm/ChangeLog | 5 | ||||
-rw-r--r-- | sm/call-agent.c | 93 | ||||
-rw-r--r-- | sm/gpgsm.c | 28 | ||||
-rw-r--r-- | sm/gpgsm.h | 1 | ||||
-rw-r--r-- | sm/import.c | 2 |
5 files changed, 126 insertions, 3 deletions
diff --git a/sm/ChangeLog b/sm/ChangeLog index e47057eb7..756cb45f8 100644 --- a/sm/ChangeLog +++ b/sm/ChangeLog @@ -1,5 +1,10 @@ 2002-03-06 Werner Koch <[email protected]> + * 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. + * base64.c (base64_reader_cb): Use case insensitive compare of the Content-Type string to detect plain base-64. diff --git a/sm/call-agent.c b/sm/call-agent.c index 14e2fdf34..1982b228c 100644 --- a/sm/call-agent.c +++ b/sm/call-agent.c @@ -32,7 +32,7 @@ #include "gpgsm.h" #include "../assuan/assuan.h" #include "i18n.h" - +#include "keydb.h" /* fixme: Move this to import.c */ static ASSUAN_CONTEXT agent_ctx = NULL; static int force_pipe_server = 0; @@ -49,6 +49,11 @@ struct genkey_parm_s { size_t sexplen; }; +struct learn_parm_s { + int error; + ASSUAN_CONTEXT ctx; + struct membuf *data; +}; struct membuf { size_t len; @@ -218,7 +223,8 @@ membuf_data_cb (void *opaque, const void *buffer, size_t length) { struct membuf *data = opaque; - put_membuf (data, buffer, length); + if (buffer) + put_membuf (data, buffer, length); return 0; } @@ -520,3 +526,86 @@ gpgsm_agent_havekey (const char *hexkeygrip) return map_assuan_err (rc); } + +static AssuanError +learn_cb (void *opaque, const void *buffer, size_t length) +{ + struct learn_parm_s *parm = opaque; + size_t len; + char *buf; + KsbaCert cert; + int rc; + + if (parm->error) + return 0; + + if (buffer) + { + put_membuf (parm->data, buffer, length); + return 0; + } + /* END encountered - process what we have */ + buf = get_membuf (parm->data, &len); + if (!buf) + { + parm->error = GNUPG_Out_Of_Core; + return 0; + } + + + /* FIXME: this shoudl go inot import.c */ + cert = ksba_cert_new (); + if (!cert) + { + parm->error = GNUPG_Out_Of_Core; + return 0; + } + rc = ksba_cert_init_from_mem (cert, buf, len); + if (rc) + { + log_error ("failed to parse a certificate: %s\n", ksba_strerror (rc)); + ksba_cert_release (cert); + parm->error = map_ksba_err (rc); + return 0; + } + + rc = gpgsm_basic_cert_check (cert); + if (rc) + log_error ("invalid certificate: %s\n", gnupg_strerror (rc)); + else + { + keydb_store_cert (cert); + log_error ("certificate stored\n"); + } + + ksba_cert_release (cert); + init_membuf (parm->data, 4096); + return 0; +} + +/* Call the agent to learn about a smartcard */ +int +gpgsm_agent_learn () +{ + int rc; + struct learn_parm_s learn_parm; + struct membuf data; + size_t len; + + rc = start_agent (); + if (rc) + return rc; + + init_membuf (&data, 4096); + learn_parm.error = 0; + learn_parm.ctx = agent_ctx; + learn_parm.data = &data; + rc = assuan_transact (agent_ctx, "LEARN --send", + learn_cb, &learn_parm, + NULL, NULL, NULL, NULL); + xfree (get_membuf (&data, &len)); + if (rc) + return map_assuan_err (rc); + return learn_parm.error; +} + diff --git a/sm/gpgsm.c b/sm/gpgsm.c index 3aa35b78c..bc285034a 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -76,6 +76,7 @@ enum cmd_and_opt_values { aExportAll, aCheckKeys, aServer, + aLearnCard, oOptions, oDebug, @@ -217,6 +218,7 @@ static ARGPARSE_OPTS opts[] = { { aSendKeys, "send-keys" , 256, N_("export keys to a key server") }, { aRecvKeys, "recv-keys" , 256, N_("import keys from a key server") }, { aImport, "import", 256 , N_("import/merge keys")}, + { aLearnCard, "learn-card", 256 ,N_("register a smartcard")}, { aServer, "server", 256, N_("run in server mode")}, @@ -709,6 +711,8 @@ main ( int argc, char **argv) case aListKeys: set_cmd (&cmd, aListKeys); break; case aListSecretKeys: set_cmd (&cmd, aListSecretKeys); break; + case aLearnCard: set_cmd (&cmd, aLearnCard); break; + case aDeleteKey: set_cmd (&cmd, aDeleteKey); greeting=1; @@ -727,6 +731,7 @@ main ( int argc, char **argv) case aClearsign: set_cmd (&cmd, aClearsign); break; case aVerify: set_cmd (&cmd, aVerify); break; + /* output encoding selection */ case oArmor: ctrl.create_pem = 1; @@ -1069,6 +1074,7 @@ main ( int argc, char **argv) break; case aSignEncr: /* sign and encrypt the given file */ + log_error ("this command has not yet been implemented\n"); #if 0 if (argc > 1) wrong_args(_("--sign --encrypt [filename]")); @@ -1088,6 +1094,7 @@ main ( int argc, char **argv) break; case aClearsign: /* make a clearsig */ + log_error ("this command has not yet been implemented\n"); #if 0 if (argc > 1) wrong_args (_("--clearsign [filename]")); @@ -1109,6 +1116,7 @@ main ( int argc, char **argv) break; case aVerifyFiles: + log_error ("this command has not yet been implemented\n"); /* if ((rc = verify_files( argc, argv ))) */ /* log_error ("verify files failed: %s\n", gpg_errstr(rc) ); */ break; @@ -1125,6 +1133,7 @@ main ( int argc, char **argv) case aDeleteKey: if (argc != 1) wrong_args(_("--delete-key user-id")); + log_error ("this command has not yet been implemented\n"); /* username = make_username (fname); */ /* if( (rc = delete_key(username)) ) */ /* log_error ("%s: delete key failed: %s\n", username, gpg_errstr(rc) ); */ @@ -1146,6 +1155,7 @@ main ( int argc, char **argv) break; case aKeygen: /* generate a key */ + log_error ("this function is not yet available from the commandline\n"); /* if (opt.batch) */ /* { */ /* if (argc > 1) */ @@ -1169,10 +1179,12 @@ main ( int argc, char **argv) gpgsm_import (&ctrl, open_read (*argv)); } break; + case aExport: case aSendKeys: case aRecvKeys: + log_error ("this command has not yet been implemented\n"); /* sl = NULL; */ /* for ( ; argc; argc--, argv++ ) */ /* add_to_strlist (&sl, *argv); */ @@ -1185,7 +1197,21 @@ main ( int argc, char **argv) /* free_strlist (sl); */ break; - default: + + case aLearnCard: + if (argc) + wrong_args ("--learn-card"); + else + { + int rc = gpgsm_agent_learn (); + if (rc) + log_error ("error learning card: %s\n", gnupg_strerror (rc)); + } + break; + + + default: + log_error ("invalid command\n"); if (argc > 1) wrong_args(_("[filename]")); /* Issue some output for the unix newbie */ diff --git a/sm/gpgsm.h b/sm/gpgsm.h index bb75c56d1..fa5e3a003 100644 --- a/sm/gpgsm.h +++ b/sm/gpgsm.h @@ -216,6 +216,7 @@ int gpgsm_agent_genkey (KsbaConstSexp keyparms, KsbaSexp *r_pubkey); int gpgsm_agent_istrusted (KsbaCert cert); int gpgsm_agent_havekey (const char *hexkeygrip); int gpgsm_agent_marktrusted (KsbaCert cert); +int gpgsm_agent_learn (void); /*-- call-dirmngr.c --*/ int gpgsm_dirmngr_isvalid (KsbaCert cert); diff --git a/sm/import.c b/sm/import.c index 02db65555..80da8392a 100644 --- a/sm/import.c +++ b/sm/import.c @@ -86,3 +86,5 @@ gpgsm_import (CTRL ctrl, int in_fd) } + + |