aboutsummaryrefslogtreecommitdiffstats
path: root/g10/card-util.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2003-09-30 17:34:38 +0000
committerWerner Koch <[email protected]>2003-09-30 17:34:38 +0000
commit316dc2fd60875bc102bd459a4b3d4a5a59086b02 (patch)
tree304a34a93df7ae9ccb34f26d36a684d6e8249338 /g10/card-util.c
parentMinor fixes (diff)
downloadgnupg-316dc2fd60875bc102bd459a4b3d4a5a59086b02.tar.gz
gnupg-316dc2fd60875bc102bd459a4b3d4a5a59086b02.zip
* keylist.c (print_card_serialno): New.
(list_keyblock_print): Use it here. * card-util.c (toggle_forcesig): New. (card_edit): New command "forcesig". * card-util.c (print_name, print_isoname): Use 0 and not LF fro the max_n arg of tty_print_utf8_string2. * call-agent.c (agent_scd_getattr): New. (learn_status_cb): Release values before assignment so that it can be used by getattr to update the structure. * card-util.c (change_pin): Simplified. We now have only a PIN and an Admin PIN.
Diffstat (limited to '')
-rw-r--r--g10/card-util.c81
1 files changed, 54 insertions, 27 deletions
diff --git a/g10/card-util.c b/g10/card-util.c
index f42efde61..1028cd373 100644
--- a/g10/card-util.c
+++ b/g10/card-util.c
@@ -44,7 +44,6 @@ change_pin (int chvno)
{
struct agent_card_info_s info;
int rc;
- int reset_mode = 0;
rc = agent_learn (&info);
if (rc)
@@ -70,17 +69,11 @@ change_pin (int chvno)
char *answer;
tty_printf ("\n");
- tty_printf ("1 - change signature PIN\n"
- "2 - change decryption and authentication PIN\n"
- "3 - change Admin's PIN\n"
- "R - toggle reset retry counter mode\n"
+ tty_printf ("1 - change PIN\n"
+ "2 - unblock PIN\n"
+ "3 - change Admin PIN\n"
"Q - quit\n");
tty_printf ("\n");
- if (reset_mode)
- {
- tty_printf ("Reset Retry Counter mode active\n");
- tty_printf ("\n");
- }
answer = cpr_get("cardutil.change_pin.menu",_("Your selection? "));
cpr_kill_prompt();
@@ -88,30 +81,35 @@ change_pin (int chvno)
continue;
rc = 0;
- if (reset_mode && *answer == '3')
+ if (*answer == '1')
{
- tty_printf ("Sorry, reset of the Admin PIN's retry counter "
- "is not possible.\n");
+ rc = agent_scd_change_pin (1);
+ if (rc)
+ tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc));
+ else
+ tty_printf ("PIN changed.\n");
}
- else if (*answer == '1' || *answer == '2' || *answer == '3')
+ else if (*answer == '2')
{
- rc = agent_scd_change_pin (*answer - '0' + (reset_mode?100:0));
+ rc = agent_scd_change_pin (101);
if (rc)
- tty_printf ("Error changing/resetting the PIN: %s\n",
- gpg_strerror (rc));
+ tty_printf ("Error unblocking the PIN: %s\n", gpg_strerror (rc));
else
- tty_printf ("New PIN successfully set.\n");
+ tty_printf ("PIN unblocked and new PIN set.\n");
}
- else if (*answer == 'r' || *answer == 'R')
+ else if (*answer == '3')
{
- reset_mode = !reset_mode;
+ 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");
}
else if (*answer == 'q' || *answer == 'Q')
{
break;
}
}
-
}
static const char *
@@ -175,7 +173,7 @@ print_name (FILE *fp, const char *text, const char *name)
if (fp)
print_utf8_string2 (fp, name, strlen (name), '\n');
else
- tty_print_utf8_string2 (name, strlen (name), '\n');
+ tty_print_utf8_string2 (name, strlen (name), 0);
}
else
tty_fprintf (fp, _("[not set]"));
@@ -207,7 +205,7 @@ print_isoname (FILE *fp, const char *text, const char *tag, const char *name)
else if (fp)
print_utf8_string2 (fp, given, strlen (given), '\n');
else
- tty_print_utf8_string2 (given, strlen (given), '\n');
+ tty_print_utf8_string2 (given, strlen (given), 0);
if (opt.with_colons)
putc (':', fp);
@@ -220,7 +218,7 @@ print_isoname (FILE *fp, const char *text, const char *tag, const char *name)
else if (fp)
print_utf8_string2 (fp, buf, strlen (buf), '\n');
else
- tty_print_utf8_string2 (buf, strlen (buf), '\n');
+ tty_print_utf8_string2 (buf, strlen (buf), 0);
xfree (buf);
}
else
@@ -339,7 +337,7 @@ card_status (FILE *fp)
print_name (fp, "URL of public key : ", info.pubkey_url);
print_name (fp, "Login data .......: ", info.login_data);
tty_fprintf (fp, "Signature PIN ....: %s\n",
- info.chv1_cached? _("cached"): _("not cached"));
+ info.chv1_cached? _("not forced"): _("forced"));
tty_fprintf (fp, "Max. PIN lengths .: %d %d %d\n",
info.chvmaxlen[0], info.chvmaxlen[1], info.chvmaxlen[2]);
tty_fprintf (fp, "PIN retry counter : %d %d %d\n",
@@ -542,6 +540,30 @@ change_sex (void)
}
+static void
+toggle_forcesig (void)
+{
+ struct agent_card_info_s info;
+ int rc;
+ int newstate;
+
+ memset (&info, 0, sizeof info);
+ rc = agent_scd_getattr ("CHV-STATUS", &info);
+ if (rc)
+ {
+ log_error ("error getting current status: %s\n", gpg_strerror (rc));
+ return;
+ }
+ newstate = !info.chv1_cached;
+ agent_release_card_info (&info);
+
+ rc = agent_scd_setattr ("CHV-STATUS-1", newstate? "\x01":"", 1);
+ if (rc)
+ log_error ("error toggling signature PIN flag: %s\n", gpg_strerror (rc));
+}
+
+
+
/* Menu to edit all user changeable values on an OpenPGP card. Only
Key creation is not handled here. */
void
@@ -551,7 +573,7 @@ card_edit (STRLIST commands)
cmdNOP = 0,
cmdQUIT, cmdHELP, cmdLIST, cmdDEBUG,
cmdNAME, cmdURL, cmdLOGIN, cmdLANG, cmdSEX,
-
+ cmdFORCESIG,
cmdINVCMD
};
@@ -572,9 +594,10 @@ card_edit (STRLIST commands)
{ N_("login") , cmdLOGIN , N_("change the login name") },
{ N_("lang") , cmdLANG , N_("change the language preferences") },
{ N_("sex") , cmdSEX , N_("change card holder's sex") },
+ { N_("forcesig"), cmdFORCESIG, N_("toggle the signature force PIN flag") },
{ NULL, cmdINVCMD }
};
-
+
enum cmdids cmd = cmdNOP;
int have_commands = !!commands;
int redisplay = 1;
@@ -692,6 +715,10 @@ card_edit (STRLIST commands)
change_sex ();
break;
+ case cmdFORCESIG:
+ toggle_forcesig ();
+ break;
+
case cmdQUIT:
goto leave;