From 59b214ec23b5e263788721a0180ac36e717f15be Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Thu, 26 Apr 2012 03:41:20 +0200 Subject: [PATCH] opensc-explorer: implemented `pace` --- src/tools/opensc-explorer.c | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/tools/opensc-explorer.c b/src/tools/opensc-explorer.c index c3eefc8a..32f1deee 100644 --- a/src/tools/opensc-explorer.c +++ b/src/tools/opensc-explorer.c @@ -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", " []", "present a PIN or key to the card" }, + { do_pace, + "pace", "{pin|can|puk|mrz} []", + "Establish a PACE channel" }, { do_change, "change", "CHV [[] ]", "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;