0

wpf プロジェクトで pkcs11 dll を使用していますが、eID リーダーのドライバー/ソフトウェアのバージョンを知りたいので、古いバージョンの場合は、「eID リーダーのドライバーを更新してください」というポップアップを作成できます。

コードの一部:

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

1 に答える 1

0

管理されたPkcs11Interopラッパー経由で PKCS#11 API を使用して eID カードにアクセスしているようですが、IMO この API はスマートカード リーダー ドライバーのバージョンに関する情報を提供しません。ベスト ショットは、smarcard リーダー (PKCS#11 ではスロットとして知られている) に関する情報を含むクラスのプロパティを調べることですが、これらのフィールドの意味はわずかに異なりHardwareVersionますFirmwareVersionSlotInfo

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
    }
}

SCARD_ATTR_VENDOR_IFD_VERSIONPC/SC インターフェイスの一部である関数を使用してリーダー属性を読み取ろうとすることもできSCardGetAttrib()ますが、返される値がドライバーのバージョンなのかデバイスのハードウェアのバージョンなのかわかりません。次の例では、マネージド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();
        }
    }
}

それ以外には、OS 固有の低レベルのドライバー API を使用する必要がありますが、私はそれらのどれにも精通していません。

于 2014-12-24T14:13:20.663 に答える