如何验证小程序是否已安装在 Java 卡上

How to verify if an applet is already installed on a Java Card

我正在编写一个程序,可以在将卡插入 reader 后自动上传小程序。

我已经完成了这部分,我希望能够在尝试再次安装之前验证小程序是否已经安装在卡上。 我正在使用 javax.smartcardio

这就是我认为发送命令时应该使用的内容:

            Card card = terminal.connect("T=0");
            CardChannel channel = card.getBasicChannel();
            ResponseAPDU resp = channel
                                .transmit(new CommandAPDU());

但我不知道如何使用小程序的 AID 发送命令。 我的小程序的AID是01020304050607080900

每个小程序都有一个唯一的AID(应用程序标识符)。您可以使用 GlobalPlatform GET STATUS 命令列出所有已安装的应用程序,但最简单的方法是只执行 SELECT 命令。如果安装了小程序,SELECT 命令将 return 以 9000 作为状态字结尾的响应。 6a82 表示“未找到文件” - 这表示未找到文件,即未安装小程序。

命令是:

00A40404 <AID length> <your AID>
byte[] aid = {(byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08, (byte)0x09, (byte)0x00};
ResponseAPDU resp = channel
                                .transmit(new new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0xFF));
if (resp.sw == 0x9000) {
// applet is already installed
}

注意,如果小程序安装失败,只会安装包,小程序不会实例化,无法通过这种方式被检测到,但我假设您已经在安装过程中处理了这个问题。

另一种方法就是让安装发生,通常在安装过程中报告的错误是0x6A89,意思是“文件已经存在”。