Hello,
>if C_Initialize is called the second card blocks if there is already an
open session. C_Initialize looks at all readers, whether in use or not.
>The calling chain is:
>C_Initialize
>-> __card_detect_all
>-> card_detect
>-> pkcs15_bind
>-> sc_pkcs15_bind
>-> sc_lock
>-> pcsc_lock
>-> SCardBeginTransaction
>-> SYS_Usleep
>-> _nanosleep_nocancel
>is there a way to find out if a reader is already in use?
>or is there an option so pcsc_lock could fail if the reader is locked,
rather than wait?
I made a workaround. The idea is to pre select a reader while loading the
engine. The openssl engine works only with the pre selected
reader. It's little bit dirty, but it is working. SELECT_READER command
works with one or more readers.
If you don't use it, all readers will be used (as usual).
The changes are in engine_pkcs11 and libp11.
Juergen
Example :
openssl
>engine -t dynamic -pre SO_PATH:/usr/lib/engines/engine_pkcs11.so -pre
ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre
MODULE_PATH:/usr/lib/opensc-pkcs11.so -pre SELECT_READER:0
or
>engine -t dynamic -pre SO_PATH:/usr/lib/engines/engine_pkcs11.so -pre
ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre
MODULE_PATH:/usr/lib/opensc-pkcs11.so -pre SELECT_READER:0,2
Based on libp11-0.2.1
############################################################################
########
diff -udrNPpr libp11-0.2.1/rsaref/pkcs11f.h ../libp11-0.2.1/rsaref/pkcs11f.h
--- libp11-0.2.1/rsaref/pkcs11f.h 2005-10-30 13:48:02.000000000 +0100
+++ ../libp11-0.2.1/rsaref/pkcs11f.h 2006-04-21 09:11:40.000000000 +0200
@@ -910,3 +910,10 @@ CK_PKCS11_FUNCTION_INFO(C_WaitForSlotEve
CK_VOID_PTR pRserved /* reserved. Should be NULL_PTR */
);
#endif
+
+CK_PKCS11_FUNCTION_INFO(C_PreInitialize)
+#ifdef CK_NEED_ARG_LIST
+(
+ int *piPreInit /* reserved. Should be NULL_PTR */
+);
+#endif
diff -udrNPpr libp11-0.2.1/src/libp11.h ../libp11-0.2.1/src/libp11.h
--- libp11-0.2.1/src/libp11.h 2005-11-23 21:37:39.000000000 +0100
+++ ../libp11-0.2.1/src/libp11.h 2006-04-21 09:01:57.000000000 +0200
@@ -117,6 +117,9 @@ extern PKCS11_CTX *PKCS11_CTX_new(void);
*/
extern int PKCS11_CTX_load(PKCS11_CTX * ctx, const char * ident);
+extern int PKCS11_CTX_preinit_readers(int *readers);
+
+
/**
* Unload a PKCS#11 module
*
diff -udrNPpr libp11-0.2.1/src/p11_load.c ../libp11-0.2.1/src/p11_load.c
--- libp11-0.2.1/src/p11_load.c 2005-10-30 13:48:03.000000000 +0100
+++ ../libp11-0.2.1/src/p11_load.c 2006-04-21 09:03:55.000000000 +0200
@@ -21,6 +21,11 @@
static void *handle = NULL;
+#define SC_MAX_READERS 16
+
+int preinit_reader[SC_MAX_READERS];
+int preinit_readers=0;
+
/*
* Create a new context
*/
@@ -39,6 +44,18 @@ PKCS11_CTX *PKCS11_CTX_new(void)
return ctx;
}
+int PKCS11_CTX_preinit_readers(int *readers)
+{
+ preinit_readers=0;
+ if ( readers!=NULL )
+ {
+ preinit_readers=1;
+ }
+
+ return 0;
+}
+
+
/*
* Load the shared library, and initialize it.
*/
@@ -58,6 +75,9 @@ int PKCS11_CTX_load(PKCS11_CTX * ctx, co
return -1;
}
+ if ( preinit_readers==1)
+ rv = priv->method->C_PreInitialize(preinit_reader);
+
/* Tell the PKCS11 to initialize itself */
rv = priv->method->C_Initialize(NULL);
CRYPTOKI_checkerr(PKCS11_F_PKCS11_CTX_LOAD, rv);
@@ -72,6 +92,7 @@ int PKCS11_CTX_load(PKCS11_CTX * ctx, co
return 0;
}
+
/*
* Unload the shared library
*/
diff -udrNPpr libp11-0.2.1/src/p11_slot.c ../libp11-0.2.1/src/p11_slot.c
--- libp11-0.2.1/src/p11_slot.c 2005-10-30 13:48:03.000000000 +0100
+++ ../libp11-0.2.1/src/p11_slot.c 2006-01-25 14:22:55.000000000 +0100
@@ -128,10 +128,12 @@ int PKCS11_login(PKCS11_SLOT * slot, int
if (PKCS11_open_session(slot, so))
return -1;
}
+
+
rv = CRYPTOKI_call(ctx, C_Login(priv->session,
so ? CKU_SO : CKU_USER,
- (CK_UTF8CHAR *) pin, strlen(pin)));
+ (CK_UTF8CHAR *) pin, pin ?
strlen(pin) : 0 ));
CRYPTOKI_checkerr(PKCS11_F_PKCS11_LOGIN, rv);
priv->loggedIn = 1;
return 0;
[EMAIL PROTECTED]:~/newopensc/org# diff -udrNPpr libp11-0.2.1 ../libp11-0.2.1
diff -udrNPpr libp11-0.2.1/rsaref/pkcs11f.h ../libp11-0.2.1/rsaref/pkcs11f.h
--- libp11-0.2.1/rsaref/pkcs11f.h 2005-10-30 13:48:02.000000000 +0100
+++ ../libp11-0.2.1/rsaref/pkcs11f.h 2006-04-21 09:11:40.000000000 +0200
@@ -910,3 +910,10 @@ CK_PKCS11_FUNCTION_INFO(C_WaitForSlotEve
CK_VOID_PTR pRserved /* reserved. Should be NULL_PTR */
);
#endif
+
+CK_PKCS11_FUNCTION_INFO(C_PreInitialize)
+#ifdef CK_NEED_ARG_LIST
+(
+ int *piPreInit /* reserved. Should be NULL_PTR */
+);
+#endif
diff -udrNPpr libp11-0.2.1/src/libp11.h ../libp11-0.2.1/src/libp11.h
--- libp11-0.2.1/src/libp11.h 2005-11-23 21:37:39.000000000 +0100
+++ ../libp11-0.2.1/src/libp11.h 2006-04-21 09:01:57.000000000 +0200
@@ -117,6 +117,9 @@ extern PKCS11_CTX *PKCS11_CTX_new(void);
*/
extern int PKCS11_CTX_load(PKCS11_CTX * ctx, const char * ident);
+extern int PKCS11_CTX_preinit_readers(int *readers);
+
+
/**
* Unload a PKCS#11 module
*
diff -udrNPpr libp11-0.2.1/src/p11_load.c ../libp11-0.2.1/src/p11_load.c
--- libp11-0.2.1/src/p11_load.c 2005-10-30 13:48:03.000000000 +0100
+++ ../libp11-0.2.1/src/p11_load.c 2006-04-21 09:03:55.000000000 +0200
@@ -21,6 +21,11 @@
static void *handle = NULL;
+#define SC_MAX_READERS 16
+
+int preinit_reader[SC_MAX_READERS];
+int preinit_readers=0;
+
/*
* Create a new context
*/
@@ -39,6 +44,18 @@ PKCS11_CTX *PKCS11_CTX_new(void)
return ctx;
}
+int PKCS11_CTX_preinit_readers(int *readers)
+{
+ preinit_readers=0;
+ if ( readers!=NULL )
+ {
+ preinit_readers=1;
+ }
+
+ return 0;
+}
+
+
/*
* Load the shared library, and initialize it.
*/
@@ -58,6 +75,9 @@ int PKCS11_CTX_load(PKCS11_CTX * ctx, co
return -1;
}
+ if ( preinit_readers==1)
+ rv = priv->method->C_PreInitialize(preinit_reader);
+
/* Tell the PKCS11 to initialize itself */
rv = priv->method->C_Initialize(NULL);
CRYPTOKI_checkerr(PKCS11_F_PKCS11_CTX_LOAD, rv);
@@ -72,6 +92,7 @@ int PKCS11_CTX_load(PKCS11_CTX * ctx, co
return 0;
}
+
/*
* Unload the shared library
*/
diff -udrNPpr libp11-0.2.1/src/p11_slot.c ../libp11-0.2.1/src/p11_slot.c
--- libp11-0.2.1/src/p11_slot.c 2005-10-30 13:48:03.000000000 +0100
+++ ../libp11-0.2.1/src/p11_slot.c 2006-01-25 14:22:55.000000000 +0100
@@ -128,10 +128,12 @@ int PKCS11_login(PKCS11_SLOT * slot, int
if (PKCS11_open_session(slot, so))
return -1;
}
+
+
rv = CRYPTOKI_call(ctx, C_Login(priv->session,
so ? CKU_SO : CKU_USER,
- (CK_UTF8CHAR *) pin, strlen(pin)));
+ (CK_UTF8CHAR *) pin, pin ?
strlen(pin) : 0 ));
CRYPTOKI_checkerr(PKCS11_F_PKCS11_LOGIN, rv);
priv->loggedIn = 1;
return 0;
############################################################################
########
Based on engine_pkcs11-0.1.3
############################################################################
########
diff -udrNPpr engine_pkcs11-0.1.3/src/engine_pkcs11.c
../engine_pkcs11-0.1.3/src/engine_pkcs11.c
--- engine_pkcs11-0.1.3/src/engine_pkcs11.c 2005-11-23
21:43:53.000000000 +0100
+++ ../engine_pkcs11-0.1.3/src/engine_pkcs11.c 2006-04-26
17:12:48.591449504 +0200
@@ -41,6 +41,7 @@
/** The maximum length of an internally-allocated PIN */
#define MAX_PIN_LENGTH 12
+#define SC_MAX_READERS 16
PKCS11_CTX *ctx;
@@ -57,6 +58,33 @@ int verbose = 0;
char *module = NULL;
int default_module = 1;
+int preinit_readers = 0;
+
+int preinit_reader[SC_MAX_READERS];
+
+int set_pre_select(const char *reader)
+{
+int i=0;
+ preinit_readers=0;
+ for ( i=0; i<SC_MAX_READERS; i++)
+ preinit_reader[i]=0;
+
+
+char * pch=NULL;
+int itmp=0;
+
+ pch=strtok(reader,",");
+
+ while (pch != NULL){
+ sscanf( pch, "%d",&itmp);
+ preinit_reader[itmp]=1;
+ pch = strtok (NULL, ",");
+ }
+
+ preinit_reader=1;
+ return 1;
+}
+
int set_module(const char *modulename)
{
module = strdup (modulename);
@@ -143,10 +171,16 @@ int pkcs11_init(ENGINE * engine)
fprintf(stderr, "initializing engine\n");
}
ctx = PKCS11_CTX_new();
+ if ( preinit_readers==1 )
+ {
+ PKCS11_CTX_preinit_readers(preinit_reader);
+ }
if (PKCS11_CTX_load(ctx, module) < 0) {
fprintf(stderr, "unable to load module %s\n", module);
return 0;
}
+
+
return 1;
}
diff -udrNPpr engine_pkcs11-0.1.3/src/hw_pkcs11.c
../engine_pkcs11-0.1.3/src/hw_pkcs11.c
--- engine_pkcs11-0.1.3/src/hw_pkcs11.c 2005-11-23 21:43:53.000000000 +0100
+++ ../engine_pkcs11-0.1.3/src/hw_pkcs11.c 2006-04-21
08:41:57.000000000 +0200
@@ -80,6 +80,7 @@
#define CMD_VERBOSE (ENGINE_CMD_BASE+3)
#define CMD_QUIET (ENGINE_CMD_BASE+4)
#define CMD_LOAD_CERT_CTRL (ENGINE_CMD_BASE+5)
+#define CMD_PRE_SELECT_READER (ENGINE_CMD_BASE+6)
static int pkcs11_engine_destroy(ENGINE * e);
static int pkcs11_engine_ctrl(ENGINE * e, int cmd, long i, void *p, void
(*f) ());
@@ -113,6 +114,10 @@ static const ENGINE_CMD_DEFN pkcs11_cmd_
"LOAD_CERT_CTRL",
"Get the certificate from card",
ENGINE_CMD_FLAG_INTERNAL},
+ {CMD_PRE_SELECT_READER,
+ "SELECT_READER",
+ "Pre select reader",
+ ENGINE_CMD_FLAG_STRING},
{0, NULL, NULL, 0}
};
@@ -134,6 +139,9 @@ static int pkcs11_engine_ctrl(ENGINE * e
return inc_verbose();
case CMD_LOAD_CERT_CTRL:
return load_cert_ctrl(e, p);
+ case CMD_PRE_SELECT_READER:
+ return set_pre_select((const char *) p);
+
default:
break;
}
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel