opensc-explorer: implemented `pace`

This commit is contained in:
Frank Morgner 2012-04-26 03:41:20 +02:00
parent 7b630962c1
commit 59b214ec23
1 changed files with 43 additions and 0 deletions

View File

@ -85,6 +85,7 @@ static int do_create(int argc, char **argv);
static int do_mkdir(int argc, char **argv);
static int do_delete(int argc, char **argv);
static int do_verify(int argc, char **argv);
static int do_pace(int argc, char **argv);
static int do_change(int argc, char **argv);
static int do_unblock(int argc, char **argv);
static int do_get(int argc, char **argv);
@ -140,6 +141,9 @@ static struct command cmds[] = {
{ do_verify,
"verify", "<key type><key ref> [<pin>]",
"present a PIN or key to the card" },
{ do_pace,
"pace", "{pin|can|puk|mrz} [<secret>]",
"Establish a PACE channel" },
{ do_change,
"change", "CHV<pin ref> [[<old pin>] <new pin>]",
"change a PIN" },
@ -944,6 +948,45 @@ usage:
}
static int do_pace(int argc, char **argv)
{
int r;
struct establish_pace_channel_input pace_input;
struct establish_pace_channel_output pace_output;
memset(&pace_input, 0, sizeof(pace_input));
memset(&pace_output, 0, sizeof(pace_output));
switch (argc) {
case 2:
pace_input.pin = (unsigned char *) argv[1];
/* fall through */
case 1:
if (strcmp(argv[0], "pin") == 0)
pace_input.pin_id = PACE_PIN_ID_PIN;
else if (strcmp(argv[0], "puk") == 0)
pace_input.pin_id = PACE_PIN_ID_PUK;
else if (strcmp(argv[0], "can") == 0)
pace_input.pin_id = PACE_PIN_ID_CAN;
else if (strcmp(argv[0], "mrz") == 0)
pace_input.pin_id = PACE_PIN_ID_MRZ;
else
return usage(do_pace);
break;
default:
return usage(do_pace);
}
r = sc_perform_pace(card, &pace_input, &pace_output);
if (r) {
printf("PACE failed: %s\n", sc_strerror(r));
return -1;
}
printf("Established PACE channel.\n");
return 0;
}
static int do_change(int argc, char **argv)
{
int ref, r, tries_left = -1;