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

Card does not return Status Word when data to retrieve exceeds 256 bytes

我正在使用 T=0[​​=46=] 协议中的卡:

  • 我向卡片发送命令,请求数据响应。
  • 我使用的小程序预计会用数据回答,可能超过 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 个字节。

我找不到允许卡 "skip" 状态字的规范部分,或者如何处理超过 256 字节的答案。任何指针?

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

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

其实在你的log中并不清楚你的GET RESPONSE命令的Status Word是什么,如果是9000,那么一切都很好,不再讨论。在这种情况下,如果您重复 GET RESPONSE 命令,您可能会再次获得最新数据!

只是回答你的具体问题:

I can't found the part of the specification that allows the card to "skip" the status word

你可以忽略它!

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

or how to deal with answers longer than 256 bytes. Any pointer ?

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

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

我想通了:这是一个时机问题。

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

我应该强调我正在自己开发 reader 部分。