我正在尝试使用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个字节。
但是我如何得到其余的?
我怎么知道二进制数据何时结束?
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也可能包含开销。显然,反过来可能会影响偏移量计算以及要读取到文件末尾的计算。
P1
和P2
中,尽管最高位用于指示您要选择具有给定SFI的内容。因此,您也可以将P1
用于字节。之后,您将必须移至READ BINARY with an odd INS
(B1
)。