【问题标题】:SCardTransmit() returns empty response bufferSCardTransmit() 返回空的响应缓冲区
【发布时间】:2013-06-17 16:33:10
【问题描述】:

使用here 描述的框架,我正在尝试从智能卡中读取数据。我已经建立了一个 apdu 命令。命令结构似乎是正确的,因为它适用于 java。当我调用 SCardTransmit() 函数时,命令被执行,但它返回一个长度为 Le+2 字节的空响应缓冲区。保存SW1和SW2的前两个字节是6118。我相信这意味着有更多的字节要读入缓冲区。但是,当我更改缓冲区大小时,响应缓冲区大小已更改,但我仍然收到错误代码 6118。这是一个选择命令,后跟一个返回状态 6100 的获取数据命令,我认为这意味着有超过 0xFF 字节待读。那么如何让响应缓冲区被填充呢?

【问题讨论】:

    标签: c# .net smartcard cac


    【解决方案1】:

    所描述的行为与 T=0 协议卡匹配。在该协议中,您永远不会直接获得命令响应,而是必须发送一个 GET RESPONSE 命令,其长度在前一个命令的返回码中报告,此处为 0x18。

    【讨论】:

    • 这正是我在这里所做的,但 18 与所选数据的长度无关。 GET RESPONSE 的响应有独立的长度
    • @nwnoga 响应代码“61 nn”的确切含义是“请发送带有 P3/LE=nn 的 GET RESPONSE”。我不明白,你在哪里看到一个独立的长度,也不建议用不同的东西替换“nn”,因为有些卡可能不接受它。
    • 在 java 程序中,SELECT 返回 26 个字节,GET RESPONSE 返回 1100 个字节。我的理解是 6118 的意思是“你的响应缓冲区短了 18 个字节,我还有更多数据要提供。”
    • 26 匹配 0x18 加上 2 个字节 SW1/SW2,因此对 Select 的响应似乎很好。我仍然感到困惑,无论您是在谈论问题中指出的“获取数据”还是在我的回答中都在谈论 GET RESPONSE。 GET RESPONSE 在 T=0 的情况下是必不可少的,因为没有它你将不会得到任何命令的响应。请注意,可能需要多个 GET RESPONSE,在这种情况下,除最后一个之外的所有响应的 SW1/SW2 都应为 6100。直接返回部分响应并通过 GET RESPONSE 返回其余部分的行为不像 T=0。此外,您的 SCardTransmit() 也无助于识别发送的指令。
    • 命令顺序如下:Select,GET RESPONSE,GET DATA,GET RESPONSE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2015-06-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多