首页 > 解决方案 > 如何验证小程序是否已安装在 Java 卡上

问题描述

我正在编写一个程序,一旦将卡插入读卡器,它就能够自动上传小程序。

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

这就是我认为我应该用来发送命令的东西:

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

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

标签: javaappletsmartcardjavacardglobalplatform

解决方案


每个小程序都有一个唯一的 AID(应用程序标识符)。您可以使用 GlobalPlatform GET STATUS 命令列出所有已安装的应用程序,但最简单的方法是只执行一个 SELECT 命令。如果安装了小程序,则 SELECT 命令将返回以 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,意思是“文件已经存在”。


推荐阅读