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

Reply via email to