static int do_unblock(int argc, char **argv) { int ref, r; u8 puk[30]; u8 newpin[30]; size_t puklen = 0; size_t newpinlen = 0; if (argc < 1 || argc > 3) goto usage; if (strncasecmp(argv[0], "CHV", 3)) { printf("Invalid type.\n"); goto usage; } if (sscanf(argv[0] + 3, "%d", &ref) != 1) { printf("Invalid key reference.\n"); goto usage; } if (argc > 1) { puklen = sizeof(puk); if (parse_string_or_hexdata(argv[1], puk, &puklen) != 0) { printf("Invalid key value.\n"); goto usage; } } if (argc > 2) { newpinlen = sizeof(newpin); if (parse_string_or_hexdata(argv[2], newpin, &newpinlen) != 0) { printf("Invalid key value.\n"); goto usage; } } r = sc_reset_retry_counter (card, SC_AC_CHV, ref, puklen ? puk : NULL, puklen, newpinlen ? newpin : NULL, newpinlen); if (r) { if (r == SC_ERROR_PIN_CODE_INCORRECT) printf("Incorrect code.\n"); printf("Unable to unblock PIN code: %s\n", sc_strerror(r)); return -1; } printf("PIN unblocked.\n"); return 0; usage: printf("Usage: unblock CHV<pin ref> [<puk> [<new pin>]]\n"); printf("PUK and PIN values can be hexadecimal, ASCII, empty (\"\") or absent\n"); printf("Examples:\n"); printf("\tUnblock PIN and set a new value: unblock CHV2 00:00:00:00:00:00 \"foobar\"\n"); printf("\tUnblock PIN keeping the old value: unblock CHV2 00:00:00:00:00:00 \"\"\n"); printf("\tSet new PIN value: unblock CHV2 \"\" \"foobar\"\n"); printf("Examples with pinpad:\n"); printf("\tUnblock PIN: new PIN value is prompted by pinpad: unblock CHV2 00:00:00:00:00:00\n"); printf("\tSet PIN: new PIN value is prompted by pinpad: unblock CHV2 \"\"\n"); printf("\tUnblock PIN: unblock code and new PIN value are prompted by pinpad: unblock CHV2\n"); return -1; }
static int do_unblock(int argc, char **argv) { int ref, r; u8 puk_buf[30], *puk = NULL; u8 newpin_buf[30], *newpin = NULL; const char *s; size_t puklen = sizeof(puk_buf), i; size_t newpinlen = sizeof(newpin_buf); if (argc < 1 || argc > 3) goto usage; if (strncasecmp(argv[0], "CHV", 3)) { printf("Invalid type.\n"); goto usage; } if (sscanf(argv[0] + 3, "%d", &ref) != 1) { printf("Invalid key reference.\n"); goto usage; } argc--; argv++; if (argc == 0) { puklen = 0; puk = NULL; } else { if (argv[0][0] == '"') { for (s = argv[0] + 1, i = 0; i < sizeof(puk_buf) && *s && *s != '"'; i++) puk_buf[i] = *s++; puklen = i; } else if (sc_hex_to_bin(argv[0], puk_buf, &puklen) != 0) { printf("Invalid key value.\n"); goto usage; } puk = &puk_buf[0]; argc--; argv++; } if (argc) { if (argv[0][0] == '"') { for (s = argv[0] + 1, i = 0; i < sizeof(newpin_buf) && *s && *s != '"'; i++) newpin_buf[i] = *s++; newpinlen = i; } else if (sc_hex_to_bin(argv[0], newpin_buf, &newpinlen) != 0) { printf("Invalid key value.\n"); goto usage; } newpin = &newpin_buf[0]; } else { newpinlen = 0; newpin = NULL; } r = sc_reset_retry_counter (card, SC_AC_CHV, ref, puk, puklen, newpin, newpinlen); if (r) { if (r == SC_ERROR_PIN_CODE_INCORRECT) printf("Incorrect code.\n"); printf("Unable to unblock PIN code: %s\n", sc_strerror(r)); return -1; } printf("PIN unblocked.\n"); return 0; usage: printf("Usage: unblock CHV<pin ref> [<puk>] [<new pin>]\n"); printf("PUK and PIN values can be hexadecimal, ASCII, empty (\"\") or absent\n"); printf("Examples:\n"); printf("\tUnblock PIN and set a new value: unblock CHV2 00:00:00:00:00:00 \"foobar\"\n"); printf("\tUnblock PIN keeping the old value: unblock CHV2 00:00:00:00:00:00 \"\"\n"); printf("\tSet new PIN value: unblock CHV2 \"\" \"foobar\"\n"); printf("Examples with pinpad:\n"); printf("\tUnblock PIN: new PIN value is prompted by pinpad: unblock CHV2 00:00:00:00:00:00\n"); printf("\tSet PIN: new PIN value is prompted by pinpad: unblock CHV2 \"\"\n"); printf("\tUnblock PIN: unblock code and new PIN value are prompted by pinpad: unblock CHV2\n"); return -1; }
static int do_unblock(int argc, char **argv) { int ref, r; u8 puk[30]; u8 newpin[30]; const char *s; size_t puklen = sizeof(puk), i; size_t newpinlen = sizeof(newpin); if (argc < 2 || argc > 3) goto usage; if (strncasecmp(argv[0], "CHV", 3)) { printf("Invalid type.\n"); goto usage; } if (sscanf(argv[0] + 3, "%d", &ref) != 1) { printf("Invalid key reference.\n"); goto usage; } argc--; argv++; if (argc == 1) { /* set without verification */ puklen = 0; } else { if (argv[0][0] == '"') { for (s = argv[0] + 1, i = 0; i < sizeof(puk) && *s && *s != '"'; i++) puk[i] = *s++; puklen = i; } else if (sc_hex_to_bin(argv[0], puk, &puklen) != 0) { printf("Invalid key value.\n"); goto usage; } argc--; argv++; } if (argv[0][0] == '"') { for (s = argv[0] + 1, i = 0; i < sizeof(newpin) && *s && *s != '"'; i++) newpin[i] = *s++; newpinlen = i; } else if (sc_hex_to_bin(argv[0], newpin, &newpinlen) != 0) { printf("Invalid key value.\n"); goto usage; } r = sc_reset_retry_counter (card, SC_AC_CHV, ref, puk, puklen, newpin, newpinlen); if (r) { if (r == SC_ERROR_PIN_CODE_INCORRECT) printf("Incorrect code.\n"); printf("Unable to unblock PIN code: %s\n", sc_strerror(r)); return -1; } printf("PIN unblocked.\n"); return 0; usage: printf("Usage: unblock CHV<pin ref> [<puk>] <new pin>\n"); printf("Example: unblock CHV2 00:00:00:00:00:00 \"foobar\"\n"); return -1; }