Skip to content

Commit

Permalink
Initialize PIN logged_in field for cards that do not support PIN info
Browse files Browse the repository at this point in the history
Commit 2f10de4 ("use sc_pkcs15_get_pin_info in C_GetTokenInfo")
introduced dependency of logged in state returned for session
by C_GetTokenInfo() on logged_in field of that session slot PIN.

This field is updated by sending pin_cmd of type SC_PIN_CMD_GET_INFO to
card.
However, not all cards support such pin_cmd type (in fact, majority of
them don't). In this case logged_in field is usually left zero-initialized
which means SC_PIN_STATE_LOGGED_OUT.

With such logged_in field value C_GetTokenInfo() always returns
CKS_R{O,W}_PUBLIC_SESSION, instead of CKS_R{O,W}_USER_FUNCTIONS when
logged in.

At least Firefox (and probably other NSS-based software, too) is confused
by such value and keeps repeating PIN prompts a few times until it
ultimately considers that logging in to this slot has failed.

Fix this by initializing PIN logged_in field to SC_PIN_STATE_UNKNOWN for
cards that do not support SC_PIN_CMD_GET_INFO pin_cmd.

Signed-off-by: Maciej S. Szmigiero <[email protected]>
  • Loading branch information
maciejsszmigiero committed Aug 11, 2016
1 parent 0c33423 commit 2fd7aaf
Show file tree
Hide file tree
Showing 15 changed files with 15 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-actalis.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ static int sc_pkcs15emu_add_pin(sc_pkcs15_card_t *p15card,
info.attrs.pin.flags = flags;
info.attrs.pin.pad_char = pad_char;
info.tries_left = tries_left;
info.logged_in = SC_PIN_STATE_UNKNOWN;

if (path)
info.path = *path;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-atrust-acos.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,7 @@ static int sc_pkcs15emu_atrust_acos_init(sc_pkcs15_card_t *p15card)
pin_info.attrs.pin.pad_char = pins[i].pad_char;
sc_format_path(pins[i].path, &pin_info.path);
pin_info.tries_left = -1;
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;

strlcpy(pin_obj.label, pins[i].label, sizeof(pin_obj.label));
pin_obj.flags = pins[i].obj_flags;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-gemsafeGPK.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,7 @@ static int sc_pkcs15emu_gemsafeGPK_init(sc_pkcs15_card_t *p15card)
pin_info.path.value[2] = dfpath >> 8;
pin_info.path.value[3] = dfpath & 0xff;
pin_info.tries_left = -1;
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;

strlcpy(pin_obj.label, pins[i].label, sizeof(pin_obj.label));
pin_obj.flags = pins[i].obj_flags;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-gemsafeV1.c
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ sc_pkcs15emu_add_pin(sc_pkcs15_card_t *p15card,
info->attrs.pin.flags = flags;
info->attrs.pin.pad_char = pad_char;
info->tries_left = tries_left;
info->logged_in = SC_PIN_STATE_UNKNOWN;

if (path)
info->path = *path;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-infocamere.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ static int sc_pkcs15emu_add_pin(sc_pkcs15_card_t *p15card,
info.attrs.pin.flags = flags;
info.attrs.pin.pad_char = pad_char;
info.tries_left = tries_left;
info.logged_in = SC_PIN_STATE_UNKNOWN;

if (path)
info.path = *path;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-itacns.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,7 @@ static int itacns_add_pin(sc_pkcs15_card_t *p15card,
pin_info.attrs.pin.stored_length = 8;
pin_info.attrs.pin.max_length = 8;
pin_info.attrs.pin.pad_char = 0xff;
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
if(path)
pin_info.path = *path;

Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-jpki.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ sc_pkcs15emu_jpki_init(sc_pkcs15_card_t * p15card)
pin_info.attrs.pin.pad_char = '\0';
pin_info.max_tries = jpki_pin_max_tries[i];
pin_info.tries_left = -1;
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;

pin_cmd_data.cmd = SC_PIN_CMD_GET_INFO;
pin_cmd_data.pin_type = SC_AC_CHV;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-oberthur.c
Original file line number Diff line number Diff line change
Expand Up @@ -955,6 +955,7 @@ sc_pkcs15emu_oberthur_init(struct sc_pkcs15_card * p15card)
| SC_PKCS15_PIN_FLAG_NEEDS_PADDING
| SC_PKCS15_PIN_FLAG_SO_PIN;
auth_info.tries_left = tries_left;
auth_info.logged_in = SC_PIN_STATE_UNKNOWN;

strncpy(obj.label, "SO PIN", SC_PKCS15_MAX_LABEL_SIZE-1);
obj.flags = SC_PKCS15_CO_FLAG_MODIFIABLE | SC_PKCS15_CO_FLAG_PRIVATE;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-openpgp.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ sc_pkcs15emu_openpgp_init(sc_pkcs15_card_t *p15card)
pin_info.attrs.pin.max_length = c4data[1 + pin_cfg[i].do_index];
pin_info.attrs.pin.pad_char = '\0';
pin_info.tries_left = c4data[4 + pin_cfg[i].do_index];
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;

sc_format_path("3F00", &pin_info.path);

Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-postecert.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ static int sc_pkcs15emu_add_pin(sc_pkcs15_card_t *p15card,
info.attrs.pin.flags = flags;
info.attrs.pin.pad_char = pad_char;
info.tries_left = tries_left;
info.logged_in = SC_PIN_STATE_UNKNOWN;

if (path)
info.path = *path;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-pteid.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ static int sc_pkcs15emu_pteid_init(sc_pkcs15_card_t * p15card)
pin_info.attrs.pin.max_length = 8;
pin_info.attrs.pin.pad_char = type == IAS_CARD ? 0x2F : 0xFF;
pin_info.tries_left = -1;
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
if (pteid_pin_paths[type][i] != NULL)
sc_format_path(pteid_pin_paths[type][i], &pin_info.path);
strlcpy(pin_obj.label, pteid_pin_names[i], sizeof(pin_obj.label));
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-starcert.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ static int sc_pkcs15emu_starcert_init(sc_pkcs15_card_t *p15card)
pin_info.attrs.pin.pad_char = pins[i].pad_char;
sc_format_path(pins[i].path, &pin_info.path);
pin_info.tries_left = -1;
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;

strlcpy(pin_obj.label, pins[i].label, sizeof(pin_obj.label));
pin_obj.flags = pins[i].obj_flags;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-tccardos.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ static int create_pin_obj(sc_pkcs15_card_t *p15card, int cert,
ainfo.attrs.pin.max_length = 8;
ainfo.attrs.pin.pad_char = 0;
ainfo.tries_left = 3; /* XXX */
ainfo.logged_in = SC_PIN_STATE_UNKNOWN;
sc_format_path(TC_CARDOS_APP_DF, &ainfo.path);
ainfo.path.index = 0;
ainfo.path.count = 0;
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-tcos.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ static int insert_pin(
pin_info.attrs.pin.stored_length = 16;
pin_info.attrs.pin.max_length = 16;
pin_info.attrs.pin.pad_char = '\0';
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
sc_format_path(path, &pin_info.path);

memset(&pin_obj, 0, sizeof(pin_obj));
Expand Down
1 change: 1 addition & 0 deletions src/libopensc/pkcs15-westcos.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ static int sc_pkcs15emu_westcos_init(sc_pkcs15_card_t * p15card)
pin_info.attrs.pin.pad_char = 0xff;
pin_info.path = path;
pin_info.tries_left = -1;
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
if (i == 1)
strlcpy(pin_obj.label, "Unblock",
sizeof(pin_obj.label));
Expand Down

0 comments on commit 2fd7aaf

Please sign in to comment.