aboutsummaryrefslogtreecommitdiffstats
path: root/sm
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2002-03-06 14:16:37 +0000
committerWerner Koch <[email protected]>2002-03-06 14:16:37 +0000
commit4e637f22851869020929ad541012e23d859fa1a9 (patch)
tree0d1f66624c4de4f1679c7e14a96e3b387848c4d6 /sm
parent* assuan-client.c (_assuan_read_from_server): Detect END. (diff)
downloadgnupg-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/ChangeLog5
-rw-r--r--sm/call-agent.c93
-rw-r--r--sm/gpgsm.c28
-rw-r--r--sm/gpgsm.h1
-rw-r--r--sm/import.c2
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)
}
+
+