问题描述
我希望我的 java 卡小程序能够模拟我们组织中的旧版非 java 卡(本机操作系统)。以下是小程序的目标行为:
- 选择小程序 (A4) 并返回 0x61XX。
- 使用 GET RESPONSE (C0) 读取响应
协议是 T1。
我的示例 java 卡来自 NXP,与 JCRE 2.2.2 兼容。在我的代码中,
//dataLen 为 10 字节
if (selectingApplet()){ apdu.setoutgoing();
apdu.setoutgoingLength((short)dataLen);
apdu.sendBytesLong(data,(short)0,dataLen);
ISOException.throwIt((short)(ISO7816.SW_BYTES_REMAINING_00 + dataLen)
}
我将小程序加载到测试卡中。结果如下:
-
选择小程序 结果:0x610A
-
得到回应 结果:0x6982
这里有什么问题?如果使用 java 卡甚至可以做到这一点,那么实现这一目标的正确方法是什么?
解决方法
我认为这是不可能的。 T=0 和 T=1 之间的差异由 Java 卡框架处理。 GET RESPONSE 特定于 T=0。
这意味着使用 T=0 时会自动生成 61XX。当然,应该自动返回 SELECT 对 INSTALL 的响应 - 除非小程序抛出了一个生成状态字的异常,在这种情况下它可能会被忽略。
同样,我希望框架能在您对它做任何事情之前尽早捕捉到 GET RESPONSE。您唯一可以尝试的是自己处理 GET RESPONSE 并希望操作系统传递 APDU。
但我认为最好的方法是将芯片配置为使用 T=0。然后 ISO case 4 命令(响应和命令数据)应该自动使用 GET RESPONSE。