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

标签 java smartcard

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

definition EF“PD”的长度指定为 850 字节。内容应该是 gzipped 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

最佳答案

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 上的 SELECT 返回的文件控制信息 (FCI) 结构中获取文件大小 (00 A4 00 00 02 fileId)。然而,文件的大小也可以嵌入到文件的内容中。如果可能,您不应依赖状态字来告诉您文件的大小。


加法:Le、Ne 和奇 INS

重要的是,您只能根据响应数据 (RDATA) 中实际接收 的字节数来增加偏移量。请注意,如果 P3 = Le,则 Le 对 Ne 进行编码,这是响应数据的最大 大小。您收到的可能少于此数。

如果文件大小为 32Ki 或更大,则需要使用 READ BINARY with odd INS (B7) 读取大于 32Ki 的数据。在那种情况下,RDATA 也可能包含开销。显然,这反过来可能会影响偏移量计算和读取到文件末尾的计算。

关于java - 使用 READ BINARY 读取超过 256 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11297880/

相关文章:

java - 如何在 Java 中与智能卡交互?

windows - 如何在Windows 8中正确使用SCardGetStatusChange?

C#智能卡编程

java - 尝试从 pdf 中提取字形 ID 时缺少一些字形 ID

java - 如何获取 HTTP 请求数据?

java - 如何在一行中将字符串数组转换为 double 组

java - Java Web 应用程序可以访问远程工作站上的智能卡读卡器吗?

java - 将 Web 应用程序与 DSC 卡集成

java - 如何获取Mysql数据库中的所有行(Java)

java - 如何使用 facebook 登录并获取用户信息以从 android 应用程序发送我的远程数据库