1

我设置 pkcs11Interop 库如下

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

然后我立即使用包含 WaitForSlotEvent 的 WPF DispatcherTimer

        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

我希望这里没有惊喜。如果插槽(它是一个 USB 智能卡读卡器)被移除,那么我会收到一个 C_WaitForSlotEvent 返回的 CKR_DEVICE_ERROR。

  • 对于 WaitForSlotEvent,DispatcherTimer 可以吗?
  • 我应该怎么做才能避免 C_WaitForSlotEvent CKR_DEVICE_ERROR?
  • pkcs11Interop 是否处理插槽(即智能卡读卡器)的添加和删除?
  • 如果 pkcs11Interop 不处理添加和删除插槽是轮询的唯一方式,什么是最好的轮询?
4

1 回答 1

2

> WaitForSlotEvent 是否可以使用 DispatcherTimer?

一般应该没问题。您也可以考虑使用WaitForSlotEvent从单独线程调用的阻塞模式。

> 我应该怎么做才能避免 C_WaitForSlotEvent CKR_DEVICE_ERROR?

您需要询问非托管 PKCS#11 库的供应商。

AFAIKC_WaitForSlotEvent是为令牌/卡相关事件而不是插槽/读卡器相关事件而设计的。PKCS#11 规范指出,当您添加或删除插槽/阅读器时,您可能需要重新加载 PKCS#11 库甚至重新启动操作系统:

在某些平台或较早的 PKCS11 兼容库上,可能需要成功调用C_Initialize或重新启动整个系统。

> pkcs11Interop 是否处理插槽(即智能卡读卡器)的添加和删除?

Pkcs11Interop 什么都不做,只是让您可以访问PKCS#11 规范C_WaitForSlotEvent中描述的非托管函数。

> 如果 pkcs11Interop 不处理添加和删除插槽是轮询的唯一方法,那么最好的轮询方式是什么?

请参阅第一个问题的答案。

于 2021-02-23T14:25:44.317 回答