Java Card:applet可以由其他applet安装吗?

时间:2016-11-24 20:52:32

标签: javacard globalplatform

在Java Card中,通常可以从卡上现有应用程序的上下文中安装新应用程序,例如通过应用程序定义的消息传递格式发送新代码,然后创建新的应用程序实例使用一些卡管理器API?

或者这只能在外部使用相应的APDU吗?

如果这是Java Card和/或GlobalPlatform规范未涵盖的内容,是否可以使用特定于供应商的方法来完成?

2 个答案:

答案 0 :(得分:5)

不,这是不可能的。

您无法将applet中的APDU发送到Card Manager小程序,这是安装新小程序所需的内容。卡管理器也不为此任务提供任何Shareable接口(通常)。

唯一的方法是通过终端发送APDU,但这不是你想要的。这种方式很简单:您的applet需要保存新安装的applet的完整二进制文件和Card Manager的密钥。

<强>然而!

您可以使用所谓的主动命令通过SIM卡上的其他小程序安装小程序,请参阅this SO answer。如果设备允许,您可以从第一个SIM插槽向第二个SIM插槽发送PERFORM CARD APDU命令,并以这种方式安装新的applet。然后你可以在SIM2上使用这个新applet在SIM1上安装另一个applet。

此外,您可以使用主动命令发送OTA命令并远程安装新的applet实例 。几年前我用一对非常简单的applet和一张测试SIM卡试过这个,但它确实有效。

理论上,有可能实现一个Java Card小程序,只要你拥有所有必要的密钥,它就会在移动网络上传播。但是,这与Java Card quine密切相关,据我所知,这个问题尚未解决。

答案 1 :(得分:5)

理论上,对于普通的Java卡,这可能是可能的,因为:

  • 您可以安装具有安全域权限的applet(对此支持是可选的);
  • 安全域可以选择执行INSTALL [for Load](支持此选项);
  • applet可以在调用安全域功能之前接收和更改APDU缓冲区(使用SecureChannel.processSecurity) - 因为processSecurity本身应该根据规范检索命令数据,这样你就不太可能首先想一想;
  • 假设该卡处于GP_SECURE模式,小程序可以访问重新计算MAC的密钥(这些密钥对Applet本身是隐藏的)。

在这种情况下,您可以将自己的APDU转换为符合GP规范的特定APDU,只需致电SecureChannel.processSecurity即可对其进行处理。

实际上,我不认为上面会出现这种情况,但你永远不会知道。您明确地讨论了为卡实现定义的安全协议,因此我非常确定任何审核该解决方案的人都会被问到非常明确的问题

现在,如果您只想通过自己的安全域安装applet,那么Global Platform将明确涵盖这一点。如果支持安全域和INSTALL [for Load],那么您只需检查产品的手册,然后就可以了。

正如vojta已经指出的那样,没有用于移交INSTALL [for Load]命令的API,因此以编程方式你将被卡住。

一种令人难以置信的愚蠢方法是编写自己的VM并将其安装为applet。在99.999%的案例中可能不实用。当然,它仍然只能作为VM本身访问,它不会被卡给出自己的应用程序ID(AID)。