aboutsummaryrefslogtreecommitdiffstats
path: root/sm
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2009-03-20 19:04:47 +0000
committerWerner Koch <[email protected]>2009-03-20 19:04:47 +0000
commit36d681d98ecc224d2241b401278952b10fd8064a (patch)
treeda08eb4babff8e479ee14e441b8592af70ae85bb /sm
parentAdd missing file. (diff)
downloadgnupg-36d681d98ecc224d2241b401278952b10fd8064a.tar.gz
gnupg-36d681d98ecc224d2241b401278952b10fd8064a.zip
Fix keygrip computation for TCOS 3 cards.
Emit PROGRESS status lines during --learn-card.
Diffstat (limited to 'sm')
-rw-r--r--sm/ChangeLog8
-rw-r--r--sm/call-agent.c24
-rw-r--r--sm/keylist.c1
3 files changed, 32 insertions, 1 deletions
diff --git a/sm/ChangeLog b/sm/ChangeLog
index caf96eb80..518eb2b38 100644
--- a/sm/ChangeLog
+++ b/sm/ChangeLog
@@ -1,3 +1,11 @@
+2009-03-20 Werner Koch <[email protected]>
+
+ * keylist.c (list_internal_keys): Set released cert to NULL.
+
+ * call-agent.c (learn_status_cb): New.
+ (gpgsm_agent_learn): Use it.
+ (learn_cb): Send a progress for every certificate.
+
2009-03-18 Werner Koch <[email protected]>
* gpgsm.h (struct opt): Move field WITH_EPHEMERAL_KEYS to struct
diff --git a/sm/call-agent.c b/sm/call-agent.c
index a6ac6da36..3616ea936 100644
--- a/sm/call-agent.c
+++ b/sm/call-agent.c
@@ -668,6 +668,25 @@ gpgsm_agent_havekey (ctrl_t ctrl, const char *hexkeygrip)
static int
+learn_status_cb (void *opaque, const char *line)
+{
+ struct learn_parm_s *parm = opaque;
+
+ /* Pass progress data to the caller. */
+ if (!strncmp (line, "PROGRESS", 8) && (line[8]==' ' || !line[8]))
+ {
+ if (parm->ctrl)
+ {
+ for (line += 8; *line == ' '; line++)
+ ;
+ if (gpgsm_status (parm->ctrl, STATUS_PROGRESS, line))
+ return gpg_error (GPG_ERR_ASS_CANCELED);
+ }
+ }
+ return 0;
+}
+
+static int
learn_cb (void *opaque, const void *buffer, size_t length)
{
struct learn_parm_s *parm = opaque;
@@ -692,6 +711,8 @@ learn_cb (void *opaque, const void *buffer, size_t length)
return 0;
}
+ if (gpgsm_status (parm->ctrl, STATUS_PROGRESS, "learncard C 0 0"))
+ return gpg_error (GPG_ERR_ASS_CANCELED);
/* FIXME: this should go into import.c */
rc = ksba_cert_new (&cert);
@@ -755,7 +776,8 @@ gpgsm_agent_learn (ctrl_t ctrl)
learn_parm.data = &data;
rc = assuan_transact (agent_ctx, "LEARN --send",
learn_cb, &learn_parm,
- NULL, NULL, NULL, NULL);
+ NULL, NULL,
+ learn_status_cb, &learn_parm);
xfree (get_membuf (&data, &len));
if (rc)
return rc;
diff --git a/sm/keylist.c b/sm/keylist.c
index 8a9eaf5e7..78f919d8f 100644
--- a/sm/keylist.c
+++ b/sm/keylist.c
@@ -1391,6 +1391,7 @@ list_internal_keys (ctrl_t ctrl, strlist_t names, estream_t fp,
if (gpgsm_certs_identical_p (cert, lastcert))
{
ksba_cert_release (cert);
+ cert = NULL;
continue;
}