- fixed change/unblock pin with implicit test

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@1547 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
okir 2003-10-21 08:59:11 +00:00
parent 8368731ae4
commit 70597d4b14
2 changed files with 58 additions and 41 deletions

View File

@ -791,7 +791,7 @@ static int iso7816_build_pin_apdu(struct sc_card *card,
struct sc_pin_cmd_data *data)
{
static u8 sbuf[SC_MAX_APDU_BUFFER_SIZE];
int r, len, pad = 0, ins, p1 = 0;
int r, len = 0, pad = 0, use_pin_pad = 0, ins, p1 = 0;
switch (data->pin_type) {
case SC_AC_CHV:
@ -802,37 +802,52 @@ static int iso7816_build_pin_apdu(struct sc_card *card,
if (data->flags & SC_PIN_CMD_NEED_PADDING)
pad = 1;
if (data->flags & SC_PIN_CMD_USE_PINPAD)
use_pin_pad = 1;
data->pin1.offset = 0;
if ((r = sc_build_pin(sbuf, sizeof(sbuf), &data->pin1, pad)) < 0)
return r;
len = r;
data->pin1.offset = 5;
switch (data->cmd) {
case SC_PIN_CMD_VERIFY:
ins = 0x20;
if ((r = sc_build_pin(sbuf, sizeof(sbuf), &data->pin1, pad)) < 0)
return r;
len = r;
break;
case SC_PIN_CMD_CHANGE:
data->pin1.offset = len;
ins = 0x24;
if (data->pin1.len != 0 || use_pin_pad) {
if ((r = sc_build_pin(sbuf, sizeof(sbuf), &data->pin1, pad)) < 0)
return r;
len += r;
} else {
/* implicit test */
p1 = 1;
}
data->pin2.offset = data->pin1.offset + len;
if ((r = sc_build_pin(sbuf+len, sizeof(sbuf)-len, &data->pin2, pad)) < 0)
return r;
len += r;
ins = 0x24;
if (data->pin1.len == 0)
p1 = 1;
break;
case SC_PIN_CMD_UNBLOCK:
data->pin1.offset = len;
if ((r = sc_build_pin(sbuf+len, sizeof(sbuf)-len, &data->pin2, pad)) < 0)
return r;
len += r;
ins = 0x2C;
if (data->pin1.len == 0)
p1 |= 2;
if (data->pin2.len == 0)
p1 |= 1;
if (data->pin1.len != 0 || use_pin_pad) {
if ((r = sc_build_pin(sbuf, sizeof(sbuf), &data->pin1, pad)) < 0)
return r;
len += r;
} else {
p1 |= 0x02;
}
if (data->pin2.len != 0 || use_pin_pad) {
data->pin2.offset = data->pin1.offset + len;
if ((r = sc_build_pin(sbuf+len, sizeof(sbuf)-len, &data->pin2, pad)) < 0)
return r;
len += r;
} else {
p1 |= 0x01;
}
break;
default:
return SC_ERROR_NOT_SUPPORTED;

View File

@ -675,18 +675,19 @@ int do_change(int argc, char **argv)
if (argc == 1) {
/* set without verification */
oldpinlen = 0;
}
else if (argv[0][0] == '"') {
for (s = argv[0] + 1, i = 0;
i < sizeof(oldpin) && *s && *s != '"'; i++)
oldpin[i] = *s++;
oldpinlen = i;
} else if (sc_hex_to_bin(argv[0], oldpin, &oldpinlen) != 0) {
printf("Invalid key value.\n");
goto usage;
} else {
if (argv[0][0] == '"') {
for (s = argv[0] + 1, i = 0;
i < sizeof(oldpin) && *s && *s != '"'; i++)
oldpin[i] = *s++;
oldpinlen = i;
} else if (sc_hex_to_bin(argv[0], oldpin, &oldpinlen) != 0) {
printf("Invalid key value.\n");
goto usage;
}
argc--;
argv++;
}
argc--;
argv++;
if (argv[0][0] == '"') {
for (s = argv[0] + 1, i = 0;
@ -745,18 +746,19 @@ int do_unblock(int argc, char **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;
} 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++;
}
argc--;
argv++;
if (argv[0][0] == '"') {
for (s = argv[0] + 1, i = 0;