smartcard - 从 javacard 小程序读取大文件

标签 smartcard javacard

我正在编写一个小程序,它存储 3 个不同大小的文件:5 Kb、7 Kb 和 11 Kb。我在小程序中存储文件没有任何问题。但是当我尝试读回它们时,我只能读取前两个(较小的文件)。 第三个文件抛出异常:

javax.smartcardio.CardException: Could not obtain response
at sun.security.smartcardio.ChannelImpl.doTransmit(Unknown Source)
at sun.security.smartcardio.ChannelImpl.transmit(Unknown Source)

我试图找出问题所在,发现它与文件的大小有关。因此,我创建了一个大小为 7 Kb 的测试文件,并一点一点地递增该文件。 它一直工作到我达到 7905 字节。这意味着 7905 字节是我可以从小程序读取的最大字节数。 我使用示例代码链接响应:

public void readFile(APDU apdu, short[] offset, short selectedFile, short MAX_APDU_SEN,       byte OFFSET_SENT) {
    byte[] file = getFile(selectedFile); 
    if (file == null) {
    + ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND);+
    }
    // work out how many bytes to send this time and how many will be left
    short remain = (short) (file.length - offset[OFFSET_SENT]);
    boolean chain = remain > MAX_APDU_SEN;
    short sendLen = chain ? MAX_APDU_SEN : remain;
    apdu.setOutgoing();
    apdu.setOutgoingLength(sendLen);
    apdu.sendBytesLong(file, offset[OFFSET_SENT], sendLen);
    // Check to see if there are more APDU's to send
    if (chain) {
    +offset[OFFSET_SENT] = sendLen; // count the bytes sent
    ISOException.throwIt(ISO7816.SW_BYTES_REMAINING_00); // indicate there are more bytes     to come
    } else {+
    offset[OFFSET_SENT] = 0; // no more bytes to send
    }
}

我尝试了两种不同类型的卡,即 JC 2.2.1 (36Kb) 和 JC 2.2.2 (80Kb) 兼容卡,但它们的行为都是相同的。

请问有什么帮助吗?

最佳答案

读取文件通常不使用链接来完成,因为主机应用程序可以方便地指定 P1/P2 中的起始偏移量 - 至少在 ISO 7816-4 中指定的 READ BINARY 命令中如此。我认为,即使对于链式响应,卡也希望在缓冲区中准备数据,我认为缓冲区的大小有限是导致问题的原因。

关于smartcard - 从 javacard 小程序读取大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15645679/

相关文章:

.net - 清除 PIN 缓存智能卡

Java Card 中的内存和大容量存储能力

javacard - 被操纵的 CAP 文件是否会在安装过程中破坏 Java 卡?

java - APDU读文件java卡程序

java - 如何从自定义 Java 桌面应用程序启动 NXP 产品 JCOPShell (jcshell.bat)

c# - 如何提取 X509 证书智能卡

smartcard - 在javacard中安装applet

C#智能卡编程

c# - 从 Mastercard/VISA 借记卡/信用卡读取 EMV 数据

java - 是否可以为java卡编写驱动程序