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

How can I send APDU command using C++?

我想制作连接到 HID OMNIKEY 3128 智能卡的软件 "Aviator chip",我已经使用 API 函数“SCardConnect”成功连接了这个设备,但是根据开发者指南(第 17 页) https://www.hidglobal.com/doclib/files/resource_files/plt-03099_a.3_-_omnikey_sw_dev_guide.pdf 我必须更改电压序列来解决 Read/Write 问题,这通过发送 APDU 命令来完成,“我如何使用 C++ 发送此命令,是否有任何 API 函数可以像 SCardConnect 那样执行此操作?

先免责声明:我之前没有使用过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 might be helpful. Specifically, you should look at SetVoltageSequence() and VoltageSequence.SetApdu() 上的 C# 示例。如果我理解正确,以下内容应该有效:

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 中可用。