选择 Java Card Applet 并返回 0x61XX 而不是 0x9000

问题描述

我希望我的 java 卡小程序能够模拟我们组织中的旧版非 java 卡(本机操作系统)。以下是小程序的目标行为:

  1. 选择小程序 (A4) 并返回 0x61XX。
  2. 使用 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)

}

我将小程序加载到测试卡中。结果如下:

  1. 选择小程序 结果:0x610A

  2. 得到回应 结果: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。