我正在使用 T=0 协议中的卡片:
-
我向卡发送命令,请求对数据进行响应 .
-
我使用的小程序应该用数据 potentially more than 256 bytes 来回答,所以在命令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)
我必须重复发送GET RESPONSE,P3 = 00(256),读取256个字节并且没有状态字,直到卡警告我实际上读取的字节少于256个字节 .
我找不到规范中允许卡“跳过”状态字的部分,或者如何处理超过256字节的答案 . 任何指针?
2 回答
在T = 0协议中,不可能有超过256字节的数据 .
在您的情况下,它可能是您的应用程序的协议的错误(或误解),在检索256个字节后,它仍然发回61XX .
实际上,你的日志中不清楚你的GET RESPONSE命令的状态字是什么,如果它是9000,那么一切都很好,不再讨论 . 在这种情况下,如果您重复GET RESPONSE命令,您可能会再次获得最新数据!
只是回答您的具体问题:
你可以简单地忽略它!
我的意思是如果卡通知它有一些可用的数据(61 XX)并且您不发送任何GET RESPONSE命令但是另一个命令则数据将丢失 .
在协议T = 0中,这是不可能的 . 您最好使用协议T = 1或T = 15 .
或者你可以通过一些增强的协议以某种方式解决它,然后你应该重写应用程序以支持它(如果应用程序是你的),它可能不再是标准!
我想通了:这是一个 timing 问题 .
卡 do have 是一个要发送的状态字,但是我在读取操作之间的过程太长,所以当我请求它时,它在卡中不再可用 .
我应该强调我自己正在开发阅读器部分 .