【问题标题】:How can I send APDU command using C++?如何使用 C++ 发送 APDU 命令?
【发布时间】:2019-02-12 08:18:46
【问题描述】:

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

【问题讨论】:

    标签: c++ apdu omnikey


    【解决方案1】:

    免责声明第一:我之前没有使用过 PC/SC API,但对您的问题感到好奇,因为它与我很久以前做的一个项目远程相关。 - 因此,以下内容未经测试,应持保留态度:-)

    如果我正确理解了您链接文档中的第 26 页,那么要使用的函数是(最好)SCardTransmit 或 SCardControl。

    可以找到如何传输 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 中可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多