vb.netpkcs11interop

pkcs11Interop problem with WaitForSlotEvent when reader is removed


I set up pkcs11Interop Library as follows

Pkcs11Library = PkcsFactories.Pkcs11LibraryFactory.LoadPkcs11Library(PkcsFactories, pkcs11LibraryPath, AppType.MultiThreaded)

I then immediately use a WPF DispatcherTimer which contains the WaitForSlotEvent

        Private Sub CardInsertedTimer_Tick(sender As Object, e As EventArgs)
            Dim eventHappened As Boolean
                Dim id As ULong

                Pkcs11Library.WaitForSlotEvent(WaitType.NonBlocking, eventHappened, id)

            If eventHappened Then
                Debug.Print("CardInsertedEvent - Event - Event: " + eventHappened.ToString + "  ID: " + id.ToString)
            End If
        End Sub

I hope there are no surprises here. If the Slot (which is a USB smart card reader) is removed then I get a C_WaitForSlotEvent returned CKR_DEVICE_ERROR.


Solution

  • > Is a DispatcherTimer ok for WaitForSlotEvent?

    It should be OK in general. You might also consider using WaitForSlotEvent in blocking mode called from a separate thread.

    > What should I do to avoid C_WaitForSlotEvent CKR_DEVICE_ERROR?

    You need to ask the vendor of your unmanaged PKCS#11 library.

    AFAIK C_WaitForSlotEvent was designed for token/card related events not for slot/reader related events. PKCS#11 specification states that when you add or remove slot/reader you might need to reload PKCS#11 library or even restart OS:

    On some platforms, or earlier PKCS11 compliant libraries, it may be necessary to successfully call C_Initialize or to restart the entire system.

    > Does pkcs11Interop handle the adding and removing of slots (ie. SmartCard Readers)?

    Pkcs11Interop does nothing else but gives you access to unmanaged function C_WaitForSlotEvent described in PKCS#11 specification.

    > If pkcs11Interop does not handle adding and removing slots is polling the only way and what would be the best to poll?

    See answer to first question.