Java卡:在T = 0时发送长响应

时间:2018-11-08 04:53:55

标签: smartcard javacard apdu

我想从卡向主机发送长响应(1000多个字节)。读者只有T = 0。我有几个问题想知道是否有人知道:

  1. 我的理解是ExtendedLength仅适用于T = 1,对吗?
  2. 如果是这样,是否有最佳实践在T = 0上发送长响应?
  3. 一种潜在的解决方案是按块发送数据,状态码为61xx。基本上,我将调用APDU.sendBytesLong,然后使用61xx引发异常以指示还有更多数据。但是,抛出异常以指示还有更多数据似乎很奇怪,即使这似乎符合标准

祝一切顺利!

Johnny

2 个答案:

答案 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字节的数据:

  • 发送获取数据,它将返回256个字节的数据,后跟61xx
  • 根据需要发送获取响应APDU(00 C0 00 00加上所需的Le),直到返回的状态字为9000,这意味着将返回所有数据。

请注意,61xx和“获取响应”命令的处理是在平台级别上进行的,您无需在小程序中执行任何操作。

您可以尝试一下,让我知道它是否有效。