检查eID阅读器的驱动程序版本,并知道它何时是旧版本

本文关键字:版本 何时 检查 驱动程序 eID | 更新日期: 2023-09-27 18:35:16

我在 wpf 项目中使用 pkcs11 dll,但我想知道我的 eID 阅读器的驱动程序/软件版本是什么,所以如果它是旧版本,我们可以制作一个弹出窗口"更新 eID 阅读器的驱动程序"

部分代码:

_pkcs11 = new Pkcs11("beidpkcs11.dll", false);
LibraryInfo Lib = _pkcs11.GetInfo();
DllVersion = Lib.CryptokiVersion;

检查eID阅读器的驱动程序版本,并知道它何时是旧版本

您似乎通过托管 Pkcs11Interop 包装器使用 PKCS#11 API 来访问您的 eID 卡,但 IMO 此 API 不提供有关智能卡读卡器驱动程序版本的信息。您最好的方法是尝试检查SlotInfo类的HardwareVersion和/或FirmwareVersion属性,其中包含有关您的 smarcard 读卡器(在 PKCS#11 中称为插槽)的信息,但这些字段的含义略有不同:

using (Pkcs11 pkcs11 = new Pkcs11("beidpkcs11.dll", true))
{
    List<Slot> slots = pkcs11.GetSlotList(false);
    foreach (Slot slot in slots)
    {
        SlotInfo slotInfo = slot.GetSlotInfo();
        // Examine slotInfo.HardwareVersion
        // Examine slotInfo.FirmwareVersion
    }
}

您也可以尝试使用SCardGetAttrib()函数读取SCARD_ATTR_VENDOR_IFD_VERSION reader 属性,该函数是 PC/SC 接口的一部分,但我不确定返回的值是驱动程序版本还是设备硬件版本。以下示例使用托管 pcsc sharp 包装器读取此属性:

using System;
using PCSC;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var context = new SCardContext();
            context.Establish(SCardScope.System);
            var readerNames = context.GetReaders();
            if (readerNames == null || readerNames.Length < 1)
            {
                Console.WriteLine("You need at least one reader in order to run this example.");
                Console.ReadKey();
                return;
            }
            foreach (var readerName in readerNames)
            {
                var reader = new SCardReader(context);
                Console.Write("Trying to connect to reader.. " + readerName);
                var rc = reader.Connect(readerName, SCardShareMode.Shared, SCardProtocol.Any);
                if (rc != SCardError.Success)
                {
                    Console.WriteLine(" failed. No smart card present? " + SCardHelper.StringifyError(rc) + "'n");
                }
                else
                {
                    Console.WriteLine(" done.");
                    byte[] attribute = null;
                    rc = reader.GetAttrib(SCardAttribute.VendorInterfaceDeviceTypeVersion, out attribute);
                    if (rc != SCardError.Success)
                        Console.WriteLine("Error by trying to receive attribute. {0}'n", SCardHelper.StringifyError(rc));
                    else
                        Console.WriteLine("Attribute value: {0}'n", BitConverter.ToString(attribute ?? new byte[] { }));
                    reader.Disconnect(SCardReaderDisposition.Leave);
                }
            }
            context.Release();
            Console.ReadKey();
        }
    }
}

除此之外,您需要使用一些特定于操作系统的低级驱动程序 API,但我不熟悉其中任何一个。