如何使用C ++发送APDU命令?

时间:2019-02-12 08:18:47

标签: c++ apdu omnikey

我想制作连接到HID OMNIKEY 3128智能卡“飞行员芯片”的软件,我已经成功使用API​​函数“ SCardConnect”连接了该设备,但是根据开发人员指南(第17页) https://www.hidglobal.com/doclib/files/resource_files/plt-03099_a.3_-_omnikey_sw_dev_guide.pdf 我必须更改电压顺序来解决读/写问题,这是通过发送APDU命令完成的,“我如何使用c ++发送此命令,是否有像SCardConnect一样的API函数?

1 个答案:

答案 0 :(得分:0)

免责声明优先:我以前没有使用PC / SC API,但对您的问题感到好奇,因为它与我很久以前所做的项目有远程关系。 -因此,以下内容未经测试,应与一粒盐一起服用:-)

如果我正确理解了您的链接文档中的第26页,则要使用的功能(最好是)SCardTransmitSCardControl

可以找到例如如何发送APDU命令的示例。在https://ludovicrousseau.blogspot.com/2010/04/pcsc-sample-in-c.html上。值得阅读那里给出的描述。相关部分主要归结为:

// dwActiveProtocol is result of SCardConnect
SCARD_IO_REQUEST pioSendPci = dwActiveProtocol == SCARD_PROTOCOL_T1 ? *SCARD_PCI_T1 : *SCARD_PCI_T0;
BYTE pbRecvBuffer[258];
BYTE cmd[] = { 0x00, 0xA4, 0x04, 0x00,
               0x0A, 0xA0, 0x00, 0x00,
               0x00, 0x62, 0x03, 0x01,
               0x0C, 0x06, 0x01 }; // this is just an example, not the right command (yet, see below).
dwRecvLength = sizeof(pbRecvBuffer);
LONG rv = SCardTransmit(hCard, &pioSendPci, cmd, sizeof(cmd), NULL, pbRecvBuffer, &dwRecvLength);

现在,问题是如何组成cmd。在这里,https://github.com/hidglobal/HID-OMNIKEY-Sample-Codes上的C#示例可能会有所帮助。具体来说,您应该查看SetVoltageSequence()VoltageSequence.SetApdu()。如果我正确理解这一点,则应该采取以下措施:

BYTE constexpr voltageSequence = 0x1B; // or 0x39 or ..., see page 17 in your linked document.
BYTE cmd[] = { 0xFF, 0x70, 0x07, 0x6B, 
               0x0B, 0xA2, 0x09, 0xA1,
               0x07, 0xA3, 0x05, 0xA0,
               0x03, 0x82, 0x01, voltageSequence, 0x00};

我认为,与设备通信的所有必需代码都应在linked C# example code中或多或少地可用。