【问题标题】:How to verify if an applet is already installed on a Java Card如何验证小程序是否已安装在 Java 卡上
【发布时间】:2021-10-25 13:22:13
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • ,.请注意,您只能安装/实例化具有相同 AID 的小程序一次。将包裹加载到卡上也是如此。所以你应该做的第一件事是检查包含小程序的包是否已经上传到卡片中。
  • @jlanza 谢谢,但是我应该如何使用包 java.smartcardio 呢?
  • @salomon_diei 从 cmets 到下面的答案,您正在使用 GlobalPlatformPro。如果你上传一个已经加载的包,你会得到一个错误。所以你必须这样做,要么使用 java.smartcario 实现整个上传过程,要么使用 GPPro 库或解析 GPPro 输出。此外,您始终可以列出存储在卡中的内容,并查看是否安装了匹配的 AID(包、小程序和实例)
  • @jlanza 如何在我的代码中实现和使用 GPPro 库?我是 java 新手,所以我不知道如何使用外部库。

标签: java applet smartcard javacard globalplatform


【解决方案1】:

每个小程序都有一个唯一的 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,意思是“文件已经存在”。

【讨论】:

  • 你能告诉我如何实现它吗?我更新了我的问题
  • 我实现了代码,我使用getSw()方法得到的响应状态SW在安装小程序时总是27270而不是9000,当已经安装小程序时是6A89
  • 为了在卡上安装小程序,我使用的是 gp.exe。有没有办法直接在我的java代码中安装它?
  • GPPro 还提供了一个库,我猜它可以直接在你的代码中使用。
  • 6a82 表示“找不到文件”-这表示找不到文件,即未安装小程序。
猜你喜欢
  • 2012-01-27
  • 2021-04-20
  • 2012-04-02
  • 2022-11-03
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多