使用READ BINARY读取超过256个字节

问题描述 投票:8回答:5

我正在尝试使用javax.smartcardio读取智能卡(German Gesundheitskarte

在EF“ PD”的definition中,其长度指定为850字节。内容应为指定压缩后的ISO5589-15编码的XML字符串,格式为here

作为我发送的CommandAPDU

00 B0 00 00 00

获取前256个字节。发送后

00 B0 00 FF 00

我得到下一个256个字节。

但是我如何得到其余的?

我怎么知道二进制数据何时结束?

German Specification Part 1 |German Specification Part 2

java smartcard
5个回答
10
投票

READ BINARY APDU允许2字节用于文件偏移,用P1和P2编码,并使用Le表示长度,对于READ BINARY响应中的字节数。 P1是高字节或最高有效字节。但是,保留P1的最高位以指示P1是否还包含短文件标识符。如果您已经在读取文件,它应该保持在0值,最大偏移量为32Ki-1。

我看不到您链接的规格,但假设卡上的READ BINARY APDU的工作方式相同。

您的读取前256个字节的命令似乎正确,注意Le==0x00表示已读取256个字节。

要读取以偏移量256、512等开头的字节,请开始递增P1,例如:

00 B0 01 00 00
00 B0 02 00 00
00 B0 03 00 00

要读取从偏移量257(0x101)开始的256个字节:

00 B0 01 01 00

偏移600(0x258):

00 B0 02 58 00

在您的代码中,如果您使用Java int存储偏移量,通常会以如下所示结束P1的递增:

int offset;
int P1, P2;

while (continueReading)
{
    // ...
    P1 = (offset >> 8) & 0xFF;
    P2 = offset & 0x00FF;
    // ...
    // send APDU
}

如何指示文件的大小取决于实现方式。通常,您可以从EF(00 A4 00 00 02 fileId)上的SELECT返回的文件控制信息(FCI)结构中获取文件大小。但是,文件的大小也可以嵌入文件的内容中。如果可能的话,您不应依靠状态字来告诉您文件的大小。


添加:Le,Ne和奇数INS

重要的是,只增加响应数据(RDATA)中maximum大小。您收到的可能少于该数。如果文件大小为32Ki或更大,则需要使用READ BINARY和奇数INS(B7)来读取高于32Ki的数据。在这种情况下,RDATA也可能包含开销。显然,反过来可能会影响偏移量计算以及要读取到文件末尾的计算。


5
投票
偏移量位于P1P2中,尽管最高位用于指示您要选择具有给定SFI的内容。因此,您也可以将P1用于字节。之后,您将必须移至READ BINARY with an odd INSB1)。

1
投票
对IMO的Maarten Bodewes做出的非常有益的回答是关于读取较大的文件,还有stajo建议使用扩展的Le。我希望这可以节省其他人的时间和精力。

0
投票
如果卡支持,您可能可以使用扩展长度格式。如果在lc / le字段中指定00,则可以使用以下两个字节作为长度

0
投票
我尝试上述示例读取护照的DG2文件,但最后,我无法获取图像文件。这是我在科特林所做的事情:
© www.soinside.com 2019 - 2024. All rights reserved.