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

lxg*_*xgr 5 javacard globalplatform

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

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

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

voj*_*jta 5

不,这是不可能的.

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

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

然而!

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

此外,您可以使用主动命令发送OTA命令并远程安装新的applet实例.几年前,我用一对非常简单的小程序和一张测试SIM卡试用了它,它起作用了.

从理论上讲,有可能实现一个Java Card小程序,只要你拥有所有必要的密钥,它就会在移动网络上传播.然而,这与Java Card quine密切相关,据我所知,这仍未解决.


Maa*_*wes 5

从理论上讲,这可能适用于普通的Java卡,因为:

  • 您可以安装具有安全域权限的applet(对此支持是可选的);
  • 安全域可以选择执行INSTALL [for Load](支持这是可选的);
  • 在调用安全域功能(使用SecureChannel.processSecurity)之前,applet可以接收和更改APDU缓冲区- 因为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).