[pkg-opensc-commit] [opensc] 73/295: Initialize PIN logged_in field for cards that do not support PIN info

Eric Dorland eric at moszumanska.debian.org
Sat Jun 24 21:11:17 UTC 2017


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository opensc.

commit d84ee6c96a8ce1e0d2596a78e0b5c9062ed9bfeb
Author: Maciej S. Szmigiero <mail at maciej.szmigiero.name>
Date:   Thu Aug 11 18:26:01 2016 +0200

    Initialize PIN logged_in field for cards that do not support PIN info
    
    Commit 2f10de4f5c190 ("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 at maciej.szmigiero.name>
---
 src/libopensc/pkcs15-actalis.c     | 1 +
 src/libopensc/pkcs15-atrust-acos.c | 1 +
 src/libopensc/pkcs15-gemsafeGPK.c  | 1 +
 src/libopensc/pkcs15-gemsafeV1.c   | 1 +
 src/libopensc/pkcs15-infocamere.c  | 1 +
 src/libopensc/pkcs15-itacns.c      | 1 +
 src/libopensc/pkcs15-jpki.c        | 1 +
 src/libopensc/pkcs15-oberthur.c    | 1 +
 src/libopensc/pkcs15-openpgp.c     | 1 +
 src/libopensc/pkcs15-postecert.c   | 1 +
 src/libopensc/pkcs15-pteid.c       | 1 +
 src/libopensc/pkcs15-starcert.c    | 1 +
 src/libopensc/pkcs15-tccardos.c    | 1 +
 src/libopensc/pkcs15-tcos.c        | 1 +
 src/libopensc/pkcs15-westcos.c     | 1 +
 15 files changed, 15 insertions(+)

diff --git a/src/libopensc/pkcs15-actalis.c b/src/libopensc/pkcs15-actalis.c
index bbe53a0..f42cc03 100644
--- a/src/libopensc/pkcs15-actalis.c
+++ b/src/libopensc/pkcs15-actalis.c
@@ -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;
diff --git a/src/libopensc/pkcs15-atrust-acos.c b/src/libopensc/pkcs15-atrust-acos.c
index 513d401..2d6ba4a 100644
--- a/src/libopensc/pkcs15-atrust-acos.c
+++ b/src/libopensc/pkcs15-atrust-acos.c
@@ -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;
diff --git a/src/libopensc/pkcs15-gemsafeGPK.c b/src/libopensc/pkcs15-gemsafeGPK.c
index 61fc591..c4d96cb 100644
--- a/src/libopensc/pkcs15-gemsafeGPK.c
+++ b/src/libopensc/pkcs15-gemsafeGPK.c
@@ -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;
diff --git a/src/libopensc/pkcs15-gemsafeV1.c b/src/libopensc/pkcs15-gemsafeV1.c
index ac7dab7..091720c 100644
--- a/src/libopensc/pkcs15-gemsafeV1.c
+++ b/src/libopensc/pkcs15-gemsafeV1.c
@@ -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;
diff --git a/src/libopensc/pkcs15-infocamere.c b/src/libopensc/pkcs15-infocamere.c
index dbf72ab..d8b3af3 100644
--- a/src/libopensc/pkcs15-infocamere.c
+++ b/src/libopensc/pkcs15-infocamere.c
@@ -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;
diff --git a/src/libopensc/pkcs15-itacns.c b/src/libopensc/pkcs15-itacns.c
index cdb1086..50b9217 100644
--- a/src/libopensc/pkcs15-itacns.c
+++ b/src/libopensc/pkcs15-itacns.c
@@ -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;
 
diff --git a/src/libopensc/pkcs15-jpki.c b/src/libopensc/pkcs15-jpki.c
index 8feab10..c113b87 100644
--- a/src/libopensc/pkcs15-jpki.c
+++ b/src/libopensc/pkcs15-jpki.c
@@ -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;
diff --git a/src/libopensc/pkcs15-oberthur.c b/src/libopensc/pkcs15-oberthur.c
index 49df9f4..4fb9e67 100644
--- a/src/libopensc/pkcs15-oberthur.c
+++ b/src/libopensc/pkcs15-oberthur.c
@@ -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;
diff --git a/src/libopensc/pkcs15-openpgp.c b/src/libopensc/pkcs15-openpgp.c
index e327d60..9ab0f61 100644
--- a/src/libopensc/pkcs15-openpgp.c
+++ b/src/libopensc/pkcs15-openpgp.c
@@ -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);
 
diff --git a/src/libopensc/pkcs15-postecert.c b/src/libopensc/pkcs15-postecert.c
index e79cd80..14a8cc3 100644
--- a/src/libopensc/pkcs15-postecert.c
+++ b/src/libopensc/pkcs15-postecert.c
@@ -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;
diff --git a/src/libopensc/pkcs15-pteid.c b/src/libopensc/pkcs15-pteid.c
index e3a1601..68dacac 100644
--- a/src/libopensc/pkcs15-pteid.c
+++ b/src/libopensc/pkcs15-pteid.c
@@ -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));
diff --git a/src/libopensc/pkcs15-starcert.c b/src/libopensc/pkcs15-starcert.c
index ba5741a..68f2eee 100644
--- a/src/libopensc/pkcs15-starcert.c
+++ b/src/libopensc/pkcs15-starcert.c
@@ -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;
diff --git a/src/libopensc/pkcs15-tccardos.c b/src/libopensc/pkcs15-tccardos.c
index e8017d1..b1779b5 100644
--- a/src/libopensc/pkcs15-tccardos.c
+++ b/src/libopensc/pkcs15-tccardos.c
@@ -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;
diff --git a/src/libopensc/pkcs15-tcos.c b/src/libopensc/pkcs15-tcos.c
index f1415ff..74bb32a 100644
--- a/src/libopensc/pkcs15-tcos.c
+++ b/src/libopensc/pkcs15-tcos.c
@@ -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));
diff --git a/src/libopensc/pkcs15-westcos.c b/src/libopensc/pkcs15-westcos.c
index a85557a..0e1e634 100644
--- a/src/libopensc/pkcs15-westcos.c
+++ b/src/libopensc/pkcs15-westcos.c
@@ -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));

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-opensc/opensc.git



More information about the pkg-opensc-commit mailing list