【发布时间】:2022-08-17 12:42:39
【问题描述】:
我有一个小程序(取自 this HelloSTK2 repo)我已经编译并安装在 SysmoISIM-SJA2 卡上,并且我稍微修改了它以响应 SELECT APDU。修改如下所示:
public void process(APDU arg0) throws ISOException {
showHello();
}
private void showHello() {
ProactiveHandler proHdlr = ProactiveHandler.getTheHandler();
proHdlr.initDisplayText((byte)0, DCS_8_BIT_DATA, welcomeMsg, (short)0,
(short)(welcomeMsg.length));
proHdlr.send();
return;
}
我所做的只是将现有的showHello() 函数移到处理 APDU 的函数中。我从 Javacard 文档中了解到,process() 函数应该运行,然后返回状态字 9000,或错误代码(如果适用)。
对于SELECT 文件,我编写了一个使用iccOpenLogicalChannel 并将AID 作为参数的Android 应用程序。使用 GlobalPlatformPro 我可以看到小程序已正确安装在 UICC 上,并且它被列为 SELECTABLE,但是当我运行我的 Android 应用程序时,我得到一个 STATUS_NO_SUCH_ELEMENT 响应,根据 iccOpenLogicalChannelResponse source 表示 AID 不是在 UICC 上找到。
Android 应用程序的代码非常简单,如下所示:
val inputView: EditText = findViewById<EditText>(R.id.AID_INPUT)
val input: String = inputView.text.toString()
val ch = mTelephonyManager.iccOpenLogicalChannel(input)
Toast.makeText(this, ch.toString(), Toast.LENGTH_LONG).show()
mTelephonyManager.iccCloseLogicalChannel(ch.channel)
在卡片上列出小程序的输出如下所示(截断):
AID: d07002ca44, State: 01, Privs: 00
Instance AID: d07002ca44900102
我已经尝试过 d07002ca44 和 d07002ca44900102 并且对两种 AID 都得到了相同的响应。
那么我的问题是:我需要采取哪些步骤来确保我的 Android 应用程序能够选择这个小程序?
值得注意的是,我的 Android 应用程序确实具有运营商权限,并且我能够将 APDU 发送到其他应用程序,例如 USIM 和 ISIM 小程序。
-
我希望逻辑通道而不是 AID 可用。我做了一个非常简短的检查,似乎它们对于 SIM 卡也是可选的。您可以简单地使用基本频道,但它会在没有任何特定命令(例如
iccOpenLogicalChannel)的情况下打开。 -
我认为可能是这种情况,但错误消息确实明确指出无法找到 UICC,并且我假设如果只是通道无法找到我会收到 STATUS_MISSING_RESOURCE 错误打开。不过,我会尝试使用基本频道并报告。谢谢!