我想从卡向主机发送长响应(1000多个字节)。读者只有T = 0。我有几个问题想知道是否有人知道:
祝一切顺利!
Johnny
答案 0 :(得分:4)
我的理解是ExtendedLength仅适用于T = 1,对吗?
那是不对的。无论如何,ISO / IEC 7816-4中未指定此类限制。但是,该卡应在ATR / EF.ATR中指示支持扩展长度。读者可能不只是假定存在扩展长度(如果您仍然是唯一处理应用程序的人,则可以忽略此长度。)
如果是这样,是否有最佳实践来在T = 0上发送长响应?
存在很多扩展长度的问题,并不是所有的读者都支持它,Global Platform不支持它(我尚未检查过最新版本),Java Card仅支持最大32Ki-1字节。默认情况下,Android在最新版本中仅默认启用扩展长度支持,但是您最好期望启用NFC的手机无法正确处理它。 ISO / IEC 7816-4超出了扩展长度规范,尤其是在更高版本(2015年以后)中。
不幸的是,您经常被限制使用命令链或仅通过执行多个READ BINARY命令。后者绝对是最不容易出错的方法-但它速度慢且文件结束处理可能很棘手。
一种可能的解决方案是按块发送数据,状态码为61xx。基本上,我将调用APDU.sendBytesLong,然后使用61xx引发异常以指示还有更多数据。但是,抛出异常以指示还有更多数据似乎很奇怪,即使这似乎符合标准。
这是命令链接解决方案,对。
是的,如果不抛出异常就不能指示警告,这是很愚蠢的。好发现。但是您可以通过引发异常来发送数据并生成状态字。最好保存状态字并在process
方法的末尾生成异常。
答案 1 :(得分:3)
1-扩展长度在T = 0时有效,如@Maarten在他的回答中所述。
2-我不知道任何最佳做法。但是您可以尝试按照下一个答案中的说明进行实施。
3-我部分同意这一点,您可以使用响应链来获取所有响应数据。好消息是,根据情况,您不需要在applet级别上实现不同的协议处理。我的建议是执行与T = 1中相同的处理,我想您只是调用APDU.sendBytesLong
。然后让平台像魔术一样完成其余的工作。
在我以前使用过的javacard平台中,这样做会导致以下行为:
假设您要发送get Data命令以检索1000字节的数据:
00 C0 00 00
加上所需的Le),直到返回的状态字为9000,这意味着将返回所有数据。请注意,61xx和“获取响应”命令的处理是在平台级别上进行的,您无需在小程序中执行任何操作。
您可以尝试一下,让我知道它是否有效。