如何在 C++ 中使用单个 APDU 发送和获取数据?
Posted
技术标签:
【中文标题】如何在 C++ 中使用单个 APDU 发送和获取数据?【英文标题】:How to send and get data using a single APDU in C++? 【发布时间】:2013-07-31 10:46:28 【问题描述】:我正在使用 winscard 编写 C++ 代码。我注意到,如果我使用 Scardtransmit 发送仅发送数据或仅接收数据的命令,则没有问题。我可以发送数据或得到正确的响应。 但是,当命令既发送数据又期望响应时,我总是得到 61xx。我知道错误代码 61xx 意味着有一个 xx 字节的响应,其中 Le 不正确,并检查了所有可能的 Le,包括返回值 xx,但没有任何变化。例如,让 Apdu 的形式为 CLA INS P1 P2 Lc Data Le,我得到 61XX,然后我发送 CLA INS P1 P2 Lc Data XX,我再次得到 61XX。
我用java等工具检查了卡,确认卡没有。
据我了解,为 Lc 和 Le 分配了一个字节 P3。有没有办法从 DATADATA 命令获得响应(除了 SW1SW2)?
【问题讨论】:
【参考方案1】:当您发送具有命令数据的命令并且该命令也需要结果数据,并且使用 T=0 协议进行通信时,您需要发送两个 APDU。一个用于命令本身,另一个用于检索结果。
61XX
不是错误。这是一个(成功的)状态字,表示您有 XX
字节的响应,您可以使用 GET RESPONSE
(INS=0xC0
) 检索这些响应。
这里是reference of the command。
【讨论】:
感谢您的回答大卫。这是否意味着我需要存储结果,然后使用另一个 APDU 检索它?而且,我想知道,Java 和 C++ 有什么区别,所以我不需要在 Java 中发送两个 APDU? 是的,您需要存储 SW2 的值,然后在 GET RESPONSE APDU 中将其用作 Le。您还可以检索部分数据,如果您愿意,Le 再次感谢您的回复。以上是关于如何在 C++ 中使用单个 APDU 发送和获取数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何将低级命令(非 APDU)发送到 Windows 10(移动)上的智能卡?