如何验证小程序是否已安装在 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,意思是“文件已经存在”。
我正在编写一个程序,可以在将卡插入 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,意思是“文件已经存在”。