我正在使用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。
或者你可以通过一个稍微增强的协议来解决它,然后你应该重写应用程序来支持它(如果应用程序是你的(,它可能不再是标准的了!