安全最大Java卡APDU数据命令和响应大小

时间:2015-10-07 14:27:36

标签: javacard apdu

Java Card APDU中推荐的数据字段大小是多少?从Zhiqun Chen的Java Card Technology for Smart Cards: Architecture and Programmer's Guide一书中,它提到Le字段最多允许255个。

我们是否将其解释为以下APDU命令:

|<----------------------- 255 Bytes total ------------------------>|
|<- CLA -><- INS -><- P1 -><- P2 -><- Lc -><---- DATA ----><- Le ->|

因此,如果CLA,INS,P1,P2,Lc,Le各为1个字节,我们应该假设我们只能安全地将249个字节设置到DATA区域?

对于APDU响应,我们要解释:

|<----------------------- 258 Bytes total ------------------------>|
|<-------------------------- DATA ------------------------><- SW ->|

响应数据可以安全地设置为256字节,2个字节的SW,响应总数由数据响应和SW组成258字节?

考虑到我们必须面对链接可能无法实现并且我们必须自己手动处理数据流的情况,以块的形式安全地发送和接收数据还有哪些其他考虑因素?

3 个答案:

答案 0 :(得分:7)

AFAIK Le字段允许1-256个字节(255个限制用于Lc)引用 ISO 7816-3

  

情况2S⎯短Le字段由C(5)编码Ne从1到   256(&#39; 00&#39;表示最大值,256)....
  ....
  案例4S⎯......短Le   字段由C(6 + Nc)编码Ne组成,从1到256(&#39;&#39;表示   最大,256)....

(它符合你的#34;响应APDU&#34;长度为256 + 2,也许只是一个错字)

255字节限制用于&#34;命令APDU&#34;的DATA部分。所以对于整个非扩展长度&#34;命令APDU&#34;限制应为5+255+1

所有这些限制都在 ISO 7816-3 中精确定义 - 请看这里。

请注意,javacard的APDU缓冲区可能更小。来自APDU类的javadoc:

  

缓冲区长度(意味着APDU缓冲区)必须至少为133个字节(5个字节的标头和   128字节的数据)

因此,要读取长度超过128个字节的传入数据,您可能需要调用APDU.receiveBytes()来获取其他不适合的字节。

可能适用于发送数据(例如,APDU.sendBytes() 可能需要发送更长的数据。

对于应用程序级别的框架,我知道这些方法(可能是鼓舞人心的):

  • ISO 7816-4(使用CLA中的第5位)

  • 全球平台(使用P1的最高位指示某些命令的更多块/最后一个块)

  • EMV CPS(使用数据内部显式长度的STORE DATA命令)

答案 1 :(得分:1)

Lc和Le字节可以发信号通知保持/请求高达0xFF字节。因此,对于案例4命令APDU,您有6(头+ lc + le)+ 0xFF = 261字节。对于最大响应,您有256个字节+ 2(状态字)= 258个字节。这就是标准所暗示的。但是,不同的硬件令牌可能具有不同的实现,因此这可能不是100%准确。如果您需要更多数据,则需要实现ExtendedLength。

答案 2 :(得分:0)

Lc 和 Le 字段对最大数据大小 Nc 和 Ne 进行编码。对于正常长度的 APDU,其中 Lc 和 Le 字段各为 1 个字节,Nc 最大为 256(Lc = 00h,特殊情况),而 Ne 最大为 255(Le = FFh)。 Nc 不包括 4 字节头,Lc 编码或 Le 编码。 Ne 指定的大小不包括 2 字节(16 位)状态字。


当然可以为特定命令发送更多数据。如果卡支持,您可以使用扩展长度。详情请参阅 ISO/IEC 7816-4。

扩展长度使用 16 位有效 Lc 和 Le 大小。它可以支持高达 64KiB 的 Nc(有效部分为 0000h)和 64KiB - 1 的 Ne(Le 的有效部分 = FFFFh)。但是,由于使用了带符号的short,Java Card 在使用扩展长度时被限制为 Nc = 32KiB - 1 和 Ne = 32KiB - 1。通常,在此之前很久您就会耗尽缓冲区空间,这取决于卡的实现如何处理。扩展长度也会增加头部、Lc 和 Le 开销。

命令链比较棘手,因为您必须自己实现它。它基本上多次发送相同的命令,使用 CLA 字节中的链接位来指示将有更多命令,直到该位重置为零。


当然,您可以自己使用命令执行任何操作。所以你可以例如定义一个文件并使用多个 WRITE BINARY 命令写入该文件。如何定义这些命令完全取决于您。


当使用安全消息传递时,我不会讨论最大尺寸。它可以进行一些非常有趣的计算,尤其是在使用 BER 编码来实现安全消息传递时。