- 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:
parent
8368731ae4
commit
70597d4b14
|
@ -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;
|
||||
ins = 0x2C;
|
||||
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;
|
||||
|
||||
ins = 0x2C;
|
||||
if (data->pin1.len == 0)
|
||||
p1 |= 2;
|
||||
if (data->pin2.len == 0)
|
||||
p1 |= 1;
|
||||
} else {
|
||||
p1 |= 0x01;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return SC_ERROR_NOT_SUPPORTED;
|
||||
|
|
|
@ -675,8 +675,8 @@ int do_change(int argc, char **argv)
|
|||
if (argc == 1) {
|
||||
/* set without verification */
|
||||
oldpinlen = 0;
|
||||
}
|
||||
else if (argv[0][0] == '"') {
|
||||
} else {
|
||||
if (argv[0][0] == '"') {
|
||||
for (s = argv[0] + 1, i = 0;
|
||||
i < sizeof(oldpin) && *s && *s != '"'; i++)
|
||||
oldpin[i] = *s++;
|
||||
|
@ -687,6 +687,7 @@ int do_change(int argc, char **argv)
|
|||
}
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
|
||||
if (argv[0][0] == '"') {
|
||||
for (s = argv[0] + 1, i = 0;
|
||||
|
@ -745,8 +746,8 @@ int do_unblock(int argc, char **argv)
|
|||
if (argc == 1) {
|
||||
/* set without verification */
|
||||
puklen = 0;
|
||||
}
|
||||
else if (argv[0][0] == '"') {
|
||||
} else {
|
||||
if (argv[0][0] == '"') {
|
||||
for (s = argv[0] + 1, i = 0;
|
||||
i < sizeof(puk) && *s && *s != '"'; i++)
|
||||
puk[i] = *s++;
|
||||
|
@ -757,6 +758,7 @@ int do_unblock(int argc, char **argv)
|
|||
}
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
|
||||
if (argv[0][0] == '"') {
|
||||
for (s = argv[0] + 1, i = 0;
|
||||
|
|
Loading…
Reference in New Issue