当要检索的数据超过256字节时,卡不会返回状态字



我正在使用T=0协议中的卡:

  • 我向卡发送一个命令,请求带有数据的响应
  • 我使用的小程序应该用数据来回答,可能超过256字节,因此在命令中Le设置为"00">
  • 卡片首先用61 XX回答,其中"XX"是要读取的字节数(从1到256(
  • 然后我通过发送GET RESPONSE命令来检索数据:

    00 C0 00 XX

期望值:

关于ISO7816-3,我预计该卡会回复:

Procedure byte | Data | SW1 SW2

如果是SW1 == 0x61,我会发送:

00 C0 00 00 SW2

等等,直到最后我得到90 00

现实:

然而,这就是我实际拥有的(TPDU级别(:

> Command
< 61 00
> 00 C0 00 00 00
< C0 (procedure byte)
< Data (256)
No Status Word, no procedure byte (timeout)
> 00 C0 00 00 00
< C0 (procedure byte)
< Data (256)
No Status Word, no procedure byte (timeout)
[...]
> 00 C0 00 00 00
< 61 39 (status word)

我必须重复发送P3=00(256(的GET RESPONSE,读取256个字节,但没有得到状态字,直到卡警告我实际要读取的字节少于256个。

我找不到规范中允许卡片"跳过"状态字的部分,也找不到如何处理超过256字节的答案。有指针吗?

我发现了:这是一个时间问题。

卡片确实有状态字要发送,但是我在读取操作之间的过程太长,所以当我请求它时,它在卡片中已不可用。

我本应该强调的是,我正在自己开发读者部分。

在T=0协议中,数据不可能超过256字节。

在你的情况下,这可能是你的应用程序协议的错误(或误解(,在检索256字节后,它仍然会发回61XX。

实际上,在您的日志中还不清楚GET RESPONSE命令的状态字是什么,如果它是9000,那么一切都很好,不再讨论。在这种情况下,如果您重复GET RESPONSE命令,您可能会再次获得最新数据!

只是为了回答您的具体问题:

我找不到规范中允许卡"跳过"状态字的部分

您可以忽略它!

我的意思是,如果卡通知它有一些可用的数据(61 XX(,而你没有发送任何GET RESPONSE命令,而是发送另一个命令,那么数据就会丢失。

或如何处理长度超过256字节的答案。有指针吗?

在协议T=0中,这是不可能的。您最好使用协议T=1或T=15。

或者你可以通过一个稍微增强的协议来解决它,然后你应该重写应用程序来支持它(如果应用程序是你的(,它可能不再是标准的了!

最新更新