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:
parent
526ae18696
commit
d84ee6c96a
|
@ -95,6 +95,7 @@ static int sc_pkcs15emu_add_pin(sc_pkcs15_card_t *p15card,
|
||||||
info.attrs.pin.flags = flags;
|
info.attrs.pin.flags = flags;
|
||||||
info.attrs.pin.pad_char = pad_char;
|
info.attrs.pin.pad_char = pad_char;
|
||||||
info.tries_left = tries_left;
|
info.tries_left = tries_left;
|
||||||
|
info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
|
|
||||||
if (path)
|
if (path)
|
||||||
info.path = *path;
|
info.path = *path;
|
||||||
|
|
|
@ -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;
|
pin_info.attrs.pin.pad_char = pins[i].pad_char;
|
||||||
sc_format_path(pins[i].path, &pin_info.path);
|
sc_format_path(pins[i].path, &pin_info.path);
|
||||||
pin_info.tries_left = -1;
|
pin_info.tries_left = -1;
|
||||||
|
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
|
|
||||||
strlcpy(pin_obj.label, pins[i].label, sizeof(pin_obj.label));
|
strlcpy(pin_obj.label, pins[i].label, sizeof(pin_obj.label));
|
||||||
pin_obj.flags = pins[i].obj_flags;
|
pin_obj.flags = pins[i].obj_flags;
|
||||||
|
|
|
@ -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[2] = dfpath >> 8;
|
||||||
pin_info.path.value[3] = dfpath & 0xff;
|
pin_info.path.value[3] = dfpath & 0xff;
|
||||||
pin_info.tries_left = -1;
|
pin_info.tries_left = -1;
|
||||||
|
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
|
|
||||||
strlcpy(pin_obj.label, pins[i].label, sizeof(pin_obj.label));
|
strlcpy(pin_obj.label, pins[i].label, sizeof(pin_obj.label));
|
||||||
pin_obj.flags = pins[i].obj_flags;
|
pin_obj.flags = pins[i].obj_flags;
|
||||||
|
|
|
@ -545,6 +545,7 @@ sc_pkcs15emu_add_pin(sc_pkcs15_card_t *p15card,
|
||||||
info->attrs.pin.flags = flags;
|
info->attrs.pin.flags = flags;
|
||||||
info->attrs.pin.pad_char = pad_char;
|
info->attrs.pin.pad_char = pad_char;
|
||||||
info->tries_left = tries_left;
|
info->tries_left = tries_left;
|
||||||
|
info->logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
|
|
||||||
if (path)
|
if (path)
|
||||||
info->path = *path;
|
info->path = *path;
|
||||||
|
|
|
@ -90,6 +90,7 @@ static int sc_pkcs15emu_add_pin(sc_pkcs15_card_t *p15card,
|
||||||
info.attrs.pin.flags = flags;
|
info.attrs.pin.flags = flags;
|
||||||
info.attrs.pin.pad_char = pad_char;
|
info.attrs.pin.pad_char = pad_char;
|
||||||
info.tries_left = tries_left;
|
info.tries_left = tries_left;
|
||||||
|
info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
|
|
||||||
if (path)
|
if (path)
|
||||||
info.path = *path;
|
info.path = *path;
|
||||||
|
|
|
@ -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.stored_length = 8;
|
||||||
pin_info.attrs.pin.max_length = 8;
|
pin_info.attrs.pin.max_length = 8;
|
||||||
pin_info.attrs.pin.pad_char = 0xff;
|
pin_info.attrs.pin.pad_char = 0xff;
|
||||||
|
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
if(path)
|
if(path)
|
||||||
pin_info.path = *path;
|
pin_info.path = *path;
|
||||||
|
|
||||||
|
|
|
@ -120,6 +120,7 @@ sc_pkcs15emu_jpki_init(sc_pkcs15_card_t * p15card)
|
||||||
pin_info.attrs.pin.pad_char = '\0';
|
pin_info.attrs.pin.pad_char = '\0';
|
||||||
pin_info.max_tries = jpki_pin_max_tries[i];
|
pin_info.max_tries = jpki_pin_max_tries[i];
|
||||||
pin_info.tries_left = -1;
|
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.cmd = SC_PIN_CMD_GET_INFO;
|
||||||
pin_cmd_data.pin_type = SC_AC_CHV;
|
pin_cmd_data.pin_type = SC_AC_CHV;
|
||||||
|
|
|
@ -955,6 +955,7 @@ sc_pkcs15emu_oberthur_init(struct sc_pkcs15_card * p15card)
|
||||||
| SC_PKCS15_PIN_FLAG_NEEDS_PADDING
|
| SC_PKCS15_PIN_FLAG_NEEDS_PADDING
|
||||||
| SC_PKCS15_PIN_FLAG_SO_PIN;
|
| SC_PKCS15_PIN_FLAG_SO_PIN;
|
||||||
auth_info.tries_left = tries_left;
|
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);
|
strncpy(obj.label, "SO PIN", SC_PKCS15_MAX_LABEL_SIZE-1);
|
||||||
obj.flags = SC_PKCS15_CO_FLAG_MODIFIABLE | SC_PKCS15_CO_FLAG_PRIVATE;
|
obj.flags = SC_PKCS15_CO_FLAG_MODIFIABLE | SC_PKCS15_CO_FLAG_PRIVATE;
|
||||||
|
|
|
@ -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.max_length = c4data[1 + pin_cfg[i].do_index];
|
||||||
pin_info.attrs.pin.pad_char = '\0';
|
pin_info.attrs.pin.pad_char = '\0';
|
||||||
pin_info.tries_left = c4data[4 + pin_cfg[i].do_index];
|
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);
|
sc_format_path("3F00", &pin_info.path);
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,7 @@ static int sc_pkcs15emu_add_pin(sc_pkcs15_card_t *p15card,
|
||||||
info.attrs.pin.flags = flags;
|
info.attrs.pin.flags = flags;
|
||||||
info.attrs.pin.pad_char = pad_char;
|
info.attrs.pin.pad_char = pad_char;
|
||||||
info.tries_left = tries_left;
|
info.tries_left = tries_left;
|
||||||
|
info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
|
|
||||||
if (path)
|
if (path)
|
||||||
info.path = *path;
|
info.path = *path;
|
||||||
|
|
|
@ -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.max_length = 8;
|
||||||
pin_info.attrs.pin.pad_char = type == IAS_CARD ? 0x2F : 0xFF;
|
pin_info.attrs.pin.pad_char = type == IAS_CARD ? 0x2F : 0xFF;
|
||||||
pin_info.tries_left = -1;
|
pin_info.tries_left = -1;
|
||||||
|
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
if (pteid_pin_paths[type][i] != NULL)
|
if (pteid_pin_paths[type][i] != NULL)
|
||||||
sc_format_path(pteid_pin_paths[type][i], &pin_info.path);
|
sc_format_path(pteid_pin_paths[type][i], &pin_info.path);
|
||||||
strlcpy(pin_obj.label, pteid_pin_names[i], sizeof(pin_obj.label));
|
strlcpy(pin_obj.label, pteid_pin_names[i], sizeof(pin_obj.label));
|
||||||
|
|
|
@ -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;
|
pin_info.attrs.pin.pad_char = pins[i].pad_char;
|
||||||
sc_format_path(pins[i].path, &pin_info.path);
|
sc_format_path(pins[i].path, &pin_info.path);
|
||||||
pin_info.tries_left = -1;
|
pin_info.tries_left = -1;
|
||||||
|
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
|
|
||||||
strlcpy(pin_obj.label, pins[i].label, sizeof(pin_obj.label));
|
strlcpy(pin_obj.label, pins[i].label, sizeof(pin_obj.label));
|
||||||
pin_obj.flags = pins[i].obj_flags;
|
pin_obj.flags = pins[i].obj_flags;
|
||||||
|
|
|
@ -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.max_length = 8;
|
||||||
ainfo.attrs.pin.pad_char = 0;
|
ainfo.attrs.pin.pad_char = 0;
|
||||||
ainfo.tries_left = 3; /* XXX */
|
ainfo.tries_left = 3; /* XXX */
|
||||||
|
ainfo.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
sc_format_path(TC_CARDOS_APP_DF, &ainfo.path);
|
sc_format_path(TC_CARDOS_APP_DF, &ainfo.path);
|
||||||
ainfo.path.index = 0;
|
ainfo.path.index = 0;
|
||||||
ainfo.path.count = 0;
|
ainfo.path.count = 0;
|
||||||
|
|
|
@ -208,6 +208,7 @@ static int insert_pin(
|
||||||
pin_info.attrs.pin.stored_length = 16;
|
pin_info.attrs.pin.stored_length = 16;
|
||||||
pin_info.attrs.pin.max_length = 16;
|
pin_info.attrs.pin.max_length = 16;
|
||||||
pin_info.attrs.pin.pad_char = '\0';
|
pin_info.attrs.pin.pad_char = '\0';
|
||||||
|
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
sc_format_path(path, &pin_info.path);
|
sc_format_path(path, &pin_info.path);
|
||||||
|
|
||||||
memset(&pin_obj, 0, sizeof(pin_obj));
|
memset(&pin_obj, 0, sizeof(pin_obj));
|
||||||
|
|
|
@ -92,6 +92,7 @@ static int sc_pkcs15emu_westcos_init(sc_pkcs15_card_t * p15card)
|
||||||
pin_info.attrs.pin.pad_char = 0xff;
|
pin_info.attrs.pin.pad_char = 0xff;
|
||||||
pin_info.path = path;
|
pin_info.path = path;
|
||||||
pin_info.tries_left = -1;
|
pin_info.tries_left = -1;
|
||||||
|
pin_info.logged_in = SC_PIN_STATE_UNKNOWN;
|
||||||
if (i == 1)
|
if (i == 1)
|
||||||
strlcpy(pin_obj.label, "Unblock",
|
strlcpy(pin_obj.label, "Unblock",
|
||||||
sizeof(pin_obj.label));
|
sizeof(pin_obj.label));
|
||||||
|
|
Loading…
Reference in New Issue