diff options
Diffstat (limited to 'g10')
-rw-r--r-- | g10/ChangeLog | 12 | ||||
-rw-r--r-- | g10/card-util.c | 23 | ||||
-rw-r--r-- | g10/cardglue.c | 59 | ||||
-rw-r--r-- | g10/status.c | 3 | ||||
-rw-r--r-- | g10/status.h | 7 |
5 files changed, 81 insertions, 23 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog index cd0da9464..3ffe66fce 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,15 @@ +2005-03-07 Werner Koch <[email protected]> + + * cardglue.c (agent_scd_pkdecrypt, agent_scd_pksign) + (agent_scd_genkey, agent_scd_setattr, agent_scd_change_pin) + (agent_scd_checkpin, agent_openpgp_storekey): Make sure to send a + SC_OP_FAILURE after card operations which might change data. + * card-util.c (change_pin): Send a SC_OP_SUCCESS after a PIN has + been changed. + (change_name): Removed a debug output. + * status.h, status.c: New codes BAD_PASSPHRASE_PIN, SC_OP_FAILURE + and SC_OP_SUCCESS. + 2005-02-24 David Shaw <[email protected]> * keyedit.c (keyedit_menu): Only print the key signing hint when diff --git a/g10/card-util.c b/g10/card-util.c index cbf8ec606..5c0f76b93 100644 --- a/g10/card-util.c +++ b/g10/card-util.c @@ -77,7 +77,10 @@ change_pin (int chvno, int allow_admin) if (rc) tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc)); else - tty_printf ("PIN changed.\n"); + { + write_status (STATUS_SC_OP_SUCCESS); + tty_printf ("PIN changed.\n"); + } } else for (;;) @@ -103,7 +106,10 @@ change_pin (int chvno, int allow_admin) if (rc) tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc)); else - tty_printf ("PIN changed.\n"); + { + write_status (STATUS_SC_OP_SUCCESS); + tty_printf ("PIN changed.\n"); + } } else if (*answer == '2') { @@ -111,15 +117,21 @@ change_pin (int chvno, int allow_admin) if (rc) tty_printf ("Error unblocking the PIN: %s\n", gpg_strerror (rc)); else - tty_printf ("PIN unblocked and new PIN set.\n"); - } + { + write_status (STATUS_SC_OP_SUCCESS); + tty_printf ("PIN unblocked and new PIN set.\n"); + } + } else if (*answer == '3') { rc = agent_scd_change_pin (3); if (rc) tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc)); else - tty_printf ("PIN changed.\n"); + { + write_status (STATUS_SC_OP_SUCCESS); + tty_printf ("PIN changed.\n"); + } } else if (*answer == 'q' || *answer == 'Q') { @@ -529,7 +541,6 @@ change_name (void) return -1; } - log_debug ("setting Name to `%s'\n", isoname); rc = agent_scd_setattr ("DISP-NAME", isoname, strlen (isoname) ); if (rc) log_error ("error setting Name: %s\n", gpg_strerror (rc)); diff --git a/g10/cardglue.c b/g10/cardglue.c index a28f1c079..a700a34d1 100644 --- a/g10/cardglue.c +++ b/g10/cardglue.c @@ -1,5 +1,5 @@ /* cardglue.c - mainly dispatcher for card related functions. - * Copyright (C) 2003, 2004 Free Software Foundation, Inc. + * Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -737,12 +737,17 @@ agent_scd_setattr (const char *name, const unsigned char *value, size_t valuelen) { APP app; + int rc; app = current_app? current_app : open_card (); if (!app) return gpg_error (GPG_ERR_CARD); - return app->fnc.setattr (app, name, pin_cb, NULL, value, valuelen); + rc = app->fnc.setattr (app, name, pin_cb, NULL, value, valuelen); + + if (rc) + write_status (STATUS_SC_OP_FAILURE); + return rc; } @@ -805,6 +810,7 @@ agent_scd_genkey (struct agent_card_genkey_s *info, int keyno, int force) APP app; char keynostr[20]; struct ctrl_ctx_s ctrl; + int rc; app = current_app? current_app : open_card (); if (!app) @@ -815,9 +821,12 @@ agent_scd_genkey (struct agent_card_genkey_s *info, int keyno, int force) ctrl.status_cb = genkey_status_cb; ctrl.status_cb_arg = info; - return app->fnc.genkey (app, &ctrl, keynostr, - force? 1:0, - pin_cb, NULL); + rc = app->fnc.genkey (app, &ctrl, keynostr, + force? 1:0, + pin_cb, NULL); + if (rc) + write_status (STATUS_SC_OP_FAILURE); + return rc; } /* Send a PKSIGN command to the SCdaemon. */ @@ -840,13 +849,15 @@ agent_scd_pksign (const char *serialno, int hashalgo, rc = check_card_serialno (app, serialno); if (rc == -1) goto retry; - if (rc) - return rc; - return app->fnc.sign (app, serialno, hashalgo, + if (!rc) + rc = app->fnc.sign (app, serialno, hashalgo, pin_cb, NULL, indata, indatalen, r_buf, r_buflen); + if (rc) + write_status (STATUS_SC_OP_FAILURE); + return rc; } @@ -870,13 +881,15 @@ agent_scd_pkdecrypt (const char *serialno, rc = check_card_serialno (app, serialno); if (rc == -1) goto retry; - if (rc) - return rc; - return app->fnc.decipher (app, serialno, + if (!rc) + rc = app->fnc.decipher (app, serialno, pin_cb, NULL, indata, indatalen, r_buf, r_buflen); + if (rc) + write_status (STATUS_SC_OP_FAILURE); + return rc; } /* Change the PIN of an OpenPGP card or reset the retry counter. */ @@ -886,6 +899,7 @@ agent_scd_change_pin (int chvno) APP app; char chvnostr[20]; int reset = 0; + int rc; reset = (chvno >= 100); chvno %= 100; @@ -895,8 +909,11 @@ agent_scd_change_pin (int chvno) return gpg_error (GPG_ERR_CARD); sprintf (chvnostr, "%d", chvno); - return app->fnc.change_pin (app, NULL, chvnostr, reset, - pin_cb, NULL); + rc = app->fnc.change_pin (app, NULL, chvnostr, reset, + pin_cb, NULL); + if (rc) + write_status (STATUS_SC_OP_FAILURE); + return rc; } /* Perform a CHECKPIN operation. SERIALNO should be the serial @@ -906,12 +923,16 @@ int agent_scd_checkpin (const char *serialnobuf) { APP app; + int rc; app = current_app? current_app : open_card (); if (!app) return gpg_error (GPG_ERR_CARD); - return app->fnc.check_pin (app, serialnobuf, pin_cb, NULL); + rc = app->fnc.check_pin (app, serialnobuf, pin_cb, NULL); + if (rc) + write_status (STATUS_SC_OP_FAILURE); + return rc; } @@ -924,12 +945,16 @@ agent_openpgp_storekey (int keyno, const unsigned char *e, size_t elen) { APP app; + int rc; app = current_app? current_app : open_card (); if (!app) return gpg_error (GPG_ERR_CARD); - return app_openpgp_storekey (app, keyno, template, template_len, - created_at, m, mlen, e, elen, - pin_cb, NULL); + rc = app_openpgp_storekey (app, keyno, template, template_len, + created_at, m, mlen, e, elen, + pin_cb, NULL); + if (rc) + write_status (STATUS_SC_OP_FAILURE); + return rc; } diff --git a/g10/status.c b/g10/status.c index 1386ca91f..342622601 100644 --- a/g10/status.c +++ b/g10/status.c @@ -112,6 +112,7 @@ get_status_string ( int no ) case STATUS_ENC_TO : s = "ENC_TO"; break; case STATUS_NODATA : s = "NODATA"; break; case STATUS_BAD_PASSPHRASE : s = "BAD_PASSPHRASE"; break; + case STATUS_BAD_PASSPHRASE_PIN: s = "BAD_PASSPHRASE_PIN"; break; case STATUS_NO_PUBKEY : s = "NO_PUBKEY"; break; case STATUS_NO_SECKEY : s = "NO_SECKEY"; break; case STATUS_NEED_PASSPHRASE_SYM: s = "NEED_PASSPHRASE_SYM"; break; @@ -159,6 +160,8 @@ get_status_string ( int no ) case STATUS_PLAINTEXT : s = "PLAINTEXT"; break; case STATUS_PLAINTEXT_LENGTH:s = "PLAINTEXT_LENGTH"; break; case STATUS_SIG_SUBPACKET : s = "SIG_SUBPACKET"; break; + case STATUS_SC_OP_SUCCESS : s = "SC_OP_SUCCESS"; break; + case STATUS_SC_OP_FAILURE : s = "SC_OP_FAILURE"; break; default: s = "?"; break; } return s; diff --git a/g10/status.h b/g10/status.h index 67a889a9a..629c28afb 100644 --- a/g10/status.h +++ b/g10/status.h @@ -107,6 +107,13 @@ #define STATUS_NEED_PASSPHRASE_PIN 76 #define STATUS_SIG_SUBPACKET 77 +/* Extra status codes for certain smartcard operations. Primary + useful to double check that change PIN worked as expected. */ +#define STATUS_BAD_PASSPHRASE_PIN 78 +#define STATUS_SC_OP_FAILURE 79 +#define STATUS_SC_OP_SUCCESS 80 + + /*-- status.c --*/ void set_status_fd ( int fd ); int is_status_enabled ( void ); |