Select Java 卡片小程序和 return 0x61XX 而不是 0x9000
Select Java Card Applet and return 0x61XX rather than 0x9000
我希望我的 java 卡片小程序能够在我们的组织中模拟我们遗留的非 java 卡片(原生 OS)。以下是小程序的目标行为:
- Select 小程序 (A4) 和 return 0x61XX.
- 使用 GET RESPONSE (C0) 读取响应
协议是 T1。
我的示例 java 卡来自与 JCRE 2.2.2 兼容的 NXP。在我的代码中,
//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)
}
我将我的小程序加载到测试卡中。以下是结果:
Select小程序
结果:0x610A
获取回复
结果:0x6982
这里有什么问题吗?如果 java 卡甚至可以做到这一点,正确的方法是什么?
我认为这是不可能的。 T=0 和 T=1 之间的差异由 Java 卡片框架处理。 GET RESPONSE 特定于 T=0.
也就是说61XX会在使用T=0时自动生成。当然,SELECT 对 INSTALL 的响应应该自动返回——除非小程序抛出一个生成状态字的异常,在这种情况下它可能会被忽略。
同样,我希望框架能够在您可以对其进行任何操作之前尽早捕获 GET RESPONSE。您唯一可以尝试的是自己处理 GET RESPONSE,并希望 OS 传递 APDU。
但我认为最好的方法是将芯片配置为使用 T=0。然后 ISO case 4 命令(响应和命令数据)应该自动使用 GET RESPONSE。
我希望我的 java 卡片小程序能够在我们的组织中模拟我们遗留的非 java 卡片(原生 OS)。以下是小程序的目标行为:
- Select 小程序 (A4) 和 return 0x61XX.
- 使用 GET RESPONSE (C0) 读取响应
协议是 T1。
我的示例 java 卡来自与 JCRE 2.2.2 兼容的 NXP。在我的代码中,
//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)
}
我将我的小程序加载到测试卡中。以下是结果:
Select小程序 结果:0x610A
获取回复 结果:0x6982
这里有什么问题吗?如果 java 卡甚至可以做到这一点,正确的方法是什么?
我认为这是不可能的。 T=0 和 T=1 之间的差异由 Java 卡片框架处理。 GET RESPONSE 特定于 T=0.
也就是说61XX会在使用T=0时自动生成。当然,SELECT 对 INSTALL 的响应应该自动返回——除非小程序抛出一个生成状态字的异常,在这种情况下它可能会被忽略。
同样,我希望框架能够在您可以对其进行任何操作之前尽早捕获 GET RESPONSE。您唯一可以尝试的是自己处理 GET RESPONSE,并希望 OS 传递 APDU。
但我认为最好的方法是将芯片配置为使用 T=0。然后 ISO case 4 命令(响应和命令数据)应该自动使用 GET RESPONSE。