This is #29 in trac.
On Apr 18, 2008, at 4:06 AM, Alon Bar-Lev wrote:
>
> Hello,
>
> I tried a simple program that according to PKCS#11v2.20 should work:
>
> And I found the he PKCS#11 provider does not refresh slot list with
> C_GetSlotList is called with NULL_PTR.
>
> This is extremely important for tokens, as the reader hardware is
> removed and inserted when
> card is removed and inserted.
>
> Lacking Plug&Play support will not enable people to use CCID enabled
> tokens to use running applications,
> as most applications calls C_Initialize once.
>
> A found the root cause i the libopensc context management. It looks
> like the libopensc itself does not support
> Plug&Play, and use fixed reader list at context initialization.
>
> I guess there are people that familiar with the code and can propose
> some design for implementing
> Plug&Play into libopensc, and then we think of how to propagate this
> into PKCS#11.
>
> Thanks!
> Alon.
>
> ---
>
> From spec:
> If an application calls C_GetSlotList with a non-NULL pSlotList,
> and then the user adds or removes a hardware device, the changed
> slot list will only be
> visible and effective if C_GetSlotList is called again with NULL.
> Even if C_
> GetSlotList is successfully called this way, it may or may not be
> the case that the
> changed slot list will be successfully recognized depending on the
> library
> implementation. On some platforms, or earlier PKCS11 compliant
> libraries, it may be
> necessary to successfully call C_Initialize or to restart the entire
> system.
>
>
> ---
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <dlfcn.h>
> #include <unistd.h>
> #include "pkcs11.h"
>
> void p11error (CK_RV rv, char *m) {
> printf ("fatal %08x-%s\n", rv, m);
> exit (1);
> }
>
> int main () {
> CK_FUNCTION_LIST_PTR f;
> CK_SESSION_HANDLE session;
> CK_C_GetFunctionList gfl = NULL;
> CK_RV rv;
> void *dl;
>
> dl = dlopen ("/usr/lib/pkcs11/opensc-pkcs11.so", RTLD_NOW);
>
> if (dl == NULL) {
> perror ("dlopen");
> }
>
> void *p = dlsym (dl, "C_GetFunctionList");
> memmove (&gfl, &p, sizeof (void *));
> if (gfl == NULL) {
> perror ("dlsym");
> }
>
> rv = gfl (&f);
>
> if (rv != CKR_OK) {
> p11error (rv, "gfl");
> }
>
> rv = f->C_Initialize (NULL);
>
> if (rv != CKR_OK) {
> p11error (rv, "C_Initialize");
> }
>
> while (1) {
> CK_SLOT_ID slots[10];
> CK_ULONG slotnum = sizeof (slots) / sizeof (CK_SLOT_ID);
> rv = f->C_GetSlotList (TRUE, slots, &slotnum);
>
> if (rv != CKR_OK) {
> p11error (rv, "C_GetSlotList");
> }
>
> printf ("Slots with token: %ld\n", slotnum);
> sleep (2);
> }
>
> return 0;
> }
>
> _______________________________________________
> opensc-devel mailing list
> [email protected]
> http://www.opensc-project.org/mailman/listinfo/opensc-devel
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel