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 ->|
Run Code Online (Sandbox Code Playgroud)
因此,如果CLA,INS,P1,P2,Lc,Le各为1个字节,我们应该假设我们可以安全地只将249个字节设置到DATA区域?
对于APDU响应,我们要解释:
|<----------------------- 258 Bytes total ------------------------>|
|<-------------------------- DATA ------------------------><- SW ->|
Run Code Online (Sandbox Code Playgroud)
响应数据可以安全地设置为256字节,2个字节的SW和一个响应的总和包括数据响应和SW是258字节?
考虑到我们必须面对链接可能无法实现并且我们必须自己手动处理数据流的情况,还有哪些其他因素可以安全地发送和接收数据?
AFAIK Le
字段允许1-256字节(255限制用于Lc
)引用ISO 7816-3:
情况2S⎯短Le字段由C(5)编码Ne从1到256('00'表示最大值,256)....
....
案例4S⎯...短Le字段由C组成(6 + Nc)编码Ne从1到256('00'表示最大值,256)....
(它与你的"响应APDU"长度为256 + 2一致,也许只是一个错字)
255字节限制用于"命令APDU"的DATA部分.因此,对于整个非扩展长度"Command APDU",限制应该是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命令)
Lc 和 Le 字节可以发出信号以保持/请求最多 0xFF 字节。因此,对于情况 4 命令 APDU,您有 6(header+lc+le) + 0xFF = 261 字节。对于最大响应,您有 256 字节 + 2(状态字) = 258 字节。这就是标准的建议。然而,不同的硬件令牌可能有不同的实现,因此这可能不是 100% 准确。如果您需要更多数据,则需要实现 ExtendedLength。
归档时间: |
|
查看次数: |
1650 次 |
最近记录: |