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

时间:2018-12-10 11:02:04

标签: smartcard iso apdu

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

  • 我向卡发送了一条命令,要求提供数据响应。
  • 我使用的applet有望回答数据,可能超过256个字节,因此在命令Le中将其设置为'00'
  • 卡首先用61 XX回答,其中“ XX”是要读取的字节数(从1到256)。
  • 然后我通过发送GET RESPONSE命令检索数据:

    00 C0 00 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个字节的答案的部分。有指针吗?

2 个答案:

答案 0 :(得分:2)

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

该卡确实有要发送,但是我在两次读取操作之间的过程太长了,因此在我要求时,该卡中不再可用。

我应该强调指出,我是在自己开发读者部分。

答案 1 :(得分:-1)

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

在您的情况下,可能是应用程序协议的错误(或误解),该协议在检索256个字节后仍将61XX发送回去。

实际上,您的日志中尚不清楚GET RESPONSE命令的状态字是什么,如果是9000,则一切正常,无需赘述。在这种情况下,如果重复执行GET RESPONSE命令,则可能会再次获取最新数据!

只需回答您的特定问题:

  

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

您可以简单地忽略它!

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

  

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

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

或者您可以通过某种增强的协议以某种方式解决它,然后您应该重写该应用程序以支持它(如果该应用程序属于您),那么它可能不再是标准的了!