Initialize PIN logged_in field for cards that do not support PIN info

Commit 2f10de4f5c ("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 <mail@maciej.szmigiero.name>
This commit is contained in:
Maciej S. Szmigiero 2016-08-11 18:26:01 +02:00 committed by Frank Morgner
parent 526ae18696
commit d84ee6c96a
15 changed files with 15 additions and 0 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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));

View File

@ -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;

View File

@ -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;

View File

@ -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));

View File

@ -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));