On Thu, 2010-08-26 at 14:32 +0200, Andre Zepezauer wrote:
> On Wed, 2010-08-25 at 10:55 +0300, Martin Paljak wrote:
> > Hello,
> > 
> > On Aug 24, 2010, at 10:09 AM, Patrik Martinsson wrote:
> > > Question #1,
> > > 
> > > Try pkcs11_inspect.
> > > $ pkcs11_inspect
> > > [opensc-pkcs11] iso7816.c:99:iso7816_check_sw: Instruction code not 
> > > supported or invalid
> > > [opensc-pkcs11] card.c:588:sc_get_challenge: returning with: Unsupported 
> > > INS byte in APDU
> > > PIN for token: xxxx
> > > Printing data for mapper cn:
> > > username
> > > 
> > > Works like a charm, however it gives me those two lines which is a bit 
> > > worrying/annoying.
> > > What do they mean and is there anything i can do to fix them ?
> > card-setcos.c does not override iso7816.get_challenge, but the card rejects 
> > the ISO version. This results in C_GenerateRandom() failing, but I guess 
> > pkcs11_inspect will then just use some other random source. OpenSC 
> > SVN/0.12+ will not output such internal errors to stderr by default, so 
> > you'll not see it in future versions.
> > 
> > If everything is working fine, there's nothing to worry about. If not, then 
> > it can be fixed by implementing a proper GET CHALLENGE method in 
> > card-setcos.c. If you can sniff the correct APDU for this (or if you have 
> > the manual) would be great. Or something in pkcs11_inspect should be fixed 
> > to not depend on the smart card module C_GenerateRandom().
> 
> I think that it is highly possible that most setcos cards will do fine
> with the current implementation of get_challenge(). This is because the
> driver is about 8 years old. So, anyone else would had reported this bug
> before, if it was a general one. My assumption is, that this particular
> card lakes the required hardware.
> 
> Attached is a patch, which exposes the RNG functionality only if the
> token itself states support for it.

One file was missing in the previous patch, which is now included.

> > > Question #2,
> > > I'm trying to use opensc-pkcs11.so together with gdm-plugin-smartcard.
> > > 
> > > That one is failing telling me, "assertion 'slot_id >= 1' failed", 
> > > obviously slot_id should be >= than 1, but it isn't and I'm not sure why.
> > That assertion seems to come from something else than OpenSC. Where can the 
> > source code of the gdm-plugin-smartcard be downloaded? I suspect the assert 
> > is erroneous, as from the PKCS#11 spec:
> > """
> > A priori, any value of CK_SLOT_ID can be a valid slot identifier—in 
> > particular, a system may have a slot identified by the value 0. It need not 
> > have such a slot, however.
> > """
> > 
> > Cheers,
> _______________________________________________
> opensc-devel mailing list
> [email protected]
> http://www.opensc-project.org/mailman/listinfo/opensc-devel
Index: pkcs11/framework-pkcs15.c
===================================================================
--- pkcs11/framework-pkcs15.c	(revision 4654)
+++ pkcs11/framework-pkcs15.c	(working copy)
@@ -722,8 +722,14 @@
 	if (p15card->card->reader->capabilities & SC_READER_CAP_PIN_PAD) {
 		slot->token_info.flags |= CKF_PROTECTED_AUTHENTICATION_PATH;
 	}
-	if (p15card->card->caps & SC_CARD_CAP_RNG)
+
+	/* State support for RNG when:
+	 * 1. the token itself states this capability and
+	 * 2. the driver supports get_challenge() for this token
+	 */
+	if (p15card->flags & SC_PKCS15_CARD_FLAG_PRN_GENERATION && p15card->card->ops->get_challenge != NULL)
 		slot->token_info.flags |= CKF_RNG;
+
 	slot->fw_data = fw_data = calloc(1, sizeof(*fw_data));
 	fw_data->auth_obj = auth;
 
Index: pkcs11/pkcs11-object.c
===================================================================
--- pkcs11/pkcs11-object.c	(revision 4654)
+++ pkcs11/pkcs11-object.c	(working copy)
@@ -978,7 +978,7 @@
 	rv = get_session(hSession, &session);
 	if (rv == CKR_OK) {
 		slot = session->slot;
-		if (slot->card->framework->get_random == NULL)
+		if (!(slot->token_info.flags & CKF_RNG))
 			rv = CKR_RANDOM_NO_RNG;
 		else if (slot->card->framework->seed_random == NULL)
 			rv = CKR_RANDOM_SEED_NOT_SUPPORTED;
@@ -1005,7 +1005,7 @@
 	rv = get_session(hSession, &session);
 	if (rv == CKR_OK) {
 		slot = session->slot;
-		if (slot->card->framework->get_random == NULL)
+		if (!(slot->token_info.flags & CKF_RNG))
 			rv = CKR_RANDOM_NO_RNG;
 		else
 			rv = slot->card->framework->get_random(slot->card, RandomData, ulRandomLen);
Index: libopensc/pkcs15.c
===================================================================
--- libopensc/pkcs15.c	(revision 4654)
+++ libopensc/pkcs15.c	(working copy)
@@ -825,9 +825,6 @@
 			goto error;
 	}
 done:
-	/* If card driver states that it has a (P)RNG, overwrite (possibly missing) tokeninfo flags */
-	if (card->caps & SC_CARD_CAP_RNG)
-		p15card->flags |= SC_PKCS15_CARD_FLAG_PRN_GENERATION;	
 
 	/* for starcos cards only: fix asn1 integers */
 	if (strcmp(p15card->card->driver->short_name,"starcos") == 0
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to